20楼#
发布于:2004-05-18 11:12
楼主,你好,我还处在看资料中,:(
但是,好歹看懂了不少东西。 因为没有真正上手(缺少开发工具),还有若干问题想请教: 1,因为那位icefish大虾的串口,是用纯C写的,那我想我如果要在里面添加网络(TDI)的话,也应该在直接在里面添加,对吗? 可是 因为对编译环境不熟悉,想问你,你是用什么开发工具编写,用什么工具编译调试?不是DS吧!? 2,具体的实现过程,我指的是增加网络那部分,我们能直接使用TDI吗?感觉,TDI好像专门为用来做网络filter驱动的!? 如果在虚拟串口使用TDI,要不要,额外的工作,还是就在相应的 Deviceiocontol,里面 对应的一个接口里, 用TDIconncet 、 TDIbulidsend ,以及设TdiBuildSetEventHandler等函数,就够了!? 相当于使用WInsocket一样!? 3,你编过了程序,如果可以得话,能否,给我说一下,在串口有东西写入得时候,驱动如何检测到,或者说,在用驱动得哪个函数里, 写读缓冲以及往网口转发数据!? 当网口有东西来,因为有之前做过set_eventhandler,所以会由系统发irp包,进入(设定得)例程里,对吗!? 希望楼主能帮帮俺这个菜鸟! 谢谢! |
|
|
21楼#
发布于:2004-05-18 17:21
1.我用的是DDK.
2.可以直接使用,不用想太多 3.应用程序向串口写数据时:DriverObject->MajorFunction[IRP_MJ_READ]
没错! |
|
|
22楼#
发布于:2004-05-22 18:51
你好,我在测试acidfish的那个虚拟串口时,发现如果用他模拟出来的虚拟串口,经test.exe连接后 COM3<-->COM4
用串口助手去测试时,一选择COM3或 COM4,程序就死掉,怀疑虚拟串口对event相应方式的读写不支持! 我用超级终端测试是成功的 请问学姐,是不是因为他的IOcontrol写的不全,还是read write些的不全!? 你是怎么克服的! 谢谢! 我的qq是 6238204, 希望能联系上你! |
|
|
23楼#
发布于:2004-05-25 10:20
我在测试acidfish大侠的那个虚拟串口时,发现如果用大虾的驱动模拟出来的虚拟串口,经test.exe连接后 COM3<-->COM4 后
用串口助手去测试时,一选择COM3或 COM4,程序就死掉,怀疑虚拟串口对event相应方式的读写不支持! 我用超级终端测试是成功的 是不是因为驱动的IOcontrol写的不全,还是read write些的不全!?我想应该是read write吧 怎么克服呢!? 谢谢! 另外,通过IOcontrol,我想能把原来只能临近COM口相连的状况 改成,任意Com的连接吧,比如,我模拟了COM4 COM5 COM6 COM10 COM11 COM12 ,应该能把COM4与COM10 COM5与COM11 COM6与COM12 相连接吧! 如果这样的话,我就可以实现COM TO TCPD 的应用层连接了,大概的想法是 App --COM4----COM10---TCP -----NET 希望大家一起讨论 谈论出真知,:) |
|
|
24楼#
发布于:2004-05-26 14:57
windows自带的超级终端和串口调试助手采用两种不同的机制。
超级终端采用查询的方式,串口调试助手和其他使用MSComm类的串口应用程序用的是事件通知的方式。 超级终端的方式: 不停的尝试读1个字节,读到为止 事件的方式:不主动读 先调用IOCTL_SERIAL_SET_WAIT_MASK设置一些标志 这个就相当于是设置硬件的哪些中断使能,哪些中断屏蔽掉 然后调用IOCTL_SERIAL_WAIT_ON_MASK发送一个IRP请求,这个IRP请求交给你处理。真正的串口就是当设定的MASK的事件发生的时候,中断处理程序就会完成这个IRP. 当IO管理器发现这个IRP返回了,它先IOCTL_GET_WAIT_MASK确认一下自己刚才设置了哪些标志,如果完成的IRP中SERIAL_EV_RXCHAR标志 被置位了,IO管理器就会IOCTL_GET_COMMSTATUS acidfish的IOcontrol中确实有一个小错误,是哪个我记不清了。 好像是类似于 if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < **** { status = STATUS_BUFFER_TOO_SMALL; break; } 的地方。判断的条件不对,导致这个IOCTl会失败返回。 |
|
|
25楼#
发布于:2004-05-27 09:38
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵
谢谢! |
|
26楼#
发布于:2004-05-27 11:36
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵 你的if不成立,呵呵 |
|
|
27楼#
发布于:2004-05-28 16:00
那也无所谓了
谢谢! |
|
28楼#
发布于:2004-05-28 20:11
恭喜楼主,向你学习
|
|
29楼#
发布于:2004-06-05 11:23
windows自带的超级终端和串口调试助手采用两种不同的机制。 楼主,你说的那几个IOcontrol(IOCTL_GET_WAIT_MASK、IOCTL_GET_COMMSTATUS)在acidfishda大侠的IOcontrol里都没有实现,能否将您的代码,让我学习一下,只要那几个与事件方式读写有关的IOControl就好了! 万分感激! 菜鸟甲 我的qq:6238204 jickknight@zju.edu.cn |
|
|
30楼#
发布于:2004-06-05 21:06
引用:
************************************************* acidfish的IOcontrol中确实有一个小错误,是哪个我记不清了。 好像是类似于 if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < **** { status = STATUS_BUFFER_TOO_SMALL; break; } ************************************************ 你能说的具体点嘛!? 是那个IOcontrol里的错误!? IOCTL_SERIAL_WAIT_ON_MASK??or IOCTL_SERIAL_SET_WAIT_MASK or其他!? 是不是本来应该是 IrpStack->Parameters.DeviceIoControl.OutputBufferLength 却写出IrpStack->Parameters.DeviceIoControl.InputBufferLength 另外要支持事件读,是不是要把 IOCTL_SERIAL_WAIT_ON_MASK IOCTL_SERIAL_SET_WAIT_MASK IOCTL_GET_COMMSTATUS IOCTL_SERIAL_SET_WAIT_MASK 都要填充的!? 呵呵 |
|
|
31楼#
发布于:2004-06-07 12:04
真心希望探讨一下,忘楼主成全!:)
编程中没有人指点,真的很枯燥! QQ:6238204 MSN: wangyangdan@hotmail.com |
|
|
32楼#
发布于:2004-06-10 13:42
恭喜恭喜啊!!!
|
|
33楼#
发布于:2004-06-22 20:53
再问:
………… 14 0.00000838 SerialApp.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 15 0.00000587 SerialApp.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 16 0.00000922 SerialApp.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 17 0.00000587 SerialApp.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:3 RM:3 RC:2 WM:3 WC:2 18 0.30328399 SerialApp.exe IRP_MJ_READ Serial0 TIMEOUT Length 0: 19 0.31030471 SerialApp.exe IRP_MJ_READ Serial0 TIMEOUT Length 0: 20 0.31032315 SerialApp.exe IRP_MJ_READ Serial0 TIMEOUT Length 0: 21 0.31030471 SerialApp.exe IRP_MJ_READ Serial0 TIMEOUT Length 0: …… …… 以上是用portman抓的iotrol,是对真实串口的过程,应用软件对串口进行查询式读写,但是跟超级终端又不同。 我想问的是,要在虚拟串口驱动里实现同上面类似的读功能,也就是说在调用 ReadFile(handlePort_, // handle of file to read inputData, // handle of file to read sizeBuffer, // number of bytes to read &length, // pointer to number of bytes NULL) 时,如果没有当前数据,就返回0字节的buffer,是如何实现的! 我用的是acidfish的simserial那个驱动。 我该了一些东西,但是当用它来让上面提到的应用程序调用该驱动的时候在读操作中卡在那里:状况如下: …… 2 0.00004442 ROCLink.exe IOCTL_SERIAL_PURGE SiSerial0 SUCCESS Purge: RXCLEAR 23 0.00002682 ROCLink.exe IOCTL_SERIAL_SET_RTS SiSerial0 SUCCESS 24 0.00017265 ROCLink.exe IRP_MJ_WRITE SiSerial0 SUCCESS Length 9: ......*5. 25 0.00004442 ROCLink.exe IOCTL_SERIAL_CLR_RTS SiSerial0 SUCCESS 26 0.00000000 ROCLink.exe IRP_MJ_READ SiSerial0 Length 100 …… 那个IRP_MJ_READ irp包卡在那里,使应用程序就傻在那里! 等着数据来。 应该是由timeout那个数据来控制的,到该时间还不来,就直接返回! 但是,由例子吗!?好像看实例!呜呜! |
|
|
34楼#
发布于:2004-06-22 21:56
我向你学习!多谢多谢!
|
|
|
35楼#
发布于:2004-06-23 16:16
2位再接再厉呀。
一问一答,也让别人长了不少知识!! |
|
36楼#
发布于:2004-07-21 19:51
up
|
|
37楼#
发布于:2004-08-05 09:17
请问各位大侠:
虚拟串口驱动程序的编写模式是属于WDM框架的吗?还是属于虚拟设备驱动一类的?这两种的开发模式是不是有很大差别呢?我看几乎所有的资料、书籍都在介绍WDM开发,而虚拟设备的开发却很少有人提。我也要做一个虚拟串口转网口的驱动程序,连本介绍“什么是虚拟串口”的最基本的入门书籍都找不到,跟别说指导怎么开发了。 看来只有通过多向各位请教来完成这个任务了,请大家多多赐教。 先谢了。 |
|
38楼#
发布于:2004-08-31 09:07
请问lingzjl:
我想试验一下znsoft_TDIClient这个驱动的例子,我用VC++的环境编译出了TDIClient.sys文件,可不知道该怎么安装这个驱动程序?readme.txt文件说需要一个安装程序:InstallDriver.exe,这个程序在哪儿能找到呢? 再有,如果不用试验这个驱动的功能,直接将这里的tdi函数加入simserial虚拟串口的驱动中,就可以完成虚拟串口转网口的功能吗? 谢先!!! |
|
39楼#
发布于:2004-09-14 11:23
gongxi gongxi
|
|