saga继续......
我很快得出的结论是,我的串口设备过于苛刻,无法与SerialPort
提供的System.IO.Ports
类完美匹配。
为了令人信服地将自己作为供应商提供的软件,我试图匹配Portmon(logs here)和HHD's Free Serial Monitor所记录的对话的每个方面。使用托管(.NET)库,我无法复制以下内容:
细粒度超时。作为described on MSDN,有5个超时设置决定了最终的行为:
ReadIntervalTimeout
(RI)ReadTotalTimeoutMultiplier
(RM)ReadTotalTimeoutConstant
(RC)WriteTotalTimeoutMultiplier
(WM)WriteTotalTimeoutConstant
(WC)。 SerialPort.WriteTimeout(int)
和SerialPort.ReadTimeout(int)
仅更改WC和RC设置,这是一个小问题,但它不是将其他设置保留为0,.NET设置将RI和RM设置为-1。 / p>
端口打开期间的查询。在打开端口和设置波特率之间,我的(.NET)应用程序和供应商提供的应用程序都会执行一堆查询,例如IOCTL_SERIAL_GET_LINE_CONTROL
。 .NET增加了一些供应商的应用程序无法做到的事情,例如IOCTL_SERIAL_GET_MODEMSTATUS
。我希望能够阻止这一点。
多余的重复。在端口打开期间,.NET会出于某种原因重复命令块(设置线路控制,波特,特殊字符和握手,清除RTS和DTR)。运行此块后,供应商提供的软件会直接跳转。
就像我上面说过的那样,我不知道这些差异是否是造成我困境的原因,但我希望能够找到答案。更重要的是,我认为对这个过程有更大的控制权,这将使我能够真正磨练这个问题,无论结果如何。
我的问题是,如何直接挂钩到正确的API来控制串口的螺母和螺栓?任何建议或指导赞赏!
答案 0 :(得分:0)
自从我完成连续剧以来已经很长时间了,但我记得这个人是一个非常好的资源 - 网站http://www.lvr.com/serport.htm。希望有所帮助。
答案 1 :(得分:0)
由于此主题处于活动状态似乎已经有一段时间了,但由于它没有解决方案,我认为我会回答完整性问题。
重新初始化的问题是因为SerialPort类使用的默认握手,我不知道它为什么这样做,但它真的很烦人,你可以通过跳过SerialPort属性并直接钻研来解决这个问题进入DCB结构。
我已经在C#中创建了一个完整的SerialPort类扩展方法的类,看一下我的回答over here on CodeProject
如果你决定走这条路,我建议直接跳过SerialPort.Write到SerialPort.BaseStream.Write,它们采用相同的参数,但我很确定SerialPort类会做额外不必要的初始化东西在那里,对SerialPort.Read做同样的事。