.NET:从串口读取数据

mik*_*010 3 .net serial-port arduino .net-gadgeteer

我正在使用以下代码读取发送到串行端口(即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();
Run Code Online (Sandbox Code Playgroud)

来自该串行端口的数据是命令,可以是以'\ 0'结尾的任何长度的字符串.我正在寻找有关如何有效读取此类数据的最佳实践.我认为生产者/消费者模式可能是最好的,其中:

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

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

Vis*_*cro 5

我发现dataReceieved事件可能会经常发生并且阻止SerialPort代码在事件中运行的时间.您说您可能想要此功能,但这里有更多可能有用或可能没用的信息.

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

如果Loop直到BytesToRead == 0,将每行读入缓冲区以供以后处理或在读取后直接处理.

ReadTimeout如果您知道Arduino构造一行文本需要多长时间并且将导致Exception只有部分行被接收,则示例中的属性很有用ReadTimeout.