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 事件的阻塞串行读取功能?

4

1 回答 1

5

我发现该dataReceieved事件可能会过于频繁地触发并且确实会阻止SerialPort代码在事件中运行的时间。你说你可能想要这个功能,但这里有更多可能有用也可能没用的信息。

我使用 a Timer,通常为 10  Hz。在中Timer,我检查SerialPort.BytesToRead > 0。然后我使用SerialPort.ReadLinewhich 读取一行文本并保存大量代码来处理入站缓冲区。

如果您使用Loopuntil BytesToRead == 0,则将每一行读入缓冲区以供以后处理或在读取后直接处理。

如果ReadTimeout您知道 Arduino 构建一行文本需要多长时间,并且Exception如果仅在ReadTimeout.

于 2012-09-25T17:18:12.817 回答