jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1621回复:3

虚拟串口IOCTROL 编程指教 给分

楼主#
更多 发布于:2004-06-10 09:52
我在调simseial 的虚拟串口程序时,发现如果用串口调试程序测试,结合portmon监听发现
下面几个IOCtrol有问题,
第一个是  IOCTL_SERIAL_SET_CHAR 的
返回参数出现 EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
特别是EVT,在测试实串口时,返回的值是EVT:71
不过有时候,有正确,我不太明白

第二个地方是IOCTL_SERIAL_SET_HANDFLOW
 指示 INVALID PARAMETER,说明这个IOCtrol处理不当,请教大虾,
如何修改!? 跟ddk提供的Serial的ioctl.c比较后,发觉没有什么大的差别。

指教,给分
Chasing my dreams!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-10 22:24
做过虚拟串口的大侠们,指点一把,我用同样的驱动程序,来用超级终端使用虚拟串口时,用portmon监听到的
IOCTL_SERIAL_SET_CHAR
IOCTL_SERIAL_SET_HANDFLOW
返回的值都正常,
14 0.00003855 hypertrm.exe IOCTL_SERIAL_SET_CHAR SiSerial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:71 XON:11 XOFF:13
15 0.00003352 hypertrm.exe IOCTL_SERIAL_SET_HANDFLOW SiSerial0 SUCCESS Shake:80000009 Replace:80000080 XonLimit:80


但是当用一个事件读写的app程序使用该虚拟串口时,就出现
16 0.00003771 ROCLink.exe IOCTL_SERIAL_SET_CHAR SiSerial0

SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
17 0.00003604 ROCLink.exe IOCTL_SERIAL_SET_HANDFLOW

SiSerial0 INVALID PARAMETER Shake:80000000 Replace:0
XonLimit:4096 XoffLimit:1024
大侠们指点一把吧!

到底是那一步错了!?


出错的时候,出现的一堆IOCtrol如下:

2 0.00003436 ROCLink.exe IRP_MJ_CREATE SiSerial0 SUCCESS Options: Open
3 0.00007291 ROCLink.exe IOCTL_SERIAL_PURGE SiSerial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
4 0.00004526 ROCLink.exe IOCTL_SERIAL_GET_BAUD_RATE SiSerial0 SUCCESS
5 0.00004023 ROCLink.exe IOCTL_SERIAL_GET_LINE_CONTROL SiSerial0 SUCCESS
6 0.00003939 ROCLink.exe IOCTL_SERIAL_GET_CHARS SiSerial0 SUCCESS
7 0.00004442 ROCLink.exe IOCTL_SERIAL_GET_HANDFLOW SiSerial0 SUCCESS
8 0.00004442 ROCLink.exe IOCTL_SERIAL_GET_BAUD_RATE SiSerial0 SUCCESS
9 0.00003939 ROCLink.exe IOCTL_SERIAL_GET_LINE_CONTROL SiSerial0 SUCCESS
10 0.00003855 ROCLink.exe IOCTL_SERIAL_GET_CHARS SiSerial0 SUCCESS
11 0.00004190 ROCLink.exe IOCTL_SERIAL_GET_HANDFLOW SiSerial0 SUCCESS
12 0.00003939 ROCLink.exe IOCTL_SERIAL_SET_BAUD_RATE SiSerial0 SUCCESS Rate: 9600
13 0.00003520 ROCLink.exe IOCTL_SERIAL_CLR_RTS SiSerial0 INVALID DEVICE REQUEST
14 0.00002682 ROCLink.exe IOCTL_SERIAL_CLR_DTR SiSerial0 SUCCESS
15 0.00004023 ROCLink.exe IOCTL_SERIAL_SET_LINE_CONTROL SiSerial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
16 0.00003855 ROCLink.exe IOCTL_SERIAL_SET_CHAR SiSerial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
17 0.00003688 ROCLink.exe IOCTL_SERIAL_SET_HANDFLOW SiSerial0 INVALID PARAMETER Shake:80000000 Replace:0 XonLimit:4096 XoffLimit:1024
18 0.00004442 ROCLink.exe IOCTL_SERIAL_GET_BAUD_RATE SiSerial0 SUCCESS
19 0.00003939 ROCLink.exe IOCTL_SERIAL_GET_LINE_CONTROL SiSerial0 SUCCESS
20 0.00003771 ROCLink.exe IOCTL_SERIAL_GET_CHARS SiSerial0 SUCCESS
21 0.00004274 ROCLink.exe IOCTL_SERIAL_GET_HANDFLOW SiSerial0 SUCCESS
22 0.00003855 ROCLink.exe IOCTL_SERIAL_SET_BAUD_RATE SiSerial0 SUCCESS Rate: 1200
23 0.00002766 ROCLink.exe IOCTL_SERIAL_SET_RTS SiSerial0 SUCCESS
24 0.00002682 ROCLink.exe IOCTL_SERIAL_SET_DTR SiSerial0 SUCCESS
25 0.00003939 ROCLink.exe IOCTL_SERIAL_SET_LINE_CONTROL SiSerial0 SUCCESS StopBits: 1.52 Parity: NONE WordLength: 8
26 0.00003688 ROCLink.exe IOCTL_SERIAL_SET_CHAR SiSerial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
27 0.00003520 ROCLink.exe IOCTL_SERIAL_SET_HANDFLOW SiSerial0 INVALID PARAMETER Shake:1 Replace:40 XonLimit:4096


循环下去了
Chasing my dreams!
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-15 21:20
上面的那两个IOCTL_SERIAL_SET_CHAR
IOCTL_SERIAL_SET_HANDFLOW问题,解决了一点,但是还是没有完全解决。暂且不说
下面是新问题,真希望告诉指点一二。


我在测试我改自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!
use_id
驱动中牛
驱动中牛
  • 注册日期2002-03-11
  • 最后登录2006-01-07
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-15 23:10
还没开始写,我也帮不了你。 :o
游客

返回顶部