【问题标题】:Transmitting structures among controllers控制器之间的传输结构
【发布时间】:2018-06-03 17:00:08
【问题描述】:

我想将其中包含许多结构的结构发送到另一个控制器(控制器的不同品牌,具有不同的架构)。 我需要开发一种序列化来发送数据,而无需使用可用的发明序列化方法。 如何找出填充字节的添加位置,以便在将其发送到另一个控制器之前将其删除? 我如何实现元数据,以便其他控制器可以从传输的数据字节中重建结构的每个成员? 任何其他可能需要的点也将受到欢迎。

【问题讨论】:

    标签: c serialization data-structures struct embedded


    【解决方案1】:

    完全可移植的序列化/反序列化非常手动。您只需遍历结构的任何成员并复制它。您可以使用offsetof 来发现填充,但这几乎是毫无意义的做法,因为这意味着您无论如何都需要对每个结构成员进行一些“手动编码”。

    #pragma pack(1) 和类似的并不理想。结构被打包是有原因的,并且没有可移植的方法来禁用填充。这在一些较小的 CPU(如 8 位或 16 位)上可能是可行的,但不适用于完全可移植的代码。

    重要的是要有一个定义良好的网络协议,它规定了数据的存储方式,包括字节序。即发送者、协议和接收者都有字节序,不一定相同。

    (传统上,数据协议通常使用大端序,因为这是使用 XOR 门实现硬件 CRC 校验的唯一方法,但如今这几乎不是问题。一些 MCU 甚至内置了 CRC 校验硬件。 )

    【讨论】:

    • 根据要求,“定义明确的网络协议”甚至可以是基于 ASCII 的。这种传输比任何二进制协议都更安全、更容易实现和监控/调试。
    • @tofro 并非如此,ASCII 协议意味着数据膨胀和编码/解码速度较慢。您使用它们的唯一原因是监控是否应该由非程序员完成。我会避免实施像“AT 命令”这样的旧废话。
    • 大多数(如果不是全部)称为 Internet 的东西都是基于这种“老废话”。不会那么差吧?
    • @tofro 不,大多数互联网都是基于 TCP/IP 的。
    • 您要么没有查看 TCP/IP 数据包有效负载(不太可能),要么主动忽略了您所看到的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多