【问题标题】:A simple implementation of serial communication between two software entities (Uart / I2C / etc.)两个软件实体(Uart/I2C/等)之间串行通信的简单实现
【发布时间】:2015-06-05 18:40:52
【问题描述】:

我做过很多项目,包括 PC 和 arduino / PLC / 某种其他微控制器 / 处理器,在每个项目中,我们都有不同的协议用于 PC 应用程序和嵌入式应用程序之间的通信。通常,硬件/控制器开发人员会发明一个简单的协议,该协议在整个项目中总是会发生变化,并以

的形式出现
Barker | Size | Data | Checksum

这一次我正在实施双方,所以我想 - 这已经完成了一百万次。这些东西必须有一个基本协议,并在 C、C#、Java 等中实现。 我正在寻找的是一个轻量级层,它将基于流的串行通信转换为基于消息的通信。

我已经四处寻找了一段时间,但我自己找不到任何东西。 你碰巧认识一个吗?

【问题讨论】:

  • 串口协议被反复发明,没有标准。有一个尝试,RFC 916,但它被广泛忽略。它运行良好,但在连接尝试失败时并不完全可靠,因为对方尚未运行,它不能很好地处理缓冲字节。这是根本问题,协议永远不会 100% 故障安全。挑选任何东西或去购物。
  • 很大程度上取决于您需要的功能:可以将数据分解为逻辑数据包(例如命令/读数)吗?你想如何处理错误?位错误的可能性有多大?两个节点是否具有良好的时钟同步?什么是帧同步机制?可以热插拔吗?每个节点的缓冲能力是多少?虽然我同意大多数人似乎重新发明了相同的协议,但人们可能有充分的理由为每种情况选择特定功能。
  • 虽然我非常同意你的观点,但似乎所有这些要求都可以放在一个库中。我想到的是一个简单的库,它支持你在#ifdef 中提到的所有功能,但仍然是轻量级的。我得说我还没有找到我要找的东西,但是解决方案中提到的一种方法现在可能就足够了。再次编写相同的状态机但使用不同的字节似乎是一种浪费。

标签: c embedded protocols


【解决方案1】:

查看Open Source HDLC

我最近遇到了MIN - 不过从来没有用过这个

也检查一下 Simple serial point-to-point communication protocol

【讨论】:

  • 谢谢,我去看看
【解决方案2】:

使用X/Y/Z MODEM协议一定是解决您问题的好选择。它易于实施且随时可用。我在 ISP 工具上使用 X-MODEM 与我们的 cortex-m0 驱动的 MCU 进行通信,它工作得很好。

【讨论】:

    【解决方案3】:

    我对最近的一个项目有完全相同的要求,但我发现对于低端 8 位微控制器来说没有什么足够简单的了。所以我设计了 MIN(微控制器互连网络)来完成这项工作(受 CAN 和 LIN 启发)。

    代码在 github 上:https://github.com/min-protocol/min(查看那里的 wiki)。

    我定义了第 0 层(UART 设置)和第 1 层(帧层,带有校验和等)以及 C API。

    我还在开发更高层,正式定义传感器数据(温度、压力、电压等)的打包方式,使用 JSON 表示和自动生成嵌入式代码以从帧中打包/解包的工具.最终目标是创建一个可以夹在串行线上的 Wireshark 解析器,当输入 JSON 时,它将以人类可读的形式显示信号。

    我写了一篇博文,展示了在 Arduino 板上运行的 Hello World 应用程序(使用 FTDI UART-USB 分线板将数据传输到我的主机 PC):

    https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

    这个系列问题经常发生,如果我们作为一个社区直接解决它而不是为每个项目重新编码它会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2014-10-02
      • 2019-06-11
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多