我正在从事一个涉及远程Arduino与计算机之间大量数据通信的项目。无线连接是通过一对XBees进行的,因此我们在Arduino和计算机之间建立了RS232链接。对于少量数据,将一些简单的通信协议组合在一起很容易。但是,对于较大的项目,有什么好的简单的通信协议?
我看过MODBUS,这似乎是一个可行的选择,但我想看看是否还有其他更好的选择。
我正在从事一个涉及远程Arduino与计算机之间大量数据通信的项目。无线连接是通过一对XBees进行的,因此我们在Arduino和计算机之间建立了RS232链接。对于少量数据,将一些简单的通信协议组合在一起很容易。但是,对于较大的项目,有什么好的简单的通信协议?
我看过MODBUS,这似乎是一个可行的选择,但我想看看是否还有其他更好的选择。
Answers:
如果您的数据通过XBees,则应将模块置于带有转义符的API模式下,将数据划分为逻辑数据包,并利用以下事实:在API模式下,分配给XBee的数据包将完整到达或一点也不。围绕1-255字节的数据块传输设计协议,并使XBee模块担心如何在每个数据块内传递数据。不必担心维护单个数据包或它们之间的细分的完整性。Digi模块将很好地解决这一问题。您确实需要担心的最大事情是,即使发送数据包的节点认为该数据包没有被发送并发送替代品,接收者也可能最终还是会得到它-即使在获得替代品之后也是如此。如果将协议设计为一侧是“主”,那么事情可能最简单。如果主机请求一条数据,则从机应发送一次,而不必担心主机是否获得了该数据。如果主服务器没有获得所需的数据,则可以再次请求它。
从属设备应为数据分配某种序列号,而主设备应为请求从属设备更改状态的设备分配序列号。如果主设备的请求的格式为“发送序列号大于XXX的第一个项目”,并且从设备的每个数据项都包含其自己的序列号和上一个项目的序列号(如果未连续编号) ),迟到数据包可能导致从设备向主设备冗余发送数据,但是主设备将不会忽略随后的迟到响应。如果从站接收到状态更改请求,该请求的序列号低于先前请求的序列号,则它应忽略该请求,因为该请求甚至在收到请求之前就已被取代。
我对此也有类似的疑问,但是从来没有发现任何简单,小到足以用于小型AVR的东西。所以我推出了一些受CAN启发的产品。称为MIN(微控制器互连网络):
https://github.com/min-protocol/min
我在这里写过博客:
https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/
那里有用于块数据的钩子,但主要用于传感器/执行器的信号。我已经定义了一种JSON格式,用于描述信号及其在MIN帧内的打包,并希望得到使用它的Wireshark解剖器。