首页 > 解决方案 > 从 CAN 总线消息中提取位和字节

问题描述

我有一个 8 字节的 CAN 总线消息

15 E0 7F 34 17 5C 2 33 

例如 MCU_SelfCheckStatus 在位 52 和一位长。或 MCU_MotorTemp 位 47 和 8 位长。

字节序是摩托罗拉。我的读者字节序是小字节序。

将它们作为标记数据结构的简单方法是什么?喜欢:

bool isOk = msg.MCU_SelfCheckStatus;
uint8_t temp = msg.MCU_MotorTemp;

我考虑过工会,但我不知道他们是否允许这样的事情。

标签: c++can-bus

解决方案


我会简单地应用逻辑与运算。

bool isOk = msg & 0x20'0000'0000'0000;
bool temp = msg & 0x3F'8000'0000'0000;

说明:为什么要&使用0x20'0000'0000'0000MCU_SelfCheckStatus?好吧,如果你只翻转 8byte long 类型的第 52 位,你会得到那个数字。

为什么&使用0x3F'8000'0000'0000MCU_MotorTemp?同样,如果您只翻转 8byte long 类型的第 47 位和接下来的 8 位,您将得到该数字。

希望能帮助到你。


推荐阅读