【问题标题】:Why is the CAN BUS Frame ID backwards when reading from a Socket?为什么从 Socket 读取时 CAN BUS 帧 ID 向后?
【发布时间】:2017-09-25 12:00:18
【问题描述】:

所以我有一个 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 向后。

谢谢, 亚当

【问题讨论】:

    标签: c++ sockets can-bus


    【解决方案1】:

    恭喜,您刚刚发现endianness

    字节序是指字节排列成较大数值的顺序,当存储在计算机内存或辅助存储器中时,或在通过数字链路传输时。字节序在计算机科学中引起了人们的兴趣,因为两种冲突和不兼容的格式很常见:单词可以用大端或小端格式表示,这取决于位或字节或其他组件是从大端排序的(最重要的)位)或小端(最低有效位)。

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

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

    【讨论】:

    • 甜蜜的圣诞节,这很简单。我没有意识到当其余数据的顺序正确时,字节序会使数据看起来像那样。但现在我明白了。谢谢。
    • @user3832227 所有程序员总有一天会顿悟字节序;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多