良好的基于​​RS232的协议,用于嵌入式到计算机的通信


10

我正在从事一个涉及远程Arduino与计算机之间大量数据通信的项目。无线连接是通过一对XBees进行的,因此我们在Arduino和计算机之间建立了RS232链接。对于少量数据,将一些简单的通信协议组合在一起很容易。但是,对于较大的项目,有什么好的简单的通信协议?

我看过MODBUS,这似乎是一个可行的选择,但我想看看是否还有其他更好的选择。


2
到底有什么要求?

寻找一般建议。简单和低开销将是该项目的主要目标。
Computerish

1
抱歉,我的意思是:有多少数据,有多快

我没有量化的方法,但是速度和速度不是一个大问题。
Computerish

7
速度不是问题,但对于人类可读的东西,争论不休,因为这使开发和调试更加容易。当您可以连接终端并用自己替代链路的任何一端时,这是很棒的。
克里斯·斯特拉顿

Answers:


4

OP要求在“ 数据量和速度不是很大的问题 ” 的情况下使用串行协议。通过RS-485的OP MODBUS中提到MODBUS并不是一种快速协议。虽然这不是一个规范,但是却给出了一个关于利基的想法。

我可以想到的只有两种常见的标准协议可以解决这个问题:

  • NEMA 0183。纯文本ASCII协议。人类可读。仅点对点。不支持多点总线。
  • OP中已经提到的MODBUS

很多时候,当嵌入式程序员处于OP之类的情况时,他们会从头开始设计自己的串行通信协议。


10

一些嵌入式系统的协议,其中几个非常简单的,在上市的 嵌入式系统:通用协议,其中包括:

这些协议中的一种可能适合您的应用程序,或者仅需很小的调整即可。


6

我会投票决定自己的立场,并使其尽可能简单。

我已经处理了许多用于各种控制应用程序的串行协议,我可以向您推荐的一些内容包括:

  • 起始和终止字符,在其他地方不使用
  • 某种校验和/错误检查
  • 某些流量控制/信令方法,尤其是在需要双向通信的情况下。

作为一个非常基本的示例,您可以将数据转换为ASCII字符并将其粘贴在开始/停止字符中,如下所示:

要发送字节值0x7A,发送的数据将是(7A),其中()是选择的开始/停止字符,而7和A是两个ascii字符。好的,这会增加很多开销,但是这意味着您可以使用基本的终端软件进行调试。


5

如果您的数据通过XBees,则应将模块置于带有转义符的API模式下,将数据划分为逻辑数据包,并利用以下事实:在API模式下,分配给XBee的数据包将完整到达或一点也不。围绕1-255字节的数据块传输设计协议,并使XBee模块担心如何在每个数据块内传递数据。不必担心维护单个数据包或它们之间的细分的完整性。Digi模块将很好地解决这一问题。您确实需要担心的最大事情是,即使发送数据包的节点认为该数据包没有被发送并发送替代品,接收者也可能最终还是会得到它-即使在获得替代品之后也是如此。如果将协议设计为一侧是“主”,那么事情可能最简单。如果主机请求一条数据,则从机应发送一次,而不必担心主机是否获得了该数据。如果主服务器没有获得所需的数据,则可以再次请求它。

从属设备应为数据分配某种序列号,而主设备应为请求从属设备更改状态的设备分配序列号。如果主设备的请求的格式为“发送序列号大于XXX的第一个项目”,并且从设备的每个数据项都包含其自己的序列号和上一个项目的序列号(如果未连续编号) ),迟到数据包可能导致从设备向主设备冗余发送数据,但是主设备将不会忽略随后的迟到响应。如果从站接收到状态更改请求,该请求的序列号低于先前请求的序列号,则它应忽略该请求,因为该请求甚至在收到请求之前就已被取代。


3

Firmata怎么?它支持各种操作系统和编程语言。支持控制器端Arduino和PICduino,但这并不难移植到裸露的微控制器上。


3

我对此也有类似的疑问,但是从来没有发现任何简单,小到足以用于小型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解剖器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.