gpt4 book ai didi

C#串口通信协议(protocol)

转载 作者:行者123 更新时间:2023-11-30 14:59:04 25 4
gpt4 key购买 nike

我确实编写了一个小型 C# 应用程序,它从 COM 端口读取由 Arduino 板发送的一系列数字。

问题:

如果 Arduino 每 500 毫秒发送一个值,但我的 C# 程序每 1 秒读取一个值,那么 C# 不会落后于 Arduino 吗?如果这是真的,从 Arduino 发送的数据是存储在缓冲区中还是只是被丢弃?

[编辑]

下面是我用来从 COM 读取的代码


System.Windows.Forms.Timer tCOM;
...

tCOM.Interval = 1000;
tCOM.Tick += new System.EventHandler(this.timer1_Tick);
...

SerialPort port = new SerialPort();
port.PortName = defaultPortName;
port.BaudRate = 9600;
port.Open();
.....

private void timer1_Tick(object sender, EventArgs e)
{
log("Time to read from COM");

//read a string from serial port
string l;
if ((l = port.ReadLine()) != null)
{
......

}

}

最佳答案

串行端口通信通常需要流量控制。发送器知道接收器已准备好接收数据的一种方式。这一点经常被忽视,尤其是在 Arduino 项目中。这往往可以解决问题,串行端口非常慢,而与最初开始使用串行端口的机器相比,现代机器速度非常快。

但显然,在您的场景中,某些事情将会发生爆炸!一段时间后。当 PC 中的接收缓冲区填满容量时,您的 Arduino 将导致缓冲区溢出情况。这会导致无法挽回的数据丢失。监听这种情况的通知是经常被跳过的其他事情,您必须为 SerialPort.ErrorReceived 事件注册一个事件处理程序。在这种情况下,您会期望收到 SerialError.Overrun 通知。没有从这种情况中恢复的干净方法,需要进行完整的协议(protocol)重置。

有两种基本方法可以在串口上实现流量控制来避免这种错误。最常见的一种是使用硬件握手,使用 RTS(请求发送)和 CTS(清除发送)信号。由 Handshake.RequestToSend 提供。当接收缓冲区太满时,PC 将自动关闭 RTS 信号。你的 Arduino 必须注意 CTS 信号,当它关闭时不要发送任何东西。

第二种方式是软件握手,接收方发送一个特殊的字节来表示是否准备好接收数据。由 Handshake.XonXoff 提供,它使用标准控制字符 Xon (Ctrl+Q) 和 Xoff (Ctrl+S)。仅当通信协议(protocol)不在其数据中使用这些控制代码时才适用。换句话说,当您传输文本而不是二进制数据时。

第三种方法是一种完全不同的方法,也很常见,您让设备只在 PC 请求时才发送任何内容。一个主从协议(protocol)。接收缓冲区中有足够的空间用于响应很容易保证。您在协议(protocol)中指定特定的命令,即 PC 发送以查询特定数据项的命令。

关于C#串口通信协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17378908/

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