传奇仍在继续...
我很快得出结论,我的串行设备太挑剔了,无法与
SerialPort
提供的 System.IO.Ports
类很好地配合。
为了令人信服地将自己冒充为供应商提供的软件,我尝试匹配由 Portmon(此处记录)和 HHD 的免费串行监视器 记录的对话的各个方面。使用托管 (.NET) 库,我无法复制以下内容:
细粒度超时。正如 MSDN 上所描述的,有 5 种超时设置决定了结果行为:
ReadIntervalTimeout
ReadTotalTimeoutMultiplier
ReadTotalTimeoutConstant
WriteTotalTimeoutMultiplier
WriteTotalTimeoutConstant
SerialPort.WriteTimeout(int)
和
SerialPort.ReadTimeout(int)
仅更改WC和RC设置,这是一个小问题,但.NET不会将其他设置保留为0,而是将RI和RM设置为-1。
。在打开端口和设置波特之间,我的 (.NET) 应用程序和供应商提供的应用程序都会执行一系列查询,例如 IOCTL_SERIAL_GET_LINE_CONTROL
。 .NET 添加了一些供应商的应用程序不具备的功能,例如
IOCTL_SERIAL_GET_MODEMSTATUS
。我希望能够阻止这一切。
。在端口打开期间,.NET 由于某种原因会重复一组命令(设置线路控制、波特率、特殊字符和握手、清除 RTS 和 DTR)。供应商提供的软件在运行此块一次后直接跳入。
我的问题是,如何直接连接到正确的 API 以在具体层面上控制串行端口?任何建议或指导表示赞赏!