CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
60楼#
发布于:2004-05-25 10:34
开始、程序、附件、通讯、超级终端
答得好的话,请兄弟们加点分,那是对我的肯定
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
61楼#
发布于:2004-05-25 10:44
我在测试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
希望大家一起讨论
 


虚拟串口对event相应方式的读写不支持!你说得没错。这个虚拟传口驱动还尚未对超时,读写等进行完善。所以用一些异步读写传口的应用程序调试的话会出错。修改的话,就靠大家了。我最近比较忙,没有时间考虑这个项目了。等以后不忙了,会在进行完善的。
com->tcp的话,直接 app->ComX->tcp->net
vennychang
驱动牛犊
驱动牛犊
  • 注册日期2003-02-07
  • 最后登录2005-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
62楼#
发布于:2004-05-25 10:49
虚拟串口对event相应方式的读写不支持!你说得没错。这个虚拟传口驱动还尚未对超时,读写等进行完善。所以用一些异步读写传口的应用程序调试的话会出错。修改的话,就靠大家了。我最近比较忙,没有时间考虑这个项目了。等以后不忙了,会在进行完善的。
com->tcp的话,直接 app->ComX->tcp->net [/quote]

我把serial(sample in ddk)改成virtual com<->usb,也是在坐
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
63楼#
发布于:2004-05-25 11:04
[quote]
我把serial(sample in ddk)改成virtual com<->usb,也是在坐
vennychang
驱动牛犊
驱动牛犊
  • 注册日期2003-02-07
  • 最后登录2005-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
64楼#
发布于:2004-05-25 11:22

我觉得用timer来做超时处理,用thread来轮询usb设备比较合适。
毕竟usb设备是需要不断的向下发送urb来获得数据。单独做一个thread跟usb设备通信。把收上来的数据放在缓冲区里边。当win32 app ReadFile的时候再把缓冲区的数据传递上去。


那如此我就要做
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
65楼#
发布于:2004-05-25 12:21
差不多是这个意思。
CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
66楼#
发布于:2004-05-25 17:26
acidfish大侠,我给你发了短信,麻烦您回答一下我的问题,谢谢
答得好的话,请兄弟们加点分,那是对我的肯定
vennychang
驱动牛犊
驱动牛犊
  • 注册日期2003-02-07
  • 最后登录2005-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
67楼#
发布于:2004-05-27 16:29
在device接上以後..CreateFile之前
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
68楼#
发布于:2004-05-27 16:55
[quote]在device接上以後..CreateFile之前
vennychang
驱动牛犊
驱动牛犊
  • 注册日期2003-02-07
  • 最后登录2005-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
69楼#
发布于:2004-05-27 17:57


你使用的是超级终端吧?超级终端是采用的poll模式轮询进行ReadFile操作。除非IoMarkPending( Irp )
我的程序里边就是这样做的。然后把Irp放在队列。等到跟这个端口连接的另外一个端口有数据发送的时候,在把这个Irp complete
例如:com10 <-> com11
当Read com 10 的时候,把read irp放在queue中。
当write com11 的时候,把com10 queue中的read irp complete [/quote]

我想到我有叫用了pnpports.dll
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
70楼#
发布于:2004-05-27 17:59
[quote]

我想到我有叫用了pnpports.dll
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
71楼#
发布于:2004-06-15 16:01

我觉得用timer来做超时处理,用thread来轮询usb设备比较合适。
毕竟usb设备是需要不断的向下发送urb来获得数据。单独做一个thread跟usb设备通信。把收上来的数据放在缓冲区里边。当win32 app ReadFile的时候再把缓冲区的数据传递上去。


对usb设备读写,那么这样的话最少就要两个thread了,因为read阻塞的时候要保证write可以运行的。我观察到,开了超过1个thread后,只要读写操作了,最后就不能正常终止这个thread,非常的慢,大概要10分钟,即使那个thread已经没有IRP在处理了,也是这样,
就会导致不能热插拔,不知道如何解决?
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
72楼#
发布于:2004-06-15 21:14
我在测试我改自acidfish虚拟串口时,用我的win32串口读写程序测试时,发现如下错误:
用portmon测得

16 0.00007794 ROCLink.exe IOCTL_SERIAL_GET_WAIT_MASK SiSerial2 INVALID DEVICE REQUEST

感觉好像就是这个ioctrl处理不当。我处理的方式为:
case IOCTL_SERIAL_GET_WAIT_MASK:
{
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <sizeof(ULONG)) {
                status = STATUS_BUFFER_TOO_SMALL;
break;
     }
          
Irp->IoStatus.Information = sizeof(ULONG);

*((ULONG *)Irp->AssociatedIrp.SystemBuffer) = deviceExtension->WaitMask;

                
DebugPrint(("--  IOCTL_SERIAL_GET_WAIT_MASK   --\n"));
break;

}

大致是参考ddk中源码 src->kernel->serial中的处理方式的
请问有什么问题吗!?

谢谢!
该iotrol到底要求返回什么东西!?
Chasing my dreams!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
73楼#
发布于:2004-06-15 23:36
我在测试我改自acidfish虚拟串口时,用我的win32串口读写程序测试时,发现如下错误:
用portmon测得

16 0.00007794 ROCLink.exe IOCTL_SERIAL_GET_WAIT_MASK SiSerial2 INVALID DEVICE REQUEST

感觉好像就是这个ioctrl处理不当。我处理的方式为:
case IOCTL_SERIAL_GET_WAIT_MASK:
{
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <sizeof(ULONG)) {
                status = STATUS_BUFFER_TOO_SMALL;
break;
     }
          
Irp->IoStatus.Information = sizeof(ULONG);

*((ULONG *)Irp->AssociatedIrp.SystemBuffer) = deviceExtension->WaitMask;

                
DebugPrint(("--  IOCTL_SERIAL_GET_WAIT_MASK   --n"));
break;

}

大致是参考ddk中源码 src->kernel->serial中的处理方式的
请问有什么问题吗!?

谢谢!
该iotrol到底要求返回什么东西!?


修改为这样:

case IOCTL_SERIAL_GET_WAIT_MASK:
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <sizeof(ULONG))
{
status = STATUS_BUFFER_TOO_SMALL;
break;
}
status = STATUS_SUCCESS ;
Irp->IoStatus.Status = status ;
Irp->IoStatus.Information = sizeof(ULONG);
*((ULONG *)Irp->AssociatedIrp.SystemBuffer) = deviceExtension->WaitMask;
DebugPrint(("-- IOCTL_SERIAL_GET_WAIT_MASK --n"));
break;
测试一下
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
74楼#
发布于:2004-06-19 14:43
呵呵,果然好使!谢谢

接下去要添加tcp部分了!

用TDI,慢慢学!
Chasing my dreams!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
75楼#
发布于:2004-06-19 22:09
呵呵,果然好使!谢谢

接下去要添加tcp部分了!

用TDI,慢慢学!

你现在在什么地方工作,我很希望认识更多的高手,如果方便请和我联系,我在深圳,msn是:mfczmh@sina.com
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
ij889
驱动牛犊
驱动牛犊
  • 注册日期2004-07-08
  • 最后登录2008-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
76楼#
发布于:2004-07-08 10:02
非常感谢!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
77楼#
发布于:2004-07-17 21:22
断断续续做了大半年。块到春节了,马上要走一趟长线旅游。没时间做了。发给大家。仅供参考。
做的比较粗糙,很多需要完善改进的地方。
请大牛们多提意见。

祝大家新年快乐


问一个比较弱的问题,
请问,acidfish大侠提供的那个simserial里面连接COM口用的
test 项目,编译的时候,如果选择release版本的话出现如下错误

Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiDestroyDeviceInfoList@4
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiGetDeviceInterfaceDetailA@24
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiEnumDeviceInterfaces@20
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiGetClassDevsA@16


不知道如何该,btw,debug是好的!
要编译release版的话,在project setting里还要修改什么参数!?
我看 那些 SetupDiGetDeviceInterfaceDetail函数似乎是 ddk里面的函数!

请教大侠们!

3x

QQ:6238204
Chasing my dreams!
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
78楼#
发布于:2004-07-19 08:47


问一个比较弱的问题,
请问,acidfish大侠提供的那个simserial里面连接COM口用的
test 项目,编译的时候,如果选择release版本的话出现如下错误

Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiDestroyDeviceInfoList@4
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiGetDeviceInterfaceDetailA@24
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiEnumDeviceInterfaces@20
Test.obj : error LNK2001: unresolved external symbol __imp__SetupDiGetClassDevsA@16


不知道如何该,btw,debug是好的!
要编译release版的话,在project setting里还要修改什么参数!?
我看 那些 SetupDiGetDeviceInterfaceDetail函数似乎是 ddk里面的函数!

QQ:6238204


link的时候加上Setupapi.lib 就行了。
brucelyang
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2004-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
79楼#
发布于:2004-08-05 09:25
请问各位大侠:
虚拟串口驱动程序的编写模式是属于WDM框架的吗?还是属于虚拟设备驱动一类的?这两种的开发模式是不是有很大差别呢?我看几乎所有的资料、书籍都在介绍WDM开发,而虚拟设备的开发却很少有人提。我也要做一个虚拟串口转网口的驱动程序,连本介绍“什么是虚拟串口”的最基本的入门书籍都找不到,更别说指导怎么开发了。看来只有通过多向各位请教来完成这个任务了,请大家多多赐教。
先谢了。
游客

返回顶部