.NET:从串行端口读取数据

3

我正在使用类似于以下代码的方式阅读通过串行端口(即COM3)发送的数据:

_serialPort.PortName = "COM3";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();

从串口传来的数据是命令,可以是以 '\0' 结尾的任意长度字符串。我正在寻找如何有效读取这些数据的最佳实践方法。我认为生产者/消费者模式可能是最好的选择,其中:

  1. 每次 DataReceived 事件触发时,我从端口读取字符串并将其附加到一个字符串缓冲区或其他结构中
  2. 然后我有另一个线程不断检查字符串缓冲区或结构中的 char '\0',如果找到,则解析并删除命令字符串。

这是处理此类数据的最有效方法吗?是否有任何不依赖于 DataReceived 事件的阻塞串行读取函数?


1
看起来可以使用SerialPort.NewLine来确定何时触发dataReceived事件。我认为这非常有用。 - mike01010
1个回答

5
我发现dataReceived事件有时会触发过于频繁,当代码在事件中运行时会阻塞SerialPort。你可能需要这个功能,但以下更多信息可能或可能不是有用的。
我使用一个Timer,通常在10 Hz。在Timer中,我检查SerialPort.BytesToRead > 0。然后我使用SerialPort.ReadLine读取一行文本并保存了大量处理入站缓冲区的代码。
如果你循环直到BytesToRead == 0,每次读取一行,将其读入缓冲区以供稍后处理,或者在读取后直接进行处理。
在你的示例中,ReadTimeout属性非常有用,如果你知道Arduino构建一行文本所需的时间,并且如果只收到部分行在ReadTimeout内,则会引发异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接