【问题标题】:Microcontroller to microcontroller communication library (over UART/RS232)微控制器到微控制器通信库(通过 UART/RS232)
【发布时间】:2015-02-10 03:30:48
【问题描述】:

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

在实践中,我想定期交换数据(即:传感器读取)以及事件数据(GPIO 状态)。我每 100 毫秒有大约 100-200 个字节要交换。

有人知道完成此类任务的协议或库吗?

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

有什么想法吗? 谢谢

【问题讨论】:

    标签: embedded ipc rpc microcontroller uart


    【解决方案1】:

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

    您可以在制造商芯片支持库中找到 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
    

    如果您想发送可变长度的消息,您可以发送一个长度字节或从恒定开销字节填充帧的输出中导出长度。

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

    【讨论】:

    • 好的,这似乎是一个不错的起点。你知道任何现有的协议或库。例如:protobuf、zeromq、TI MessageQ、Mbed RPC 库)
    • 这听起来类似于 Protocol Buffers 框架协议。
    【解决方案2】:

    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】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        那里嵌入了 C 代码,还有一个 Python 实现,可以更轻松地与 PC 通信。

        【讨论】:

          【解决方案5】:

          这个怎么样:eRPC https://community.nxp.com/docs/DOC-334083

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-02-24
            • 1970-01-01
            • 2013-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多