【发布时间】:2012-03-21 20:00:41
【问题描述】:
我正在尝试诊断为什么某些 USB 串行端口适配器不能很好地与 .NET 配合使用。受影响适配器的行为在SerialPort.Write() 之后。调用任何
SerialPort.Readxxx() 方法导致该方法阻塞直到大约 ReadTimout。
我发现的解决方法是使用循环阻止 BytesToRead 是
<= 0,然后一切都按预期工作。为什么?
我使用Sysinternals'Portmon 收集了some debug logs。为什么会这样?
without.log = bad behavior/bad USB adapter
with.log = with the while loop/bad USB adapter
ftdi.log = good behavior/good USB adapter
我编写了 ReadByte() 的两个本机实现,现在可以更好地描述问题。 将 ReadIntervalTimeout 和 ReadTotalTimeoutMultiplier 设置为 MAXDWORD ReadFile(),它是 应该等到一个字节在接收缓冲区中并按照 MSDN 中的描述返回 COMMTIMEOUTS 结构页面。
Portmon 日志显示这是 ReadByte() 设置串行端口的方式。但如果 当调用 ReadFile() 时接收缓冲区为空 ReadFile() 它等到 ReadTotalTimeoutConstant 然后返回。 微软的 ReadByte() 也设置了一个 Comm 事件; Portmon 日志清楚地显示事件正在触发,但 ReadByte() 从不读取接收缓冲区。我在本机版本的 ReadByte() 中实现了这一点,它与受影响的 USB 转串口适配器完美配合。
【问题讨论】:
标签: c# .net debugging usb serial-port