为什么从套接字读取时 CAN 总线帧 ID 向后?

Why is the CAN BUS Frame ID backwards when reading from a Socket?

本文关键字:ID 向后 总线 CAN 套接字 读取 为什么      更新时间:2023-10-16

所以我有一个Raspberry Pi从车辆读取CAN数据。 如果我使用canutils中包含的candump程序,我会得到一堆数据,示例如下所示:

can0 1C4 [8]  03 F3 26 08 00 00 7F 70

然后,我编写了一个简单的C++应用程序来打开can0总线的套接字,并将一些数据读取到字符缓冲区中。 如果我在读取后遍历缓冲区的每个字符并将每个字符转换为十六进制格式的 int(并在每个字符之间放置一个管道),我会得到以下内容:

c4|1|0|0|8|0|0|0|3|f3|26|8|0|0|7f|70|

我的问题是,为什么当我使用套接字和字符缓冲区读取数据时,ID 字节会反转? 此行为与所有 CAN ID 一致。数据长度代码和数据采用正确的格式/顺序,但 ID 向后。

谢谢 亚当

恭喜,你刚刚发现了字节序。

字节序是指字节排列成较大数值的顺序,当存储在计算机内存或辅助存储器中时,或通过数字链路传输时。字节序在计算机科学中很有意义,因为通常使用两种相互冲突且不兼容的格式:单词可以用大端或小端格式表示,具体取决于位或字节或其他组件是从大端(最高有效位)还是小端(最低有效位)排序的。

按照惯例,网络(包括总线)数据是大端序。您的 PC 架构可能是小端序。

为了解决这个问题,将您的数据传递给ntoh*()函数,以反转其字节顺序(如有必要)从网络(n)到主机(h)字节序。