VSer

所属分类:串口编程
开发工具:Visual C++
文件大小:776KB
下载次数:2980
上传日期:2006-12-18 15:07:27
上 传 者biabiabia
说明:  虚拟串口的完整源代码,包括注释和开发日志。据说市值5万人民币!
(the integrity of the source code, including comments and development log. Reportedly worth 50,000 yuan!)

文件列表:
VSer (0, 2005-04-17)
VSer\busdriver (0, 2005-04-17)
VSer\busdriver\bus.inf (1663, 2005-02-27)
VSer\busdriver\BusEnum.sys (23559, 2005-02-27)
VSer\busdriver\toaster.cat (174, 2005-02-27)
VSer\exe (0, 2005-04-17)
VSer\exe\Test.C (10906, 2005-02-27)
VSer\exe\Test.dsp (4396, 2005-02-27)
VSer\exe\Test.dsw (531, 2005-02-27)
VSer\exe\test.h (1063, 2005-02-27)
VSer\exe\Test.plg (1075, 2005-04-17)
VSer\inc (0, 2005-04-17)
VSer\inc\wdmioctl.h (1668, 2005-02-27)
VSer\inf (0, 2005-04-17)
VSer\inf\Enum.exe (34345, 2005-02-27)
VSer\inf\objfre_w2k_x86 (0, 2005-04-17)
VSer\inf\objfre_w2k_x86\VSer.CAT (0, 2005-02-27)
VSer\inf\objfre_w2k_x86\VSer.inf (1609, 2005-02-27)
VSer\inf\objfre_w2k_x86\VSer.sys (12032, 2005-04-17)
VSer\inf\objfre_wxp_x86 (0, 2005-04-17)
VSer\inf\objfre_wxp_x86\VSer.CAT (0, 2005-02-27)
VSer\inf\objfre_wxp_x86\VSer.inf (1609, 2005-02-27)
VSer\inf\objfre_wxp_x86\VSer.sys (12032, 2005-04-17)
VSer\inf\Test.exe (32768, 2005-04-17)
VSer\log&Debug (0, 2005-04-17)
VSer\log&Debug\log.txt (1777, 2005-04-17)
VSer\others (0, 2005-04-17)
VSer\others\commaster (0, 2005-04-17)
VSer\others\commaster\ComMaster.chm (275224, 2005-02-27)
VSer\others\commaster\ComMaster.exe (339968, 2005-02-27)
VSer\others\sockUDP.exe (32768, 2005-02-27)
VSer\others\TDIClient.zip (81172, 2005-02-27)
VSer\others\tdisamp.rar (217206, 2005-02-27)
VSer\sys (0, 2005-04-17)
VSer\sys\Dispatch.c (3371, 2005-02-27)
VSer\sys\ioctl.c (21827, 2005-02-27)
... ...

虚拟串口设备驱动 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下进行测试。由于Win***下串口的结构跟Win2k以后差别较大,所以本程序不能在Win***下使用。 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

近期下载者

相关文件


收藏者