我正在使用如下代码读取发送到串行端口(即 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'结尾的任意长度的字符串。我正在寻找有关如何有效读取此类数据的最佳实践。我认为生产者/消费者模式可能是最好的,其中:
- 每次触发 DataReceived 事件时,我都会从端口读取字符串并将其附加到字符串缓冲区或其他一些结构
- 然后我有另一个线程不断检查字符串缓冲区或结构中的字符“\0”,如果找到,则解析并删除命令字符串。
这是处理此问题的最有效方法吗?是否有任何不依赖于 dataReceived 事件的阻塞串行读取函数?
最佳答案
我发现 dataReceieved
事件触发得太频繁,并且当代码在该事件中运行时会阻塞 SerialPort
。你说你可能想要这个功能,但这里有更多信息可能有用也可能没用。
我使用计时器
,通常在 10 Hz .在 Timer
中,我检查了 SerialPort.BytesToRead > 0
。然后我使用 SerialPort.ReadLine
读取一行文本并节省大量代码来处理入站缓冲区。
如果您循环
直到BytesToRead == 0
,将每一行读入缓冲区以供稍后处理或在读取后直接处理。
示例中的 ReadTimeout
属性在您知道 Arduino 构造一行文本需要多长时间时非常有用,如果只有部分文本会导致 Exception
在 ReadTimeout
内收到行。
关于.NET:从串口读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576292/