提问者:小点点

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


我正在使用如下代码读取发送到串行端口(即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. 然后我有另一个线程不断检查字符串缓冲区或结构中的字符“\0”,如果找到,则解析并删除命令字符串。

这是处理此问题的最有效方法吗?是否有任何类型的阻塞串行读取功能不依赖于 dataReceived 事件?


共1个答案

匿名用户

我发现dataReceiave事件可能会频繁触发,并且在事件中运行代码时确实会阻止SerialPort。你说你可能想要这个功能,但这里有更多可能有用或可能不有用的信息。

我使用定时器,通常在10

如果您循环直到BytesToread==0,则将每一行读入缓冲区以供以后处理或在读取后直接处理。

如果您知道Arduino构造一行文本需要多长时间,并且如果在ReadTimeout中仅接收到一行的一部分,则示例中的Read Timeout属性非常有用。