【发布时间】:2011-04-13 14:27:38
【问题描述】:
saga 继续...
我很快就得出结论,我的串行设备太苛刻了,不能很好地与System.IO.Ports 提供的SerialPort 类配合使用。
为了令人信服地将自己伪装成供应商提供的软件,我试图匹配Portmon (logs here) 和HHD's Free Serial Monitor 记录的对话的各个方面。使用托管 (.NET) 库,我无法复制以下内容:
- 特殊字符。如a separate question 中所述,SerialPort 不允许更改特殊字符集。是likely that it's irrelevant,但我希望能够断然拒绝。
-
细粒度超时。与described on MSDN 一样,有 5 种超时设置决定了结果行为:
-
ReadIntervalTimeout(RI) -
ReadTotalTimeoutMultiplier(RM) -
ReadTotalTimeoutConstant(RC) -
WriteTotalTimeoutMultiplier(WM) -
WriteTotalTimeoutConstant(厕所)。
SerialPort.WriteTimeout(int)和SerialPort.ReadTimeout(int)只改变WC 和RC 设置,这是一个小问题,但它并没有将其他设置为0,而是将RI 和RM 设置为-1。 -
端口开放期间的查询。在打开端口和设置波特率之间,我的 (.NET) 应用程序和供应商提供的应用程序都会执行一系列查询,例如
IOCTL_SERIAL_GET_LINE_CONTROL。 .NET 添加了一些供应商的应用程序没有做的事情,例如IOCTL_SERIAL_GET_MODEMSTATUS。我希望能够阻止这种情况。多余的重复。在端口打开期间,.NET 出于某种原因重复了一组命令(设置线路控制、波特、特殊字符和握手、清除 RTS 和 DTR)。供应商提供的软件在运行此块一次后直接跳转。
就像我上面所说的,我不知道这些差异是否是导致我陷入困境的原因,但我希望能够找出答案。更重要的是,我认为更好地控制流程将使我能够真正解决问题,无论结果如何。
那么我的问题是,我如何直接连接到正确的 API 以在具体细节级别控制串行端口?任何建议或指导表示赞赏!
【问题讨论】:
-
直接处理串口的Win32 API很丑。虽然我为你接受挑战而鼓掌,但我可能会在你冒险之前推荐一个第 3 部分组件。我使用 CommStudio 已经有一段时间了,它非常适合我对定制硬件的需求。 commstudio.com/commstudio
-
感谢您的好意,但我买不起。
-
哈哈!太好了-谢谢布拉德!我会试试看的。
标签: .net api serial-port unmanaged