lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:18299回复:53

串口转网口驱动开发成功!发文庆祝!

楼主#
更多 发布于:2004-04-15 17:57
多谢acidfish大虾的虚拟串口。
多谢本网站上的TDIcln的例子。

最新喜欢:

tanrantanran duguxunduguxu... seven11seven1...
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-27 13:54
acidfish大虾的虚拟串口
附件名称/大小 下载次数 最后更新
2004-04-27_2004-01-16_SimSerial.rar (228KB)  134690
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-27 13:55
本网站上的TDIcln的例子
附件名称/大小 下载次数 最后更新
2004-04-27_znsoft_TDIClient.zip (80KB)  145586
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-30 13:45
是这样子的,发往串口的数据从网卡走了。
串口那一部分和acidfish大虾的是一样的,只是添加了TDI的一些功能。
在打开串口的时候,就与服务器建立连接了,然后用户发送的数据就调用TdiBuildSend()发送到网口。
设置了一个事件clienteventreceive,当网口有数据来时把数据存储在自己的一个缓冲区里备用。当用户要读数据时,就从这个缓冲区里取出数据完成读请求。

其实我也是个新手,虽然我在这个论坛注册比较早。但是中间有2年并没有作驱动。很多东西自己还是稀里糊涂的,很着急。
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-08 13:15
 
1、如果把网络功能写在驱动内,如何加载网络功能到虚拟串口驱动中?你说可以用TDI,它能指定Socket吗? 不知道在驱动里,能否加入winsocket的编程?
2、如果是在外面,在管理软件中实现转发(或者说在win32程序中),如何枚举虚拟串口?如何转发串口的信息到网络(TCP/IP的socket中)?

 

1.TDI有些函数是与应用层的socket编程中的函数一一对应的。
例如在驱动中可以调用TDI_ACCEPT,TDI_CONNECT等。可以使用TDI的函数指定对方的IP地址,端口号等。看看DDK的文档就清楚了。
2。acidfish大虾的程序中,自己设定了几个IOCTL,自己的串口驱动程序收到某个IOCTL后就会有相应的动作,而标准的串口没有这个IOCTL,不会对这个IOCTL做出反应,这样就能区分自己的虚拟串口和原有的标准串口了。你可以看看他的test.c
如果你要在应用层转发的话,可以编写一个守护程序,这个守护程序维护一个缓冲区。应用程序发给虚拟串口的数据,你把它都发到守护程序维护的缓冲区中。守护程序的作用就是把你发到缓冲区中的数据发到网络上去。


[编辑 -  5/8/04 by  lingzjl]
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-14 17:59
我用了整整一个月。
以前做过Linux的简单驱动,要不然花费的时间要更长。DDK文档是个好东西!
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-14 18:04
http://www.soft32.com/download_6128.html
试用版的虚拟串口程序
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-18 17:21
1.我用的是DDK.
2.可以直接使用,不用想太多
3.应用程序向串口写数据时:DriverObject->MajorFunction[IRP_MJ_READ]


    

当网口有东西来,因为有之前做过set_eventhandler,所以会由系统发irp包,进入(设定得)例程里,对吗!?


没错!
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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会失败返回。
超级肥雀
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-27 11:36



  
楼主,如果不涉及到公司和个人利益,并且您愿意的话,能否将源码贴出来供大家学习一下,我也可沾光!呵呵

谢谢!


你的if不成立,呵呵
超级肥雀
游客

返回顶部