.NET:从串口读取数据

标签 .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();

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

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

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

最佳答案

我发现 dataReceieved 事件触发得太频繁,并且当代码在该事件中运行时会阻塞 SerialPort。你说你可能想要这个功能,但这里有更多信息可能有用也可能没用。

我使用计时器,通常在 10 Hz .在 Timer 中,我检查了 SerialPort.BytesToRead > 0。然后我使用 SerialPort.ReadLine 读取一行文本并节省大量代码来处理入站缓冲区。

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

示例中的 ReadTimeout 属性在您知道 Arduino 构造一行文本需要多长时间时非常有用,如果只有部分文本会导致 ExceptionReadTimeout 内收到行。

关于.NET:从串口读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576292/

相关文章:

c# - asp.net 图像发布后未加载

c# - 如何在 C# 中模拟 C++ union ?

Java SerialPort 通信,接收器上的输入字节错误

java - 读取rs232时随机换行

c++ - 如何从方法返回未知大小的字节数组

c# - 构造函数中的抽象类型而不是具体类型

c# - UltraGrid 过滤器单元格属性

bash - 在 bash 中使用管道缓冲来自串行设备的数据

java - 通过蓝牙将数据从Arduino发送到Java程序

arduino - Arduino 串行是否需要一个共同点