我希望将两个微控制器与UART接口连接,然后搜索协议以在它们之间交换数据。
实际上,我想定期交换数据(即:传感器读数)以及事件数据(GPIO状态)。我每100毫秒交换一次大约100-200字节。
有人知道协议或库来完成这类任务吗?
现在,我看到protobuf和nano protobuff?还有别的吗? 如果我可以在UART上添加软件层并使用"虚拟数据流"那将是很好的。就好像它是与N个端口的TCP / IP连接。
有什么想法吗? 感谢
答案 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)
第一个答案开始时,最简单的结果就是推出自己的答案。根据需要定义标题(上面的“格式”),可能包括状态信息,以便每个处理器知道另一个正常工作。我已成功使用包含
的协议解析器然后将[*识别为消息的开头,并且只要校验和匹配,就将主体调度到具有相关参数的特定命令ID的命令处理程序。
答案 4 :(得分:0)
尝试微控制器互连网络(MIN)1.0:
https://github.com/min-protocol/min
它使用字节填充来保持接收器同步,使用16位Fletcher的校验和算法,应用程序使用的标识符以及最多15个字节的可变有效负载。
那里有嵌入式C代码以及Python实现,可以更轻松地与PC通信。