Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 微控制器到微控制器通信库(通过UART/RS232)_Embedded_Ipc_Rpc_Microcontroller_Uart - Fatal编程技术网

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

Embedded 微控制器到微控制器通信库(通过UART/RS232),embedded,ipc,rpc,microcontroller,uart,Embedded,Ipc,Rpc,Microcontroller,Uart,我想用UART接口连接两个微控制器,并搜索协议在它们之间交换数据 实际上,我希望定期交换数据(即:传感器读取)和事件数据(GPIO状态)。我每100毫秒交换大约100-200字节 有人知道实现这种任务的协议或库吗 现在,我看到了protobuf和nano protobuff?还有别的事吗? 如果我可以在UART上添加一个软件层并使用“虚拟数据流”,就像它是到N个端口的TCP/IP连接一样,那就太好了 有什么想法吗? 谢谢我认为最直接的方法是自己动手 您可以在制造商的芯片支持库中找到RS232驱动

我想用UART接口连接两个微控制器,并搜索协议在它们之间交换数据

实际上,我希望定期交换数据(即:传感器读取)和事件数据(GPIO状态)。我每100毫秒交换大约100-200字节

有人知道实现这种任务的协议或库吗

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

有什么想法吗?
谢谢

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

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

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

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

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

之后,您可以定义消息格式。您可以让它非常简单,直接按原样发送数据结构

关于简单消息格式的建议:

Byte-ID   Meaning
---------------------------------
0         Destination port number
1         message type (define your own)
2 to n    message data
如果要发送可变长度的消息,可以发送一个长度字节,也可以从常量开销字节的输出中导出长度

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

这取决于您是否需要主/从实现、噪声保护、点-点或多点(在本例中是碰撞检测)等

但是,正如我们的同事所说,我会遵循接吻原则,选择最简单的解决方案


只需添加一些标题信息,如ID和长度,如果需要CRC检查,请高兴:)

当第一个答案开始时,最简单的结果就是自己滚动。根据需要定义标头(上面的“格式”),可能包括状态信息,以便每个处理器都知道另一个处理器工作正常。我成功地制定了一项协议,其中包括

  • 2字节ascii前缀和后缀,如“[”和“]”,以便 协议分析器可以显示消息边界
  • 字节数
  • 命令ID(解析为指示要使用的命令处理程序)
  • 命令参数(我使用了3个32位字)
  • 验证传输完整性的CRC或校验和

  • 然后,解析器将[*识别为消息的开头,只要校验和匹配,就将特定命令ID的正文和相关参数发送给命令处理程序。

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

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

    那里有嵌入式C代码,还有一个Python实现,可以更方便地与PC进行通信。

    这个怎么样:eRPC

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

    我已经在一个两处理器嵌入式系统中使用了它,一个cortext-A9 CPU和一个Context-M4 MCU,它们通过SPI/GPIO相互通信

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

    好的,这似乎是一个很好的起点。您知道任何现有的协议或库。例如:protobuf、zeromq、TI MessageQ、Mbed RPC库)这听起来类似于协议缓冲区帧协议。