首页> 中国专利> 一种适用于串口设备的驱动程序及其工作方法

一种适用于串口设备的驱动程序及其工作方法

摘要

本发明公开了一种适用于串口设备的驱动程序及其工作方法,通过在主机上使用基于UMDF的驱动程序,将串口设备与系统的PC/SC接口挂接,使得主机中的应用程序能够方便地通过PC/SC接口使用串口设备,不需要对应用程序做任何改动,提高了应用程序的重用性。

著录项

  • 公开/公告号CN104484292A

    专利类型发明专利

  • 公开/公告日2015-04-01

    原文格式PDF

  • 申请/专利权人 飞天诚信科技股份有限公司;

    申请/专利号CN201410840549.1

  • 发明设计人 陆舟;于华章;

    申请日2014-12-30

  • 分类号G06F13/10(20060101);

  • 代理机构

  • 代理人

  • 地址 100085 北京市海淀区学清路9号汇智大厦B楼17层

  • 入库时间 2023-12-17 04:27:34

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-08-11

    授权

    授权

  • 2015-04-29

    实质审查的生效 IPC(主分类):G06F13/10 申请日:20141230

    实质审查的生效

  • 2015-04-01

    公开

    公开

说明书

技术领域

本发明涉及通信技术领域,特别涉及一种适用于串口设备的驱动程序及其 工作方法。

背景技术

串口设备是指能够与主机进行串行通信的外部设备,串行通信可使用一条 数据线,将数据按位依次传输,每一位数据占据一个固定的时间长度,适用于 主机与外部设备之间的远距离通信。常用的串口设备有外置调制解调器、绘图 仪、串行打印机和蓝牙适配器等。

现有技术中,为使用与主机连接的串口设备,通常需要对主机中的应用程 序进行重写,导致应用程序的重用性较差,无法在应用层方便地使用串口设备。

发明内容

本发明提供了一种适用于串口设备的驱动程序及其工作方法,以解决无法 在应用层方便地使用串口设备的缺陷。

本发明提供了一种适用于串口设备的驱动程序的工作方法,应用于包括主 机和串口设备的系统中,所述主机与所述串口设备连接,所述主机中安装有系 统、应用程序和驱动程序,当所述应用程序调用所述系统的个人计算机/智能卡 PC/SC接口后,所述驱动程序中的预设函数被所述系统调用,所述方法包括以 下步骤:

S1、所述驱动程序等待被调用;

S2、当所述驱动程序中的预设函数被系统调用时,所述驱动程序通过组件 对象模型COM接口获取来自系统的控制码,对所述控制码进行判断,如果所述 控制码为预设控制码,则执行步骤S3;如果所述控制码不是预设控制码,根据 所述控制码执行相应的操作,并返回步骤S1;

S3、所述驱动程序根据所述预设控制码,组织对应的第一串口数据,通过 串口将所述第一串口数据发送给串口设备;

S4、所述驱动程序监听到已读事件后,从处理缓冲区中读取第二应用数据, 将所述第二应用数据发送给系统,并返回步骤S1;

所述步骤S4之前,还包括:

A1、所述驱动程序监听串口事件,在监听到数据事件后,接收来自所述串 口设备的第二串口数据;

A2、所述驱动程序将所述第二串口数据存储到接收缓冲区,对所述第二串 口数据进行处理,将处理得到的所述第二应用数据写入到所述处理缓冲区中, 并设置所述已读事件。

本发明还提供了一种适用于串口设备的驱动程序,应用于包括主机和串口 设备的系统中,所述主机与所述串口设备连接,所述主机中安装有系统、应用 程序和驱动程序,当所述应用程序调用所述系统的个人计算机/智能卡PC/SC接 口后,所述驱动程序中的预设函数被所述系统调用,所述驱动程序包括:

第一获取模块,用于在所述驱动程序中的预设函数被系统调用时,通过组 件对象模型COM接口获取来自系统的控制码;

第一判断模块,用于对所述第一获取模块获取到的所述控制码进行判断;

第一处理模块,用于在所述第一判断模块判断出所述控制码为预设控制码 时,根据所述预设控制码,组织对应的第一串口数据,通过串口将所述第一串 口数据发送给串口设备;

第一监听模块,用于监听已读事件;

第二处理模块,用于在所述第一监听模块监听到已读事件后,从处理缓冲 区中读取第二应用数据,将所述第二应用数据发送给系统;

第二监听模块,用于监听串口事件;

第一接收模块,用在所述第二监听模块监听到数据事件后,接收来自所述 串口设备的第二串口数据;

第三处理模块,用于将所述第一接收模块接收到的所述第二串口数据存储 到接收缓冲区,对所述第二串口数据进行处理,将处理得到的所述第二应用数 据写入到所述处理缓冲区中,并设置所述已读事件。

本发明达到的有益效果:通过在主机上使用基于UMDF(User-Mode Driver  Framework,用户模式驱动框架)的驱动程序,将串口设备与系统的PC/SC接口 挂接,使得主机中的应用程序能够方便地通过PC/SC接口使用串口设备,不需 要对应用程序做任何改动,提高了应用程序的重用性。

附图说明

图1为本发明实施例中的一种适用于串口设备的驱动程序所在的系统架构 示意图;

图2和图3为本发明实施例中的一种适用于串口设备的驱动程序的工作方 法流程图;

图4为本发明实施例中的一种适用于串口设备的驱动程序的串口监听线程 的工作流程图;

图5为本发明实施例中的一种适用于串口设备的驱动程序的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清 楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是 全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造 性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供了一种适用于串口设备的驱动程序的工作方法,应用于 包括串口设备和主机的系统中,串口设备与主机连接,如图1所示,主机中包 含应用程序、系统和驱动程序,该驱动程序为基于UMDF的驱动程序。串口设 备打开后,主机中的系统加载驱动程序,打开串口;驱动程序被系统加载后, 向系统申请创建IO队列,该IO队列由系统维护。驱动程序通过对输入缓冲区 进行读操作,获取来自系统的数据;通过对输出缓冲区进行写操作,向系统返 回数据。

主机中的应用程序调用系统的PC/SC(Personal Computer/Smart Card,个人 计算机/智能卡)接口后,系统将IO消息传递给IO队列;当IO消息到达IO队 列后,系统调用驱动程序中的预设函数,处理该IO消息。上述驱动程序的工作 方法,如图2和图3所示,包括以下步骤:

步骤101,驱动程序等待被调用。

步骤102,当驱动程序中的预设函数被系统调用时,驱动程序获取来自系统 的控制码和IO请求。

具体地,当驱动程序中的预设函数被系统调用时,驱动程序通过COM (Component Object Model,组件对象模型)接口获取内核驱动转发的控制码和 IO请求。其中,预设函数为ProcessIoControl函数,内核驱动为WDF(Windows  Driver Foundation,视窗驱动基础构架)。

步骤103,驱动程序对获取到的控制码进行判断,如果是属性获取请求,则 执行步骤104;如果是属性设置请求,则执行步骤113;如果是状态获取请求, 则执行步骤117;如果是卡片上电请求,则执行步骤118;如果是插卡判断请求, 则执行步骤122;如果是拔卡判断请求,则执行步骤126;如果是指令发送请求, 则执行步骤130。

步骤104,驱动程序对获取到的IO请求进行转换,得到请求码。

步骤105,驱动程序对请求码进行判断,如果是厂商名获取请求,则执行步 骤106;如果是IFD(Interface Device,接口设备)类型获取请求,则执行步骤 107;如果是设备单元获取请求,则执行步骤108;如果是特征描述获取请求, 则执行步骤109;如果是协议类型获取请求,则执行步骤110;如果是ATR(Answer  To Reset,复位应答)字符串获取请求,则执行步骤111;如果是其他,则执行 步骤112。

步骤106,驱动程序将自身保存的厂商名写入到输出缓冲区,并返回步骤 101。

例如,驱动程序将自身保存的厂商名“Feitian”写入到输出缓冲区。

步骤107,驱动程序将自身保存的IFD类型信息写入到输出缓冲区,并返回 步骤101。

例如,驱动程序将自身保存的IFD类型信息“bR301Smartcard reader”写入 到输出缓冲区。

步骤108,驱动程序将自身保存的设备单元写入到输出缓冲区,并返回步骤 101。

例如,驱动程序将自身保存的设备单元“0”写入到输出缓冲区。

步骤109,驱动程序将自身保存的特征描述信息写入到输出缓冲区,并返回 步骤101。

例如,驱动程序将自身保存的特征描述信息“0”写入到输出缓冲区。

步骤110,驱动程序将自身保存的当前协议类型信息写入到输出缓冲区,并 返回步骤101。

其中,当前协议类型信息是由驱动程序对来自串口设备的ATR字符串进行 解析得到的。

例如,驱动程序将自身保存的当前协议类型信息“SCARD_PROTOCOL_T0” 写入到输出缓冲区。

步骤111,驱动程序将自身保存的ATR字符串写入到输出缓冲区,并返回 步骤101。

例如,驱动程序将自身保存的ATR字符串“3F FA A6 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 31 23”写入到输出缓冲区。

步骤112,驱动程序将错误码写入到输出缓冲区,并返回步骤101。

例如,驱动程序将错误码“ERROR_NOT_SUPPORTED”写入到输出缓冲 区。

步骤113,驱动程序从输入缓冲区中读取属性信息,对属性信息进行组织, 得到第一串口数据,通过串口将第一串口数据发送给串口设备,将串口状态置 为初始状态,将已接收数据长度置为零,在监听到已读事件后,从处理缓冲区 中读取第二应用数据作为串口设备返回的设置响应。

具体地,驱动程序对第一包头和属性信息进行组合,得到第一串口数据。 其中,属性信息包括一组或多组属性列表,每组属性列表包括属性ID和属性值。

步骤114,驱动程序根据设置响应判断是否设置成功,如果是,则执行步骤 115;否则,执行步骤116。

步骤115,驱动程序将设置响应写入到输出缓冲区,根据属性信息更新自身 保存的属性数据,并返回步骤101。

其中,属性数据包括厂商名、IFD类型信息、设备单元、特征描述信息和当 前协议类型信息中一项或多项。

步骤116,驱动程序将设置响应写入到输出缓冲区,并返回步骤101。

例如,驱动程序将设置响应“ERROR_NOT_SUPPORTED”写入到输出缓 冲区。

步骤117,驱动程序读取卡片状态信息,将卡片状态信息写入到输出缓冲区, 并返回步骤101。

例如,驱动程序读取卡片状态信息“SCARD_ABSENT”,将卡片状态信息 “SCARD_ABSENT”写入到输出缓冲区。

步骤118,驱动程序组织上电指令,通过串口将上电指令发送给串口设备, 将串口状态置为初始状态,将已接收数据长度置为零,在监听到已读事件后, 读取处理缓冲区中的第二应用数据,将第二应用数据作为串口设备返回的ATR 字符串进行保存。

例如,驱动程序向串口设备发送上电指令“0x62 00 00 00 00 00”,接收串口 设备返回的ATR字符串“3F FA A6 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 3123”。

步骤119,驱动程序根据ATR字符串判断是否上电成功,如果是,则执行 步骤120;否则,执行步骤121。

步骤120,驱动程序将ATR字符串写入到输出缓冲区,并返回步骤101。

例如,驱动程序将ATR字符串“3F FA A6 00 00 81 31 FE 454A 43 4F 50 34 31 56 32 32 31 23”写入到输出缓冲区。

步骤121,驱动程序将上电失败信息写入到输出缓冲区,并返回步骤101。

例如,驱动程序将上电失败信息“SCARD_ABSENT”写入到输出缓冲区。

步骤122,驱动程序读取卡片状态信息。

例如,驱动程序读取卡片状态信息“SCARD_PRESENT”。

步骤123,驱动程序根据卡片状态信息,判断串口设备中是否有卡,如果是, 则执行步骤124;否则,执行步骤125。

具体地,当卡片状态信息为“SCARD_PRESENT”时,驱动程序确定串口 设备中有卡;当卡片状态信息为“SCARD_ABSENT”时,驱动程序确定串口设 备中无卡。

步骤124,驱动程序将插卡信息写入到输出缓冲区,并返回步骤101。

例如,驱动程序将插卡信息“STATUS_SUCCESS”写入到输出缓冲区。

步骤125,驱动程序取消操作,并返回步骤101。

步骤126,驱动程序读取卡片状态信息。

例如,驱动程序读取卡片状态信息“SCARD_PRESENT”。

步骤127,驱动程序根据卡片状态信息,判断串口设备中是否有卡,如果是, 则执行步骤128;否则,执行步骤129。

具体地,当卡片状态信息为“SCARD_PRESENT”时,驱动程序确定串口 设备中有卡;当卡片状态信息为“SCARD_ABSENT”时,驱动程序确定串口设 备中无卡。

步骤128,驱动程序取消操作,并返回步骤101。

步骤129,驱动程序将拔卡信息写入到输出缓冲区,并返回步骤101。

例如,驱动程序将拔卡信息“STATUS_SUCCESS”写入到输出缓冲区。

步骤130,驱动程序从输入缓冲区中读取第一应用数据,对第一应用数据进 行组织,得到第一串口数据。

具体地,驱动程序从输入缓冲区中读取第一应用数据后,对第一包头和第 一应用数据进行组合,得到第一串口数据。其中,第一包头的长度为10个字节。

例如,驱动程序从输入缓冲区中读取到的第一应用数据为“00 B0 00 00 F0”, 第一包头为“6f 05 00 00 00 00 00 00 00 00”,组织得到的第一串口数据为“6f 05 00 00 00 00 00 00 00 00 00 B0 00 00 F0”。

步骤131,驱动程序通过串口将第一串口数据发送给串口设备,将串口状态 置为初始状态,将已接收数据长度置为零。

例如,驱动程序通过串口将串口数据“6f 05 00 00 00 00 00 00 00 00 00 B0 00 00F0”发送给串口设备。

步骤132,驱动程序监听到已读事件后,从处理缓冲区中读取第二应用数据, 将第二应用数据写入到输出缓冲区,并返回步骤101。

例如,驱动程序从处理缓冲区中读取并写入到输出缓冲区中的第二应用数 据为:

“00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD  DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF”。

需要说明的是,以上为驱动程序的主线程的工作流程。驱动程序还通过串 口监听线程接收并处理第二串口数据,如图4所示,包括以下步骤:

步骤201,驱动程序监听串口事件。

步骤202,当监听到数据事件后,驱动程序接收第二串口数据。

步骤203,驱动程序对串口状态进行判断,如果是初始状态,则执行步骤 204;如果是激活状态,则执行步骤212;如果是未激活状态,则执行步骤218。

步骤204,驱动程序对接收缓冲区进行初始化,将接收到的第二串口数据存 储到接收缓冲区。

例如,驱动程序接收并存储到接收缓冲区中的第二串口数据为:“80 f0 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A  2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84”。

步骤205,驱动程序从第二串口数据中获取有效数据长度,对有效数据长度 进行保存。

本实施例中,驱动程序将第二串口数据中第二字节、第三字节、第四字节 和第五字节的数据作为有效数据长度。

例如,第二串口数据为“80 f0 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08090A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 1718 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84”,驱动程序将第 二字节、第三字节、第四字节和第五字节的数据“f0 00 00 00”作为有效数据长 度。

步骤206,驱动程序判断第二串口数据中是否包含卡片插拔信息,如果是, 则执行步骤207;否则,执行步骤208。

具体地,驱动程序判断第二串口数据的最后两个字节的数据是否为卡片插 拔信息,如果是,则确定第二串口数据中包含卡片插拔信息;否则,确定第二 串口数据中不包含卡片插拔信息。其中,卡片插拔信息可以是插卡信息,也可 以是拔卡信息。

例如,插卡信息为“50 03”,拔卡信息为“50 02”,第二串口数据为:“80 f0 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84”,则驱动程序可确定第二串口数据中不包含卡片 插拔信息。

步骤207,驱动程序根据卡片插拔信息更新卡片状态信息,并执行步骤208。

具体地,如果卡片插拔信息为插卡信息,驱动程序将卡片状态信息更新为 有卡状态;如果卡片插拔信息为拔卡信息,驱动程序将卡片状态信息更新为无 卡状态。

步骤208,驱动程序对第二串口数据进行处理,将处理得到的第二应用数据 写入到处理缓冲区中,根据第二应用数据的长度更新已接收数据长度。

具体地,如果第二串口数据中包含卡片插拔信息,驱动程序将第二串口数 据中除卡片插拔信息和第二包头之外的数据作为第二应用数据写入到处理缓冲 区中,将已接收数据长度加上第二应用数据的长度,作为更新后的已接收数据 长度;如果第二串口数据中不包含卡片插拔信息,驱动程序将第二串口数据中 除第二包头之外的数据作为第二应用数据写入到处理缓冲区中,将已接收数据 长度加上第二应用数据的长度,作为更新后的已接收数据长度。

本实施例中,第二包头为第二串口数据中的前十个字节的数据。

例如,第二串口数据为“80 f0 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84”时,第二串口数 据中不包含卡片插拔信息,驱动程序将上述第二串口数据中去除“80 f0 00 00 00 00 00 00 00 00”后的数据作为第二应用数据写入到处理缓冲区中。

步骤209,驱动程序判断已接收数据长度是否小于有效数据长度,如果是, 则执行步骤210;否则,执行步骤211。

步骤210,驱动程序将串口状态置为激活状态,重置串口事件,并返回步骤 201。

步骤211,驱动程序将串口状态置为未激活状态,设置已读事件,重置串口 事件,并返回步骤201。

步骤212,驱动程序判断第二串口数据中是否包含卡片插拔信息,如果是, 则执行步骤213;否则,执行步骤214。

其中,卡片插拔信息可以是插卡信息,也可以是拔卡信息。

例如,插卡信息为“50 03”,拔卡信息为“50 02”,第二串口数据为:“85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF 50 02”,则驱动程序可确定第二串口数据中包 含卡片插拔信息。

步骤213,驱动程序根据卡片插拔信息更新卡片状态信息,将第二串口数据 中除卡片插拔信息之外的数据作为第二应用数据写入到处理缓冲区中,根据第 二应用数据的长度更新已接收数据长度,并执行步骤215。

例如,第二串口数据为“85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF 50 02”时, 驱动程序将上述第二串口数据中去除“50 02”后的数据作为第二应用数据写入 到处理缓冲区中。

步骤214,驱动程序将第二串口数据作为第二应用数据写入到处理缓冲区 中,根据第二串口数据的长度更新已接收数据长度,并执行步骤215。

具体地,驱动程序将已接收数据长度加上第二串口数据的长度,作为更新 后的已接收数据长度。

步骤215,驱动程序判断已接收数据长度是否小于有效数据长度,如果是, 则执行步骤216;否则,执行步骤217。

步骤216,驱动程序重置串口事件,并返回步骤201。

步骤217,驱动程序将串口状态置为未激活状态,设置已读事件,重置串口 事件,并返回步骤201。

步骤218,驱动程序判断第二串口数据中是否包含卡片插拔信息,如果是, 则执行步骤219;否则,执行步骤220。

步骤219,驱动程序从第二串口数据中获取卡片插拔信息,根据卡片插拔信 息更新卡片状态信息,并执行步骤220。

步骤220,驱动程序重置串口事件,并返回步骤201。

本发明实施例通过在主机上使用基于UMDF的驱动程序,将串口设备与系 统的PC/SC接口挂接,使得主机中的应用程序能够方便地通过PC/SC接口调用 串口设备,不需要对应用程序做任何改动,提高了应用程序的重用性。

基于上述适用于串口设备的驱动程序的工作方法,本发明实施例还提供了 一种适用于串口设备的驱动程序,应用于包括主机和串口设备的系统中,主机 与串口设备连接,主机中安装有系统、应用程序和驱动程序,当应用程序调用 系统的PC/SC接口后,驱动程序中的预设函数被系统调用。上述驱动程序,如 图5所示,包括:

第一获取模块510,用于在驱动程序中的预设函数被系统调用时,通过组件 对象模型COM接口获取来自系统的控制码;

具体地,上述第一获取模块510,具体用于在驱动程序中的预设函数被系统 调用时,通过COM接口获取内核驱动转发的控制码。

其中,内核驱动为WDF。

第一判断模块520,用于对第一获取模块510获取到的控制码进行判断;

第一处理模块530,用于在第一判断模块520判断出控制码为预设控制码时, 根据预设控制码,组织对应的第一串口数据,通过串口将第一串口数据发送给 串口设备;

其中,上述预设控制码可以为卡片上电请求,第二应用数据为ATR字符串;

相应地,上述第一处理模块530,具体用于在第一判断模块520判断出控制 码为卡片上电请求时,组织上电指令,通过串口将上电指令发送给串口设备。

上述预设控制码还可以为指令发送请求;

相应地,上述第一处理模块530,包括:

第一组织子模块,用于在第一判断模块520判断出控制码为指令发送请求 时,对来自系统的第一应用数据进行组织,得到第一串口数据;

第一发送子模块,用于通过串口将第一组织子模块组织得到的第一串口数 据发送给串口设备。

第一监听模块540,用于监听已读事件;

第二处理模块550,用于在第一监听模块540监听到已读事件后,从处理缓 冲区中读取第二应用数据,将第二应用数据发送给系统;

具体地,上述第二处理模块550,具体用于在第一监听模块540监听到已读 事件后,从处理缓冲区中读取第二应用数据,通过向输出缓冲区写入第二应用 数据,将第二应用数据发送给系统。

其中,上述预设控制码可以为属性设置请求,第二应用数据为设置响应;

相应地,上述第一处理模块530,包括:

第二组织子模块,用于在第一判断模块520判断出控制码为属性设置请求 时,对来自系统的属性信息进行组织,得到第一串口数据;

第二发送子模块,用于通过串口将第二组织子模块组织得到的第一串口数 据发送给串口设备;

上述第二处理模块550,具体用于在第一监听模块540监听到已读事件后, 从处理缓冲区中读取设置响应,根据设置响应判断是否设置成功,如果是,则 将设置响应发送给系统,根据属性信息更新自身保存的属性数据;否则,将设 置响应发送给系统。

第二监听模块560,用于监听串口事件;

第一接收模块570,用在第二监听模块560监听到数据事件后,接收来自串 口设备的第二串口数据;

第三处理模块580,用于将第一接收模块570接收到的第二串口数据存储到 接收缓冲区,对第二串口数据进行处理,将处理得到的第二应用数据写入到处 理缓冲区中,并设置已读事件。

具体地,上述第三处理模块580,具体用于将第一接收模块570接收到的第 二串口数据存储到接收缓冲区,当第二串口数据中包含卡片插拔信息时,根据 卡片插拔信息更新卡片状态信息,将第二串口数据中除卡片插拔信息和第二包 头之外的数据作为第二应用数据写入到处理缓冲区中;当第二串口数据中不包 含卡片插拔信息时,将第二串口数据中除第二包头之外的数据作为第二应用数 据写入到处理缓冲区中。

进一步地,上述驱动程序,还包括:

第二获取模块,用于通过读取输入缓冲区,获取来自系统的第一应用数据。

相应地,上述第一组织子模块,具体用于在第一判断模块520判断出控制 码为指令发送请求时,对第一包头和第一应用数据进行组合,得到第一串口数 据。

进一步地,上述驱动程序,还包括:

第三获取模块,用于通过读取输入缓冲区,获取来自系统的属性信息。

相应地,上述第二组织子模块,具体用于对第一包头和属性信息进行组合, 得到第一串口数据。

进一步地,上述驱动程序,还包括:

第一设置模块,用于在第一处理模块530通过串口将第一串口数据发送给 串口设备之后,将串口状态置为初始状态;

相应地,上述第三处理模块580,包括:

第一判断子模块,用于对串口状态进行判断;

第一处理子模块,用于在第一判断子模块判断出串口状态为初始状态时, 对接收缓冲区进行初始化,将第二串口数据存储到接收缓冲区;

第二处理子模块,用于对第二串口数据进行处理,将处理得到的第二应用 数据写入到处理缓冲区中,触发第二判断子模块;

第二判断子模块,用于判断数据是否接收完毕;

第一设置子模块,用于在第二判断子模块判断出数据未接收完毕后,将串 口状态置为激活状态,重置串口事件;在第二判断子模块判断出数据接收完毕 后,将串口状态置为非激活状态,重置串口事件,并设置已读事件;

第二处理子模块,用于在第一判断子模块判断出串口状态为激活状态时, 将第二串口数据存储到接收缓冲区,将第二串口数据中的第二应用数据写入到 处理缓冲区中,判断数据是否接收完毕;

第二设置子模块,用于在第二处理子模块判断出数据未接收完毕后,重置 串口事件;在第二处理子模块判断出数据接收完毕后,将串口状态置为未激活 状态,重置串口事件;在第一判断子模块判断出串口状态为激活状态时,重置 串口事件。

进一步地,上述驱动程序,还包括:

第二设置模块,用于在第一处理模块530通过串口将第一串口数据发送给 串口设备之后,将已接收数据长度置为零;

相应地,上述第一处理子模块,还用于从第二串口数据中获取有效数据长 度,对有效数据长度进行保存;

上述第三处理模块580,还包括:

更新子模块,用于根据第二处理子模块处理得到的第二应用数据的长度更 新已接收数据长度;

上述第二判断子模块,具体用于判断已接收数据长度是否小于有效数据长 度,如果是,则确定数据未接收完毕;否则,确定数据接收完毕。

进一步地,上述第三处理模块580,还包括:

第三处理子模块,用于判断第二串口数据中是否包含卡片插拔信息,如果 是,则根据卡片插拔信息更新卡片状态信息;

相应地,上述第二处理子模块,具体用于将第二串口数据存储到接收缓冲 区,判断第二串口数据中是否包含卡片插拔信息;如果包含卡片插拔信息,根 据卡片插拔信息更新卡片状态信息,将第二串口数据中除卡片插拔信息之外的 数据作为第二应用数据写入到处理缓冲区中,判断数据是否接收完毕;如果不 包含卡片插拔信息,将第二串口数据作为第二应用数据写入到处理缓冲区中, 判断数据是否接收完毕。

进一步地,上述驱动程序,还包括:

第四处理模块,用于在第一判断模块520判断控制码为状态获取请求时, 读取卡片状态信息,将卡片状态信息发送给系统。

进一步地,上述驱动程序,还包括:

第五处理模块,用于在第一判断模块520判断控制码为插卡判断请求时, 读取卡片状态信息,根据卡片状态信息,判断串口设备中是否有卡,如果是, 将插卡信息发送给系统;否则,取消操作。

进一步地,上述驱动程序,还包括:

第六处理模块,用于在第一判断模块520判断控制码为拔卡判断请求时, 读取卡片状态信息,根据卡片状态信息,判断串口设备中是否有卡,如果是, 则取消操作;否则,将拔卡信息发送给系统。

进一步地,上述驱动程序,还包括:

第七处理模块,用于在第一判断模块520判断控制码为属性获取请求时, 对获取到的来自系统的IO请求进行转换,得到请求码,对请求码进行判断;如 果请求码是厂商名获取请求,则将自身保存的厂商名发送给系统;如果请求码 是接口设备IFD类型获取请求,则将自身保存的IFD类型信息发送给系统;如 果请求码是设备单元获取请求,则将自身保存的设备单元发送给系统;如果请 求码是特征描述获取请求,则将自身保存的特征描述信息发送给系统;如果请 求码是协议类型获取请求,则将自身保存的当前协议类型信息发送给系统;如 果请求码是ATR字符串获取请求,则将自身保存的ATR字符串发送给系统。

本发明实施例通过在主机上使用基于UMDF的驱动程序,将串口设备与系 统的PC/SC接口挂接,使得主机中的应用程序能够方便地通过PC/SC接口调用 串口设备,不需要对应用程序做任何改动,提高了应用程序的重用性。

结合本文中所公开的实施例描述的方法中的步骤可以直接用硬件、处理器 执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器 (RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、 寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式 的存储介质中。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于 此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到 变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应 所述以权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号