WDM驱动程序虚拟仪表串口通讯

类别:最新资讯 时间:2018-03-20 点击:64 次

本文介绍通过WDM驱动程序,模拟仪表串口通讯,解决称重软件编程过 程中的通讯测试问题。通过虚拟串口驱动程序,模拟硬件发送数据,来达到替代仪表发送数 据的目的,方便称重软件测试。
称重软件编写的过程中,会涉及到各种仪 表的通讯。为了检验仪表和上位机通讯是否正常, 常用的方法有两种:一种是用各种仪表做实际测 试。市场上常见的仪表有上百种,很难都齐备。 第二种方法是计算机需要两个串口,从一个串口 模拟仪表数据,发向另一个串口,两个串口之间 通过交叉的RS232通讯线相连。
这两种方法都有不完美的地方:第一种方法, 需要购买各种仪表测试,通讯模式如图1所示。

第二种方法,如果遇到计算机上只有一个串 口,或没有串口时,就比较麻烦,需要通过USB 转换成串口。通讯模式如图2所示:

本文介绍的方法不同于以上两种,可以解决 上述的问题,缩短开发时间。就是采用WDM虚拟 驱动程序来代替真实的仪表串口,发送指定的重 量数据,到这个虚拟串口中,称重软件可以像读 取物理串口一样,从这个虚拟串口读取称重数据。
即使电脑上没有串口,也不影响称重软件的通讯 测试,模式如图3所示:

首先,介绍一下虚拟串口驱动程序。无论是 真实的串口驱动,还是虚拟串口驱动,只要遵循 一组事先由微软定义的接口,Windows就认为这是 一个串口设备。这里所指的接口就是应用程序发 的IO控制码和读写命令。只要在驱动中对这些 IRP编写相应的派遣函数,就能实现一个串口驱 动。在编与驱动前,需要从微软网站上下DDK, 即驱动开发包。以及安装VC++编译器,并在VC 中设置好工作路径。
关于IO控制码和相应的数据结构都定义在 ntddser.h文件中。主要的控制码有:
在驱动的入口函数中,需要编写IRP的处理 函数:
extern "C" NTSTATUS DriverEntry(IN PDRIV- ER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
pDriverObject- >DriverExtension- >AddDevice= COMWDMAddDevice;//添加设备函数
pDriverObject- >MajorFunction[IRP_MJ_PNP]= COMWDMPnp;//即插即用处理函数
pDriverObject- >MajorFunction [ IRP—MJ—DE VICE_CONTROL]=COMWDMDispatchControlp;//IO 控制码处理函数
pDriverObject- >MajorFunction [ IRP—MJ—CRE ATE]=COMWDMCreate;//创建打开串口设备函数 pDriverObject- >MajorFunction PRP—MJ—CLOSE] =COMWDMClose;// 关闭串 口设备
pDriverObject- >MajorFunction PRP—MJ—READ] =COMWDMRead;// 读串 口设备
pDriverObject- >MajorFunction PRP—MJ—WRITE] =COMWDMWrite;// 写串 口设备
pDriverObject- >DriverUnload=COMWDMUnload; //卸载串口设备
return STATUS—SUCCESS;
}
Windows驱动程序采用的是分层结构。驱动程序 安装后,会附加到设备堆栈中,成为其中的一个层。 应用程序用户模式的请求转化成IRP进入ringO 层内核模式,会被用户编写的驱动程序截获,驱 动程序再调用相应的派遣函数完成硬件操作。如在 Win32 中调用 ReadFile()时会产生 IRP—MJ—READ 消息,调用WriteFile时产生IRP—MJ—WRITE消息。 驱动程序根据上述IRP,调用相应的自定义函数 COMWDMRead, COMWDMWrite 读、写串口。本文 限于篇幅,不详细列出代码,有兴趣的读者可以在网 上或一些参考书中找到相应的源代码。笔者主要想说 明虚拟串口驱动在称重软件中的测试应用。驱动程序 工作过程如图4所示。

BOAST—Device串口驱动程序,主要功能是将 接收到的数据,转移到发送缓冲区中,IRP在本层 返回,不向下传递。模拟真实设备的读写过程。 重点是实现COMWDMRead,COMWDMRead这两派遣函数。因为不读写真实的串口设备,所以 计算机上即使没有串口,也没有关系。
程序编译后,名为Comsys,在控制面中,通 过添加硬件设备,安装这个驱动程序,然后在设 备管理器中,将会看到一个虚拟设备BOAST-De-vice, 串口号是 COM3,如图5所示。

打开BOASTSerialTool3.6串口调试工具,如图 6所示。

用 BoastSerialToolver3,6 串口调试工具,向 COM3 口发送数据。Comsys虚拟驱动程序将接收到的COM3输入缓冲区中的数据,返回到COM3 COM3端口,利用Win32的ReadFile函数,可读 的输出缓冲区中,此时在称重软件中,打开这个 出其中的数据如图7所示。

图6是在串口调试工具中,向COM3写入02 2b 37 32 36 34 35 36 30 31 45 03 (十六进制 数据,通讯参数9600,n,8,]l ,这是XK3190A9仪 表的串口通讯数据格式。然后在BOAST2009称重 软件中(图7 ,打开COM3 (通讯参数9600,n, 8,j)按A9仪表协议读出重量为726456。因为读 写的是虚拟串口设备,所以几个Win32应用程序同 时打开COM3 口,不会产生冲突。
笔者在称重软件开发的过程中,经常需要对各种仪表的通讯协议进行测试,以保证软件的兼 容性。笔者的笔记本电脑本身没有串口,一时之 间又找不到USB转串口线,所以想出这样一个变 通的方法,解决燃眉之急。有时可以辅助解决一 些问题。
 
 
 

中国领先的称重软件技术提供商

The Leading Provider of Geomatic Solutions in China

展开收起网站地图