繁体   English   中英

.NET中SerialPort类的问题

[英]Problems with SerialPort class in .NET

我正在尝试诊断为什么某些USB串行端口适配器不能与.NET一起正常工作。 受影响的适配器的行为在SerialPort.Write() 调用任何SerialPort.Readxxx()方法都会导致该方法阻塞,直到大约ReadTimout 我发现的解决方法是在BytesToRead <= 0时使用循环阻止,然后一切都按预期方式工作。 为什么?

我已经使用SysinternalsPortmon收集了一些调试日志 为什么会这样呢?

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到串行适配器完美配合。

本机ReadByte()

读取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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM