首页 > 解决方案 > 如何保持 c# 和 ardunio 通信同步?

问题描述

我正在编写一个简单的应用程序,其中 Ardunio 使用简单的 serial.write() 将读取数据发送到 C# 程序。我使用特殊语法从 Ardunio 发送数据,c# 程序读取并解释它并最终绘制数据图表。

例如,Arduino 程序发送数据

Serial.write("DATA 1 3 90;");

这意味着:图表 1 中的 X 值和 Y 值分别为 3 和 90。并且 c# 程序使用

private async void Serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    await serialport.BaseStream.ReadAsync(buffer, 0, 1024);

    await Task.Run(() => Graph()); // Graph function graphs the data

}

在 graph() 函数中,我使用 Encode.ASCII.GetString(buffer); 将缓冲区转换为字符串;并用语法和东西解释数据。但由于某种原因,要么 c# 程序读取速度不够快,要么 Arduino 发送速度不够快,消息有时会中断例如我收到的数据包是:

DATA 2 5 90;DATA 5 90 10;DATA 1 1 <|-------- 我无法获得最后一个 Y 值

下一个数据模块以

75;数据 5 4 60;数据 14 5 6;数据

/\

|

+===================== 在这里

顺便说一句,所有数据包都是 32 字节。

所以我要么需要逐行获取数据,但我不能这样做,因为 ardunio 发送它太快了

 Serial.write("DATA 1 3 90;");
 Serial.write("DATA 2 4 40;");

来到 C# 为 DATA 1 3 90;DATA 2 4 40; 作为一个整体。还是我需要一次全部搞定?

(我更喜欢逐行获取)

更新:

当延迟(1000);在发送之间添加。数据被正确处理。如果没有延迟,Arduino 发送数据太快,数据会聚集和中断。如何确保数据没有延迟,但数据可靠且没有中断?

更新 2:

当缓冲区大小增加到 100 * 1024 * 1024 以及 ReadAsync 方法中的 readCount 时,读取消息仍然要大得多,尽管有中断。

我可以给你任何额外的信息。

更新 3:

我将尝试回答评论;

首先,我已经在这样做了,我忘了提及它。我从分号中拆分传入的数据,并使用 foreach 循环一一解释它们

其次,我在全局范围内使用缓冲区,而不是将其作为参数传递给图形函数

第三,我会尝试 Serial.PrintLine 并给你反馈

更新 4:

我能够通过用 Serial.ReadLine() 替换 ReadAsync 和用 serial.printline() 替换 serial.write 来解决问题;Hans Passant 提出了解决方案

更新 5:

我仍然遇到同样的问题,但不同。图形函数是异步的,所以当我如此快速地写入数据时,我会错过一些试图绘制图形和读取其他数据的数据。

也因为图形函数是异步图表控件绘制没有顺序的点并且图形变得混乱。

如果我在 Serial.println() 之间添加延迟(50),这很容易解决

PS。我没有给出整个代码,因为它是一个大块。但如果你告诉我你想要它,我可以一块一块地给它。

任何帮助表示赞赏。

标签: c#

解决方案


推荐阅读