阅读:18299回复:53
串口转网口驱动开发成功!发文庆祝!
多谢acidfish大虾的虚拟串口。
多谢本网站上的TDIcln的例子。 |
|
|
沙发#
发布于:2004-04-27 13:54
acidfish大虾的虚拟串口
|
|
|
板凳#
发布于:2004-04-27 13:55
本网站上的TDIcln的例子
|
|
|
地板#
发布于:2004-04-30 13:45
是这样子的,发往串口的数据从网卡走了。
串口那一部分和acidfish大虾的是一样的,只是添加了TDI的一些功能。 在打开串口的时候,就与服务器建立连接了,然后用户发送的数据就调用TdiBuildSend()发送到网口。 设置了一个事件clienteventreceive,当网口有数据来时把数据存储在自己的一个缓冲区里备用。当用户要读数据时,就从这个缓冲区里取出数据完成读请求。 其实我也是个新手,虽然我在这个论坛注册比较早。但是中间有2年并没有作驱动。很多东西自己还是稀里糊涂的,很着急。 |
|
|
地下室#
发布于:2004-05-08 13:15
1、如果把网络功能写在驱动内,如何加载网络功能到虚拟串口驱动中?你说可以用TDI,它能指定Socket吗? 不知道在驱动里,能否加入winsocket的编程? 1.TDI有些函数是与应用层的socket编程中的函数一一对应的。 例如在驱动中可以调用TDI_ACCEPT,TDI_CONNECT等。可以使用TDI的函数指定对方的IP地址,端口号等。看看DDK的文档就清楚了。 2。acidfish大虾的程序中,自己设定了几个IOCTL,自己的串口驱动程序收到某个IOCTL后就会有相应的动作,而标准的串口没有这个IOCTL,不会对这个IOCTL做出反应,这样就能区分自己的虚拟串口和原有的标准串口了。你可以看看他的test.c 如果你要在应用层转发的话,可以编写一个守护程序,这个守护程序维护一个缓冲区。应用程序发给虚拟串口的数据,你把它都发到守护程序维护的缓冲区中。守护程序的作用就是把你发到缓冲区中的数据发到网络上去。 [编辑 - 5/8/04 by lingzjl] |
|
|
5楼#
发布于:2004-05-14 17:59
我用了整整一个月。
以前做过Linux的简单驱动,要不然花费的时间要更长。DDK文档是个好东西! |
|
|
6楼#
发布于:2004-05-14 18:04
http://www.soft32.com/download_6128.html
试用版的虚拟串口程序 |
|
|
7楼#
发布于:2004-05-18 17:21
1.我用的是DDK.
2.可以直接使用,不用想太多 3.应用程序向串口写数据时:DriverObject->MajorFunction[IRP_MJ_READ]
没错! |
|
|
8楼#
发布于: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会失败返回。 |
|
|
9楼#
发布于:2004-05-27 11:36
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵 你的if不成立,呵呵 |
|
|