我正在开展一个项目,该项目涉及远程 Arduino 和计算机之间的大量数据通信。无线连接是通过一对 XBees 进行的,所以我们在 Arduino 和计算机之间有一个 RS232 链接。对于少量数据,很容易组合一些简单的通信协议。但是,对于较大的项目,有哪些好的简单通信协议?
我看过 MODBUS,这似乎是一个可行的选择,但我想看看是否还有其他更好的选择。
我正在开展一个项目,该项目涉及远程 Arduino 和计算机之间的大量数据通信。无线连接是通过一对 XBees 进行的,所以我们在 Arduino 和计算机之间有一个 RS232 链接。对于少量数据,很容易组合一些简单的通信协议。但是,对于较大的项目,有哪些好的简单通信协议?
我看过 MODBUS,这似乎是一个可行的选择,但我想看看是否还有其他更好的选择。
Embedded Systems: Common Protocols中列出了一些嵌入式系统协议,其中一些非常简单 ,包括:
也许这些协议中的一种就足以满足您的应用程序的需要,或者只需要稍作调整。
我会自己投票,并使其尽可能简单。
我已经为各种控制应用程序处理了许多串行协议,我可以向您推荐的一些内容包括:
作为一个非常基本的示例,您可以将数据转换为 ASCII 字符并将其粘贴在开始/停止字符中,如下所示:
要发送字节值 0x7A,发送的数据将是 (7A),其中 () 是选择的开始/停止字符,7 和 A 是两个 ascii 字符。好的,它增加了很多开销,但这意味着您可以使用基本的终端软件进行调试。
如果您的数据通过 XBee,您应该使用转义字符将模块置于 API 模式,将数据划分为逻辑数据包,并利用在 API 模式下提供给 XBee 的数据包将完整到达或一点也不。围绕 1-255 字节块的传输设计您的协议,让 XBee 模块担心如何在每个块中传递数据。不要担心维护单个数据包的完整性或它们之间的细分。Digi 模块可以很好地解决这个问题。您确实需要担心的最重要的事情是,即使传输数据包的节点认为它没有被传递并发送替换,接收者最终可能会得到它 - 甚至可能在它得到替换之后。如果你设计你的协议以使一方是“主人”,事情可能是最简单的;如果 master 请求一条数据,slave 应该发送一次,而不用担心 master 是否得到它。如果 master 没有得到它想要的数据,它可以再次请求它。
从站应为数据分配某种序列号,而主站应为从站更改状态的请求分配序列号。如果master请求的形式是“发送第一个序列号大于XXX的数据”,并且slave的每条数据项都包含自己的序列号和前一个数据项的序列号(如果它们没有连续编号),迟到的数据包可能会导致从设备向主设备冗余发送数据,但主设备将毫不费力地忽略随之而来的迟到响应。如果从站收到一个状态更改请求,其序列号低于先前请求的序列号,它应该忽略该请求,因为它甚至在收到之前就被取代了。
OP 要求串行协议用于“不是很多 [数据] 并且速度不是一个大问题”的情况。MODBUS 在 OP 中提到 MODBUS over RS-485 不是快速协议。虽然这不是一个规范,但这给出了一个关于利基的想法。
对于这个利基市场,我只能想到两种常见的标准协议:
很多时候,当嵌入式程序员遇到像OP这样的情况时,他们会从头开始设计自己的串行通信协议。