微控制器到微控制器通信库(通过UART / RS232)

时间:2014-12-11 15:27:57

标签: embedded ipc rpc microcontroller uart

我希望将两个微控制器与UART接口连接,然后搜索协议以在它们之间交换数据。

实际上,我想定期交换数据(即:传感器读数)以及事件数据(GPIO状态)。我每100毫秒交换一次大约100-200字节。

有人知道协议或库来完成这类任务吗?

现在,我看到protobuf和nano protobuff?还有别的吗? 如果我可以在UART上添加软件层并使用"虚拟数据流"那将是很好的。就好像它是与N个端口的TCP / IP连接。

有什么想法吗? 感谢

5 个答案:

答案 0 :(得分:5)

我认为最直接的方法就是自己动手。

您可以在制造商芯片支持库中找到RS232驱动程序。

RS232是面向流的传输,这意味着当您发送消息并在接收器端检测帧边界时,您需要将消息编码为某种帧结构。一个聪明且易于使用的机制是"一致的开销字节填充"。

https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing

这个简单的算法将消息中的零转换为其他值,因此零字节可用于检测帧的开始和结束。如果某个字节在路上损坏,您甚至可以重新同步到流并继续运行。

即使是最小的微处理器,维基百科上的代码也应该足够简单。

之后您可以定义消息格式。您可以保持它非常简单并直接发送您的数据结构。

建议使用简单的邮件格式:

Byte-ID   Meaning
---------------------------------
0         Destination port number
1         message type (define your own)
2 to n    message data

如果要发送可变长度消息,可以发送一个长度字节,或从Constant Overhead Byte Stuffing框架的输出中获取长度。

顺便说一句,UART / RS232很好用且易于使用,但您可能还想看看SPI。 SPI接口更适合在两个微控制器之间交换数据。它通常比RS232更快,更强大,因为它有一个专用的时钟线。

答案 1 :(得分:2)

这是怎么回事:eRPC https://community.nxp.com/docs/DOC-334083

  

eRPC(嵌入式远程过程调用)是由恩智浦创建的远程过程调用(RPC)系统。 RPC是一种机制,用于使用简单的本地函数调用在远程系统上调用软件例程。远程系统可以是通过任意通信信道连接的任何CPU:跨网络的服务器,多核系统中的另一CPU核,等等。对于客户端来说,就像调用应用程序内置的库中的函数一样。唯一的区别是通信渠道引入的任何延迟或不可靠性。

我在双处理器嵌入式系统中使用它,一个带有Context-M4 MCU的cortext-A9 CPU,它们通过SPI / GPIO相互通信。

Erpc可以在UART,SPI,rpmsg和网络(tcp)上运行。即使使用串行或SPI作为传输隧道,也可以进行双向传输  呼叫,占用空间极小。

答案 2 :(得分:1)

Simple serial point-to-point communication protocol

http://www.zipplet.co.uk/index.php/content/openformats_mise

这取决于您是否需要主/从实现,噪声保护,点或多点(在这种情况下是碰撞检测)等

但是,正如我们的同事所说,我会按照KISS原则http://en.wikipedia.org/wiki/KISS_principle

采用最符合问题的解决方案。

只需添加一些标题信息,如ID和长度,如果需要CRC校验,并高兴:)

答案 3 :(得分:0)

第一个答案开始时,最简单的结果就是推出自己的答案。根据需要定义标题(上面的“格式”),可能包括状态信息,以便每个处理器知道另一个正常工作。我已成功使用包含

的协议
  1. 2字节ascii前缀和后缀,例如“[”和“]”,以便     协议分析器可以显示消息边界。
  2. 字节数。
  3. 命令ID(已解析以指示要使用的命令处理程序。
  4. 命令参数(我使用了3个32位字)。
  5. 用于验证传输完整性的CRC或校验和
  6. 解析器然后将[*识别为消息的开头,并且只要校验和匹配,就将主体调度到具有相关参数的特定命令ID的命令处理程序。

答案 4 :(得分:0)

尝试微控制器互连网络(MIN)1.0:

https://github.com/min-protocol/min

它使用字节填充来保持接收器同步,使用16位Fletcher的校验和算法,应用程序使用的标识符以及最多15个字节的可变有效负载。

那里有嵌入式C代码以及Python实现,可以更轻松地与PC通信。