hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:9460回复:34

请教如何做虚拟串口驱动?

楼主#
更多 发布于:2004-04-21 11:14
我用driverstudio自动生成了一个驱动,什么也没有改动
我把inf文件里面的
class和classguid改成

Class=Ports
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318}

然后在设备管理器里面看有我的驱动了,后面括号里面有com4。
哦,还有就是处理ioctl消息的地方,我没写,只是把返回值写成SUCCESS。请问各位高手,还有什么问题?

我没什么分。。谢谢大家了

[编辑 -  4/22/04 by  hezhenwei]

最新喜欢:

yushui213yushui...
peng-lai
驱动牛犊
驱动牛犊
  • 注册日期2007-07-17
  • 最后登录2007-08-03
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-27 10:55
请问 在虚拟串口中怎么加入端口设置的选项卡
peng-lai
驱动牛犊
驱动牛犊
  • 注册日期2007-07-17
  • 最后登录2007-08-03
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-25 14:28
顶一个
yan_hg
驱动牛犊
驱动牛犊
  • 注册日期2006-10-20
  • 最后登录2008-06-29
  • 粉丝0
  • 关注0
  • 积分385分
  • 威望47点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-14 14:52
我这样做是能打开虚拟串口了,但是串口调试助手报错: SetCommTimeouts()  Failed...............
当然这也正常,我还没有添加对应的驱动程序成员函数呢

想问一下,虚拟串口驱动程序里,都要添加什么irp处理函数????????
请教????????
yan_hg
驱动牛犊
驱动牛犊
  • 注册日期2006-10-20
  • 最后登录2008-06-29
  • 粉丝0
  • 关注0
  • 积分385分
  • 威望47点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-30 16:57
把inf文件里面的
class和classguid改成

Class=Ports
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318}

然后在adddevice 里面用 pDevice->createlink(\"com4\")

就可以了用串口调试工具打开了吗?
我也这样做了怎么串口调试助手还是打不开虚拟串口啊?????????????????????????

刚在做虚拟串口,请高人们指点一二
kb219
驱动牛犊
驱动牛犊
  • 注册日期2004-08-17
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分208分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-05 14:53
楼主,你说拨号是,用modem拨号上网吗?

我在挂断的时候遇到老多问题,能否交流一下?
jickknight
驱动牛犊
驱动牛犊
  • 注册日期2004-05-03
  • 最后登录2005-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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,截获不了这些信息,对吗!?
Chasing my dreams!
kinciom
驱动牛犊
驱动牛犊
  • 注册日期2004-02-07
  • 最后登录2006-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-03 22:06
TO hezhewei:
 我加了pDevice->createlink(\"com6\"),因为我的电脑有COM1和COM4;
在装置管理员中却看到COM5,打开系统的终端机时却找不到COM5或COM6,不知怎么回事,请指教。能否看看你的代码?
kinciom@163.com
谢谢。
zhylhy
驱动牛犊
驱动牛犊
  • 注册日期2004-05-24
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-02 22:28
我想问一下为什么虚拟串口要用总线来枚举呢?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-29 10:42
把软件(包括inf文件)贴出来吧,看出在什么地方
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-09 15:14
哦,不能拨号是我线没插。。。
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-28 12:15
还是不成功。。各位大人帮忙看看什么原因哦。。。谢谢了
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-24 21:12
奇怪,我现在拨号也不行了。。。(COM4)
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-24 10:12
先打开portmon,并且在capture中选择你要监视的串口,然后再打开串口调试工具。
超级肥雀
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-23 10:49
还有一点就是,我用串口调试工具调试,我发送数据,可是就是没有调用write过程。奇怪哦
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-04-23 09:29
我用那个portmon察看,可是他说
could not attach to COM4: device may be in use

这是什么原因呢?
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-23 08:26
呵呵,我看driverWorks的帮助,说
Irp.IoctlBuffer()
返回的就是Irp->AssociatedIrp.SystemBuffer的引用,所以我想这个没问题吧。
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-04-22 16:45
S = (PSERIAL_STATUS)Irp->AssociatedIrp.SystemBuffer;
这里不一样。
你的是pCommStatus = (SERIAL_STATUS*)I.IoctlBuffer();

超级肥雀
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-22 16:25
我也是2000.
我看来看去唯一的不同就是AmountInOutQueue
我写的是他和AmountInInQueue一样。
会不会有问题?
会不会不允许同时为非0?
我试试看

另外谢谢你帮我啊,我发表的时候只有1分,但是现在有30多分了,一会我全给你。
上一页
游客

返回顶部