jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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包,进入(设定得)例程里,对吗!?

希望楼主能帮帮俺这个菜鸟! 谢谢!
Chasing my dreams!
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2004-05-18 17:21
1.我用的是DDK.
2.可以直接使用,不用想太多
3.应用程序向串口写数据时:DriverObject->MajorFunction[IRP_MJ_READ]


    

当网口有东西来,因为有之前做过set_eventhandler,所以会由系统发irp包,进入(设定得)例程里,对吗!?


没错!
超级肥雀
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2004-05-22 18:51
你好,我在测试acidfish的那个虚拟串口时,发现如果用他模拟出来的虚拟串口,经test.exe连接后 COM3<-->COM4
用串口助手去测试时,一选择COM3或 COM4,程序就死掉,怀疑虚拟串口对event相应方式的读写不支持! 我用超级终端测试是成功的

请问学姐,是不是因为他的IOcontrol写的不全,还是read write些的不全!?
你是怎么克服的! 谢谢!

我的qq是 6238204, 希望能联系上你!
Chasing my dreams!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
希望大家一起讨论

谈论出真知,:)
Chasing my dreams!
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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会失败返回。
超级肥雀
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
25楼#
发布于:2004-05-27 09:38
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵

谢谢!
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2004-05-27 11:36



  
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵

谢谢!


你的if不成立,呵呵
超级肥雀
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
27楼#
发布于:2004-05-28 16:00
那也无所谓了
谢谢!
knightxp
驱动牛犊
驱动牛犊
  • 注册日期2004-05-28
  • 最后登录2004-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2004-05-28 20:11
恭喜楼主,向你学习
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2004-06-05 11:23
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会失败返回。
 


楼主,你说的那几个IOcontrol(IOCTL_GET_WAIT_MASK、IOCTL_GET_COMMSTATUS)在acidfishda大侠的IOcontrol里都没有实现,能否将您的代码,让我学习一下,只要那几个与事件方式读写有关的IOControl就好了!

万分感激!

菜鸟甲

我的qq:6238204
        jickknight@zju.edu.cn

Chasing my dreams!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
都要填充的!?
呵呵
Chasing my dreams!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2004-06-07 12:04
真心希望探讨一下,忘楼主成全!:)

编程中没有人指点,真的很枯燥!

QQ:6238204
MSN: wangyangdan@hotmail.com
Chasing my dreams!
darydl
驱动小牛
驱动小牛
  • 注册日期2003-06-29
  • 最后登录2017-05-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
32楼#
发布于:2004-06-10 13:42
恭喜恭喜啊!!!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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那个数据来控制的,到该时间还不来,就直接返回!
但是,由例子吗!?好像看实例!呜呜!
Chasing my dreams!
ygg2002
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2004-09-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2004-06-22 21:56
我向你学习!多谢多谢!
杨冠根
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
35楼#
发布于:2004-06-23 16:16
2位再接再厉呀。

一问一答,也让别人长了不少知识!!

mountain8848
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2004-07-21 19:51
up
brucelyang
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2004-08-05 09:17
请问各位大侠:
    虚拟串口驱动程序的编写模式是属于WDM框架的吗?还是属于虚拟设备驱动一类的?这两种的开发模式是不是有很大差别呢?我看几乎所有的资料、书籍都在介绍WDM开发,而虚拟设备的开发却很少有人提。我也要做一个虚拟串口转网口的驱动程序,连本介绍“什么是虚拟串口”的最基本的入门书籍都找不到,跟别说指导怎么开发了。
看来只有通过多向各位请教来完成这个任务了,请大家多多赐教。
先谢了。
brucelyang
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2004-08-31 09:07
请问lingzjl:
    我想试验一下znsoft_TDIClient这个驱动的例子,我用VC++的环境编译出了TDIClient.sys文件,可不知道该怎么安装这个驱动程序?readme.txt文件说需要一个安装程序:InstallDriver.exe,这个程序在哪儿能找到呢?
    再有,如果不用试验这个驱动的功能,直接将这里的tdi函数加入simserial虚拟串口的驱动中,就可以完成虚拟串口转网口的功能吗?
    谢先!!!
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2004-09-14 11:23
gongxi gongxi
游客

返回顶部