0

我想通过 USB 向/从 Arduino 写入二进制传输到另一端。现在,我在用 ASCII 码做,很简单。使用ASCII,您可以看到垃圾,直到两侧同步。但是对于二进制,很难区分数据和噪声。是否有一些标准方法来重置连接并获得可靠的字节流?我可以发送一个休息时间并强制 Arduino 以某种方式重置吗?只是在寻找有关最佳实践的建议。

4

2 回答 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 回答