跨两个字节写入位

时间:2019-09-19 20:00:11

标签: c dataframe embedded can-bus

我有一个要求,我必须跨两个字节将HEX值写入11位“容器”。布局如下:字节5(位3)是lsb,数据进入字节4(位5)即msb。将数据写入相关位位置的最佳方法是什么?

例如,如果我需要将0x1DA值写入这些位置,那是在保持正确位排序的同时最好的方法。

仅供参考,用于8字节CAN消息的CAN通信。

我正在考虑这样做:

_templsb = DatatoWrite & 0x1F;
_templsb <<= 3;
Byte5 &= ~0xF8;
Byte5 = Byte5 | _templsb;

_tempmsb = DatatoWrite & 0x7E0;
_tempmsb >>= 5;
Byte4 &= ~0x3F;
Byte4 =  Byte4 | _tempmsb;

这样是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

很明显,您希望实现以下安排:

enter image description here

对于您的示例0x01DA,转换将是:

  • 字节4 = 0x0E
  • 字节5 = 0xD0

是这种情况,然后:

uint16_t Word = 0x1DA ;
uint8_t Byte4 = (Word & 0x07E0) >> 5 ;
uint8_t Byte5 = (Word & 0x001F) << 3 ;

如果Byte4Byte5中未使用的位已经包含必须保持不变的数据,则:

Byte4 = (Byte4 & 0xC0) | (Word & 0x07E0) >> 5 ;
Byte5 = (Byte5 & 0x07) | (Word & 0x001F) << 3 ;