[英]Problems with SerialPort class in .NET
我正在尝试诊断为什么某些USB串行端口适配器不能与.NET一起正常工作。 受影响的适配器的行为在SerialPort.Write()
。 调用任何SerialPort.Readxxx()
方法都会导致该方法阻塞,直到大约ReadTimout
。 我发现的解决方法是在BytesToRead
<= 0
时使用循环阻止,然后一切都按预期方式工作。 为什么?
我已经使用Sysinternals的Portmon收集了一些调试日志 。 为什么会这样呢?
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()时接收缓冲区为空,它将等待直到ReadTotalTimeoutConstant,然后返回。 微软的ReadByte()也设置了一个Comm事件。 Portmon日志清楚地显示了事件正在触发,但是ReadByte()从不读取接收缓冲区。 我在本机版本的ReadByte()中实现了此功能,它可以与受影响的USB到串行适配器完美配合。
读取SerialPort的最佳方法是使用异步方法:
_port = new SerialPort();
_port.DataReceived += new SerialDataReceivedEventHandler(OnComPortDataReceived);
void OnComPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] ba = new byte[_port.BytesToRead];
total = _port.Read(ba, 0, _port.BytesToRead);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.