阅读:9460回复:34
请教如何做虚拟串口驱动?
我用driverstudio自动生成了一个驱动,什么也没有改动
我把inf文件里面的 class和classguid改成 Class=Ports ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} 然后在设备管理器里面看有我的驱动了,后面括号里面有com4。 哦,还有就是处理ioctl消息的地方,我没写,只是把返回值写成SUCCESS。请问各位高手,还有什么问题? 我没什么分。。谢谢大家了 [编辑 - 4/22/04 by hezhenwei] |
|
最新喜欢:![]() |
沙发#
发布于:2007-07-27 10:55
请问 在虚拟串口中怎么加入端口设置的选项卡
|
|
板凳#
发布于:2007-07-25 14:28
顶一个
|
|
地板#
发布于:2007-05-14 14:52
我这样做是能打开虚拟串口了,但是串口调试助手报错: SetCommTimeouts() Failed...............
当然这也正常,我还没有添加对应的驱动程序成员函数呢 想问一下,虚拟串口驱动程序里,都要添加什么irp处理函数???????? 请教???????? |
|
地下室#
发布于:2007-04-30 16:57
把inf文件里面的
class和classguid改成 Class=Ports ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} 然后在adddevice 里面用 pDevice->createlink(\"com4\") 就可以了用串口调试工具打开了吗? 我也这样做了怎么串口调试助手还是打不开虚拟串口啊????????????????????????? 刚在做虚拟串口,请高人们指点一二 |
|
5楼#
发布于:2005-06-05 14:53
楼主,你说拨号是,用modem拨号上网吗?
我在挂断的时候遇到老多问题,能否交流一下? |
|
6楼#
发布于:2004-06-08 15:36
2 0.00011482 ROCLink.exe IRP_MJ_CREATE
3 0.00001676 ROCLink.exe IOCTL_SERIAL_PURGE 4 0.00000587 ROCLink.exe IOCTL_SERIAL_GET_BAUD_RATE 5 0.00000670 ROCLink.exe IOCTL_SERIAL_GET_LINE_CONTROL 6 0.00000587 ROCLink.exe IOCTL_SERIAL_GET_CHARS 7 0.00000587 ROCLink.exe IOCTL_SERIAL_GET_HANDFLOW 8 0.00000587 ROCLink.exe IOCTL_SERIAL_GET_BAUD_RATE 9 0.00000587ROCLink.exeIOCTL_SERIAL_GET_LINE_CONTROL 10 0.00000503 ROCLink.exe IOCTL_SERIAL_GET_CHARS 11 0.00000503 ROCLink.exe IOCTL_SERIAL_GET_HANDFLOW 12 0.00001592 ROCLink.exe IOCTL_SERIAL_SET_BAUD_RATE 13 0.00001006 ROCLink.exe IOCTL_SERIAL_CLR_RTS 14 0.00000922 ROCLink.exe IOCTL_SERIAL_CLR_DTR 15 0.00000838 ROCLink.exe IOCTL_SERIAL_SET_LINE_CONTROL 16 0.00000587 ROCLink.exe IOCTL_SERIAL_SET_CHAR 17 0.00001592 ROCLink.exe IOCTL_SERIAL_SET_HANDFLOW 18 0.00000670 ROCLink.exe IOCTL_SERIAL_GET_WAIT_MASK 19 0.00000670 ROCLink.exe IOCTL_SERIAL_SET_WAIT_MASK 20 0.00000587 ROCLink.exe IOCTL_SERIAL_SET_QUEUE_SIZE 21 0.00002682 ROCLink.exe IOCTL_SERIAL_SET_TIMEOUTS SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0 22 0.00001341 ROCLink.exe IOCTL_SERIAL_PURGE 23 0.00001006 ROCLink.exe IOCTL_SERIAL_SET_RTS 24 0.00008213 ROCLink.exe IRP_MJ_WRITE 25 0.00003269 ROCLink.exe IOCTL_SERIAL_CLR_RTS 26 0.00003436 ROCLink.exe IRP_MJ_READ 27 0.00003185 ROCLink.exe IRP_MJ_READ 28 0.00003185 ROCLink.exe IRP_MJ_READ 29 0.00003185 ROCLink.exe IRP_MJ_READ …… 50 0.00003269 ROCLink.exe IRP_MJ_READ 51 0.00003185 ROCLink.exe IRP_MJ_READ 52 0.00003269 ROCLink.exe IRP_MJ_READ 53 0.00003185 ROCLink.exe IRP_MJ_READ 54 0.00003352 ROCLink.exe IRP_MJ_READ 这个是我要编的驱动,所要服务的win32程序的调用过程,请教高手 这里的读操作为什么这么多? 看前面的IOCTL_SERIAL_SET_WAIT_MASK 应该算是事件读方式,但是后面为什么一连串,这么多的读呢!? 中间的那些IOCTL_SERIAL_GET_COMMSTATUS 与IOCTL_SERIAL_WAIT_ON_MASK: 是内核态调用的东东吗!?portmon,截获不了这些信息,对吗!? |
|
|
7楼#
发布于:2004-06-03 22:06
TO hezhewei:
我加了pDevice->createlink(\"com6\"),因为我的电脑有COM1和COM4; 在装置管理员中却看到COM5,打开系统的终端机时却找不到COM5或COM6,不知怎么回事,请指教。能否看看你的代码? kinciom@163.com 谢谢。 |
|
8楼#
发布于:2004-06-02 22:28
我想问一下为什么虚拟串口要用总线来枚举呢?
|
|
9楼#
发布于:2004-05-29 10:42
把软件(包括inf文件)贴出来吧,看出在什么地方
|
|
|
10楼#
发布于:2004-05-09 15:14
哦,不能拨号是我线没插。。。
|
|
11楼#
发布于:2004-04-28 12:15
还是不成功。。各位大人帮忙看看什么原因哦。。。谢谢了
|
|
12楼#
发布于:2004-04-24 21:12
奇怪,我现在拨号也不行了。。。(COM4)
|
|
13楼#
发布于:2004-04-24 10:12
先打开portmon,并且在capture中选择你要监视的串口,然后再打开串口调试工具。
|
|
|
14楼#
发布于:2004-04-23 10:49
还有一点就是,我用串口调试工具调试,我发送数据,可是就是没有调用write过程。奇怪哦
|
|
15楼#
发布于:2004-04-23 09:29
我用那个portmon察看,可是他说
could not attach to COM4: device may be in use 这是什么原因呢? |
|
16楼#
发布于:2004-04-23 08:58
我昨天晚上自己写了个串口读写的工具,把winAPI所调用的ioctlcode对应关系看了一下。下面列出来大家参考
(下面对应的ioctlcode都省略了前面的IOCTL_SERIAL_) SetCommState get baud rate get line control get chars get handflow set baud rate clr rts clr dtr set line control set chars set handflow SetupComm set queue size SetCommTimeouts set timeouts FlushFileBuffers 调用 flushbuffers过程 PurgeComm purge SetCommMask set wait mask WaitCommEvent wait on mask transmitCommChar lsrmst_insert ClearCommError get commstatus GetCommConfig config size get baud rate get line control get chars get handflow SetCommConfig get baud rate get line control get chars get handflow set baud rate clr dtr set line control set chars set handflow ReadFile 调用read 好像还有23个,不过昨天晚上太困了,就没继续。 我看到只有ClearCommError发送了GET_COMMSTATUS的CODE,于是我自己调用ClearCommError察看返回的值。很奇怪 它的返回值也是20个字节的一个结构,可是和驱动写进去的不一样。 驱动写进去的应该是 SERIAL_STATUS 对吧,结构是 { LONG,LONG,LONG,LONG,BOOLEAN,BOOLEAN } 可是ClearCommError返回的是 COMMSTATUS结构 typedef struct _COMSTAT { DWORD fCtsHold : 1; // Tx waiting for CTS signal DWORD fDsrHold : 1; // Tx waiting for DSR signal DWORD fRlsdHold : 1; // Tx waiting for RLSD signal DWORD fXoffHold : 1; // Tx waiting, XOFF char received DWORD fXoffSent : 1; // Tx waiting, XOFF char sent DWORD fEof : 1; // EOF character sent DWORD fTxim : 1; // character waiting for Tx DWORD fReserved : 25; // reserved DWORD cbInQue; // bytes in input buffer DWORD cbOutQue; // bytes in output buffer } COMSTAT, *LPCOMSTAT; (摘自MSDN) 我将这个返回打印出来, cbInQue是10(就是我的驱动写进去的) fReserved 是 一个随机数, 其它都是0 那我想IOCTL_SERIAL_GET_COMMSTATUS 应该是正确返回了。 但是串口调试助手却不知什么原因不停的发送这个代码??? 还是不明白什么原因。 请高手多指教 [编辑 - 4/23/04 by hezhenwei] |
|
17楼#
发布于:2004-04-23 08:26
呵呵,我看driverWorks的帮助,说
Irp.IoctlBuffer() 返回的就是Irp->AssociatedIrp.SystemBuffer的引用,所以我想这个没问题吧。 |
|
18楼#
发布于:2004-04-22 16:45
S = (PSERIAL_STATUS)Irp->AssociatedIrp.SystemBuffer;
这里不一样。 你的是pCommStatus = (SERIAL_STATUS*)I.IoctlBuffer(); |
|
|
19楼#
发布于:2004-04-22 16:25
我也是2000.
我看来看去唯一的不同就是AmountInOutQueue 我写的是他和AmountInInQueue一样。 会不会有问题? 会不会不允许同时为非0? 我试试看 另外谢谢你帮我啊,我发表的时候只有1分,但是现在有30多分了,一会我全给你。 |
|
上一页
下一页