c++ - 从 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;
我考虑过工会,但我不知道他们是否允许这样的事情。
解决方案
我会简单地应用逻辑与运算。
bool isOk = msg & 0x20'0000'0000'0000;
bool temp = msg & 0x3F'8000'0000'0000;
说明:为什么要&
使用0x20'0000'0000'0000
MCU_SelfCheckStatus?好吧,如果你只翻转 8byte long 类型的第 52 位,你会得到那个数字。
为什么&
使用0x3F'8000'0000'0000
MCU_MotorTemp?同样,如果您只翻转 8byte long 类型的第 47 位和接下来的 8 位,您将得到该数字。
希望能帮助到你。
推荐阅读
- javascript - Javascript数组在重新定义变量以包含新的完整数组然后将特定索引设置为另一个值后清空
- laravel - 如何在 Vue FullCalendar 上的事件中添加图像?imageurl 返回未定义
- azure - 如何针对存储帐户运行多个子 Runbook
- c# - AmazonS3Client 找不到路径的一部分
- c# - 从 DataRow 第 N 列分配 DataGridRow.Header 值
- python - FreqDist 用于最常见的单词或短语
- angular - 如何将html值传递给javascript或通过环回使用两种方式绑定?
- java - 如何正确创建一组预定义的 JObject?
- r - 如何在 ggplot2 中按 geom / layer 进行分面?
- kubernetes - 构建/编译 Kubernetes 仅用于签名验证而不是签名