c# - 如何保持 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。我没有给出整个代码,因为它是一个大块。但如果你告诉我你想要它,我可以一块一块地给它。
任何帮助表示赞赏。
解决方案
推荐阅读
- python - Python variable declared in 'for' loop not seen outside of loop
- c# - 如何超越上下文菜单和 MultiSelectModel 100 个文件限制?
- pdf - Ghostscript 无法将 PDF 转换为 PNG:nostringval
- swift - SwiftUI Calling functions from other class
- eclipse-plugin - Eclipse 编辑器 - 隐藏部分行
- python - Python - 如何将二叉树转换为保持相同信息的 N 叉树
- python - 在python中以奇数和偶数升序对列表进行排序
- sql - 将变量作为参数传递给 varchar(),如 cast(column1 as varchar(@variable))
- java - Spring Cloud PubSub 无法发布到队列
- sql - ADD COLUMN 查询中 COLUMN 附近的语法不正确