虚拟串口设备驱动
Virtual Serial Device Driver
2005.2.20
Windows2K下虚拟串口设备驱动程序及相关应用程序
内容列表
===========
主要功能
使用说明
各模块说明
工作机制
更新和改进
不足之处
跟我联系
主要功能
===========
在Windows2K操作系统上虚拟出若干串口设备,这些虚拟串口设备作为 TDI Client 将串口应用程序(比如超级终端)读写串口设备的操作通过网络的方式传递到远端,即将应用程序写入的数据以UDP协议发送到远端目标机器的指定端口;监听本机指定端口,将所有在此端口收到的UDP报文数据提交给应用程序。
1. 在操作系统中,虚拟出若干串口。可以使用串口工具(比如操作系统自带的超级终端软件)对串口进行打开、发送、接收、关闭等操作。
2. 由于是虚拟串口,所以可以设置任意波特率、数据位、奇偶校验、停止位等端口操作。
3. 虚拟串口创建以后,打开本机的6001端口,设置接收回调函数用于接收此端口上的数据。应用程序写入虚拟串口的数据则直接发送到远端指定IP地址和端口。
使用说明
===========
1. 安装busdriver目录中提供的toaster总线驱动程序:BusEnum.sys。安装步骤详见DDK的toaster\bus例子。
2. 控制台上运行enum -p 1,对新的硬件设备指定 inf目录,安装inf目录中提供的本虚拟串口驱动程序。安装完毕以后在“设备管理器”的"端口(COM和LPT)"中应该多出新的设备。enum程序由DDK的toaster\exe\enum例子编译。只是改动了toaster\inc\public.h中的#define BUS_HARDWARE_IDS L"Toaster\\MsToaster\0"
3. 控制台上运行test.exe,创建/删除虚拟串口设备的DOS名,设定远端目标机器的IP地址和端口。
4. 卸载设备可以在控制台上运行 enum -u 1,此操作代表强行拔出设备。另一个方法是点击桌面右下角系统托盘中的“拔下或弹出硬件”图标来停止设备的工作。
6. 更新驱动程序时,只需要将所有的虚拟串口卸载,然后再编译驱动程序,build -ceZ,而后将编译后的.sys文件拷贝到system32\drivers目录即可。
注意事项
-------
1. 本项目中所有编译后的驱动和应用程序都在inf目录下。在Win2K(sp4)平台上测试的较多,在Xp(sp2)平台上作过简单测试。没有在多CPU下进行测试。由于Win98下串口的结构跟Win2k以后差别较大,所以本程序不能在Win98下使用。
2. 简单起见,绑定本机端口这一步没有做成动态的。只是用一个静态变量从6001开始累加来指定本机端口。创建多个虚拟串口设备的时候,每一个虚拟串口设备依次绑定本机6001,6002,6003等以后端口。因此远端UDP发送程序可以分别对这些端口发送数据来进行测试。
3. 发送到远端的指定端口,这一步可以动态实现,即通过test程序给每一个虚拟串口设备指定端口。
4. 编译win2K和Xp平台下的驱动程序应该采用相应的编译环境。在Win2000编译环境下编译的.sys文件在Xp+sp2下可能有点小问题。反之没有做过测试。
各模块说明
===========
busdriver toaster总线的安装文件,包括inf文件和 .sys文件
exe 串口应用程序,控制虚拟串口设备。参考其目录的说明.txt
inc application 和 sys都要用到的若干宏定义和其他
inf 最终安装所需要的.inf .sys 和应用程序
log&debug 开发日志,说明文档
others 开发辅助软件,例子和测试工具。
sys WDM类型的驱动程序,虚拟串口驱动程序的主体
工作机制
===========
虚拟设备的创建
----------------
跟商业软件Virtual Serial Ports Driver XP3类似。
首先利用DDK的toaster bus例子安装toaser bus总线,然后利用该总线驱动程序生成一个(或几个)虚拟PDO。对这些虚拟的PDO,加载这个虚拟串口驱动程序。
注意:toaster bus driver安装以后不会自动生成虚拟设备PDO,需要运行相应的enum程序。
“enum -p 1“会生成一个新的虚拟设备。该设备的Hardware ID基于NTDDK\src\general\toaster\inc\public.h里的#define BUS_HARDWARE_IDS L"Toaster\\MsToaster\0"的定义。这个Hardware ID和我们的虚拟串口驱动程序inf文件(MySerial.inf)里边指定的Hardware ID必须一致。否则安装本驱动程序的时候,会提示“未发现相关的硬件信息”。
多个虚拟设备的创建:
在AddDevice中设置静态变量,每次虚拟设备创建、加载驱动程序都会调用该函数。该静态变量累加。生成的FDO的名字由\Device\Serial11开始递增
每一个虚拟设备都可以采用1~255之间没有被占用的数字来动态的生成DOS名,即COMn。
具体操作参考exe目录下的readme.txt
读写方法
----------------
1. 读数据采用缓冲区方式
设备在启动时打开本机UDP协议的6001端口,设置接收回调函数将该端口上收到的所有数据拷贝到接收缓冲区。接收缓冲区是一个环形缓冲区,保存接收到的最新数据。应用程序若不及时读取,数据可能会被最近接收到的数据所刷新。
2. 写数据采用直接发送方式
应用程序向设备写的数据直接以UDP协议发送到之前设定的远端IP地址和端口上。此过程为阻塞式。不同于读数据方式,没有专门为写数据设置缓冲区。
串口相关DeviceIoContrl的处理
----------------
着重处理
IOCTL_SERIAL_GET_COMMSTATUS
IOCTL_SERIAL_GET_WAIT_MASK
IOCTL_SERIAL_SET_WAIT_MASK
IOCTL_SERIAL_WAIT_ON_MASK
IOCTL_SERIAL_PURGE
简单处理
IOCTL_SERIAL_SET_BAUD_RATE
IOCTL_SERIAL_GET_BAUD_RATE
IOCTL_SERIAL_SET_LINE_CONTROL
IOCTL_SERIAL_GET_LINE_CONTROL
IOCTL_SERIAL_SET_TIMEOUTS
IOCTL_SERIAL_GET_TIMEOUTS
IOCTL_SERIAL_SET_CHARS
IOCTL_SERIAL_GET_CHARS
IOCTL_SERIAL_SET_QUEUE_SIZE
IOCTL_SERIAL_GET_HANDFLOW
IOCTL_SERIAL_SET_HANDFLOW
其余IOCTL则直接返回
IOCTL_SERIAL_GET_COMMSTATUS
返回CommsPorts的状态,即deviceExtension->SerialStatus。应用程序根据这里边的AmountInInQueue和AmountInOutQueue来判断是否有接收/发送缓冲区里边是否有数据。
IOCTL_SERIAL_GET_WAIT_MASK
返回驱动当前等待的Mask,返回值应该与上一次Set_Wait_Mask保持一致
IOCTL_SERIAL_SET_WAIT_MASK
设置驱动应该等待的Mask。此时驱动应该取消以前Pending的ReadIrp和WaitOnMaskIrp。
IOCTL_SERIAL_WAIT_ON_MASK
根据当前的WaitMask来判断,当设备出现WaitMask上的事件应该返回该Irp;若没有WaitMask上的事件发生,则IoMarkIrpPending,返回Status_Pending。以后某个时间出现WaitMask事件以后再返回该Irp
IOCTL_SERIAL_PURGE
取消指定的Rx/Tx的Irp。
更新和改进
=============
1、摒弃了上一版本的双串口互连的实现。本版本将虚拟串口设备作为TDI Client通过网络与远端进行数据交换。网络通信中采用的是UDP协议,所以不能保证数据传输的可靠性和顺序性。若对上述性能有要求,可以采用TCP协议建立一个 Connection-Oriented 连接。具体实现请参考DDK文档。
2、串口设备的枚举,虚拟串口设备的DosName的创建和删除,远端目标机器的IP地址和端口,目前均由DeviceIoControl来负责控制。因此enum -p 1创建虚拟串口设备以后,若不运行test.exe文件,很多串口应用程序可能无法找到该虚拟串口设备。关于test.exe的使用参考相应目录下的文档。
3、较上一版本,本次对串口相关的DeviceIoContrl进行了更多的处理,主要是如下
IOCTL_SERIAL_GET_COMMSTATUS,IOCTL_SERIAL_GET_WAIT_MASK,IOCTL_SERIAL_SET_WAIT_MASK,IOCTL_SERIAL_WAIT_ON_MASK,IOCTL_SERIAL_PURGE,IOCTL_SERIAL_SET_TIMEOUTS。
4、在读数据中,若当前缓冲区里边没有数据,则设定一个DPC,启动定时器。根据IOCTL_SERIAL_SET_TIMEOUTS设定的超时值作简单的超时处理。
5、对于如何将设备出现在“拔出或弹出硬件”对话框里边(如同U盘一样),可参考PnpQueryCapabilities函数的实现。
6、TDI的相关操作均在TDIClient.c文件中。这部分主要参考的代码是TDIClient和TDISample两个项目。
不足之处
=============
1. 对于多线程应用程序读写虚拟串口的情况,支持的不够好。鉴于目前大部分串口应用程序都是采用单线程读写设备,所以实际中影响不大。
2. 串口的超时处理比较简单。
3. 网络TDI Client方面,仅实现了UDP的无连接服务,网络通信质量不高。目前设备启动后就固定的监听某一端口,该端口是硬编码到驱动程序里边,不够灵活。
跟我联系
=============
自从上一版虚拟串口程序发布以后,一年以来陆续的收到了很多网友的来信。有鼓励的,有报告bug的,还有很多提出设计思路的。总计不下30余人,这里一并表示感谢!
作为一个虚拟串口设备驱动,本身没有太多的应用场合,称之为“玩具软件”还算比较恰当。所实现的功能基本上属于演示性质的。串口部分对上一版进行了一些完善,TDI Client部分则基本上是从others下提供的TDI Sample等代码中略加修改移植过来。所以对于驱动开发的新手来说还算有点参考价值。对于中高手而言,不如直接看others下的源代码更有收获。
新年伊始,最后祝大家鸡年大吉,身体健康,工作顺利!
Email: bitee@163.com (sohu的邮箱不稳定,改用163的了。)
acidfish@DriverDevelop.com
liyongbing
- 粉丝: 5
- 资源: 54
最新资源
- 微信自动抢红包APP.zip毕业设计参考学习资料
- 为 Wireshark 能使用纯真网络 IP 数据库(QQwry)而提供的格式转换工具.zip
- 音频格式转换工具.zip学习资料程序资源
- 自用固件,合并openwrt和immortalwrt编译AX6(刷机有风险).zip
- 最新GeoLite2-City.mmdb,GeoLite2-Country.mmdb打包下载
- 基于BootStrap + Springboot + FISCO-BCOS的二手物品交易市场系统.zip
- 使用Java语言编写的九格拼游戏,找寻下曾经小时候的记忆.zip
- gakataka课堂管理系统
- 一个简单ssh(spring springMVC hibernate)游戏网站,在网上找的html模板,没有自己写UI,重点放在java后端上.zip
- 一个采用MVC架构设计、Java实现的泡泡堂游戏.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页