【问题标题】:Send a structure using UART [closed]使用 UART 发送结构 [关闭]
【发布时间】:2018-02-16 14:26:01
【问题描述】:

我有两块板:
- 主板(M 板)
- 从板(S板)

M 板向 S 板发送请求,S 板应回复。

slave的答案是一个struct:

typedef struct{
  uint8_t userID;
  uint8_t userPass;
  uint16_t userData;
}UserTypeDef;

UserTypeDef User;

示例:
M 板通过发送命令 GET_USER_INFO 来询问用户的信息(结构)。 S板应该返回一个数据结构给M板。

M 板(Tx) --> GET_USER_INFO --> (Rx)S 板
S板(Tx)-->用户-->(Rx)M板

问题是如何使用 UART 发送这样的结构?

【问题讨论】:

  • 只要同意两个芯片组上的字节序并发送二进制结构。
  • 你问的是Serialization

标签: c embedded microcontroller uart serial-communication


【解决方案1】:

编写一个协议文档,明确定义结构的内容应如何通过网络媒体传输。然后编写代码实现协议。

传输结构/对象的代码是“serializing”数据。接收结构/对象的代码是“反序列化”的。您可以在 Google 上获取有关各种序列化协议和技术的大量建议和示例。

如果您使用的是二进制协议,那么您可以序列化一个 C 结构,方法是定义一个 uint8_t 指针指向结构中的第一个字节,然后传输这些字节,直到您传输了整个 sizeof(struct)但这种方法有一些缺陷,尤其是当您的发送和接收设备使用不同的微控制器和/或 C 编译器时。如果一个微控制器使用与另一个不同的字节序,或者如果一个 C 编译器使用与另一个不同的结构填充规则,则反序列化的数据可能会损坏。

这就是为什么您必须编写一个明确定义每个字节的顺序和含义的协议文档。而且你不应该依赖你的 C 编译器来组织结构,就像你的协议一样。 C 编译器可能会插入填充或使用错误的字节序。因此,您应该编写序列化和反序列化例程,从网络协议消息中解析出每个字节,并将其复制到结构中的相应字节/从结构中的相应字节复制,而不是简单地通过结构递增指针。

【讨论】:

    【解决方案2】:

    最简单的方法是以二进制形式发送。只要接收方知道发送方的字节顺序是什么(并对其进行调整),您就可以一次性发送整个结构。这里的缺点是一个人看着串口只会看到乱码,如果你的串口是 7 位而不是 8 位,它将无法工作。

    第二个最简单的方法是将结构转换为十六进制,但仍将其作为一大块数据发送(例如,如果您的结构是{25, 54, 16745},您可以发送19364169,并让接收者将其拆分为字段. 这种方法的缺点是它使用的字节数是第一种方法的两倍。

    最困难但最可靠的方法是发送字段名称,后跟值。这很好,因为查看序列的人很容易知道发生了什么,并且如果稍后将字段添加到结构中,接收软件在看到它无法识别的名称时可能会抛出错误。因此,从上面的示例数据中,您可能有: userID: 0x19, userPass: 0x36, userData: 0x4169。这里的缺点是发送名称会浪费大量字节,因此如果您受到串行链路速度的限制,您可能不想这样做。

    【讨论】:

      【解决方案3】:

      保持可读性的最佳方法是将其编码为可读的形式。

      这可以像使用sprintf 将值编码为字符串一样简单。

      char buffer[BUFFER_LEN];
      sprintf(buffer, "%i:%i:%i", user.userId, user.userPass, user.userData);
      send_over_uart(buffer);
      

      【讨论】:

      • 显然,您对性能不感兴趣。
      • 似乎优化 4 字节传输以提高性能并不比可读性和易于调试更重要。
      • 您正在谈论将二进制转换为字符串表示。超级慢。
      • @SergeyA 只有在涉及 printf 系列函数时才会慢。
      • 使用 UART 时字符串的另一个优点是您可以使用任何垃圾终端软件轻松收听数据。主要缺点是协议中的有效负载较低。
      猜你喜欢
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2015-06-03
      相关资源
      最近更新 更多