我想通过 USB 向/从 Arduino 写入二进制传输到另一端。现在,我在用 ASCII 码做,很简单。使用ASCII,您可以看到垃圾,直到两侧同步。但是对于二进制,很难区分数据和噪声。是否有一些标准方法来重置连接并获得可靠的字节流?我可以发送一个休息时间并强制 Arduino 以某种方式重置吗?只是在寻找有关最佳实践的建议。
问问题
614 次
2 回答
0
为了可靠的通信,您需要在二进制数据中包含一些协议,以便
- 你知道什么时候出了问题
- 你可以恢复同步
例如,点对点协议 (PPP)提供了一种简单的方法来构建数据部分,方法是用一个特殊字符包围它们,保证在二进制流中永远不会单独出现(有一个转义机制允许这种情况发生)。接收器可以使用成帧字符进行同步。
您也可以(取决于错误数据通过时的严重程度)为您的消息添加校验和或 CRC - PPP 将其称为帧校验序列或 FCS。
于 2013-05-15T10:28:11.320 回答
0
如果你真的想推出你自己的协议,你想成为真正的 8 位能力,你必须做一些事情。如果您处于数据永远不会丢失的理想世界中,那就更简单了,但事实并非如此!
- 您必须转义两个字符字节,例如 X 和 Z。每次您想要发送 X 时,您发送 Z1,而当您想要发送 Z 时,您发送 Z2。这样你就永远不会发送一个普通的 X
- 现在您可以使用完全唯一的标识符 X 开始每条消息
- 接收者现在可以等待 X,并开始收集字节。每次看到 Z 时,它都必须读取一个额外的字节并解码数字以获得真正的字节
- 现在,每条消息都以一个标题开始,解释该消息将包含多少数据,以及一个校验和。阅读器应在达到指定数字时停止阅读,如果校验和失败,则丢弃所有内容。
- 在标题之后,你把你的数据
请注意,使用结构来序列化数据被认为是不安全的,并且如果您跨越架构边界(打包不同),通常会中断。
于 2013-05-16T04:58:25.113 回答