gpt4 book ai didi

c# - 如何在 .NET 中正确读取串行端口

转载 作者:行者123 更新时间:2023-11-30 13:26:21 25 4
gpt4 key购买 nike

我很尴尬不得不问这样的问题,但我很难弄清楚如何使用 .NET SerialPort 类通过串行端口可靠地读取数据。

我的第一种方法:

static void Main(string[] args)
{
_port = new SerialPort
{
PortName = portName,
BaudRate = 57600,
DataBits = 8,
Parity = Parity.None,
StopBits = StopBits.One,
RtsEnable = true,
DtrEnable = false,
WriteBufferSize = 2048,
ReadBufferSize = 2048,
ReceivedBytesThreshold = 1,
ReadTimeout = 5000,
};

_port.DataReceived += _port_DataReceived;
_port.Open();

// whatever
}

private void _port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var buf = new byte[_port.BytesToRead];
var bytesRead = _port.Read(buf, 0, buf.Length);

_port.DiscardInBuffer();
for (int i = 0; i < bytesRead; ++i)
{
// read each byte, look for start/end values,
// signal complete packet event if/when end is found
}
}

所以这有一个明显的问题;我正在调用 DiscardInBuffer,因此事件触发后进入的任何数据都将被丢弃,即我正在删除数据。

现在,the documentation for SerialPort.Read()甚至没有说明它是否推进了流的当前位置(真的吗?),但我发现其他来源声称它确实如此(这是有道理的)。但是,如果我不调用 DiscardInBuffer,我最终会收到 RXOver 错误,即我处理每条消息的时间太长,缓冲区溢出。

所以...我真的不喜欢这个界面。如果我必须在单独的线程上处理每个缓冲区,我会这样做,但这会带来一系列问题,我希望我遗漏了一些东西,因为我对这个界面没有太多经验。

最佳答案

Jason 在减少从工作线程访问 UI 方面提出了一些很好的观点,但更好的选择是首先不在工作线程上接收数据。

使用 port.BaseStream.ReadAsync 在您想要的线程上以事件驱动的方式获取数据。我在 http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport 上写了更多关于这种方法的文章。

关于c# - 如何在 .NET 中正确读取串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com