我有以下转换位和背部
typedef struct fpButtons {
/** BYTE 0 **/
uint8_t button_1:1;
uint8_t button_2:1;
uint8_t button_3:1;
uint8_t button_4:1;
uint8_t button_5:1;
uint8_t button_6:1;
uint8_t button_7:1;
uint8_t button_8:1;
/** And BYTE 2 which I didn't paste to save SO's space lol **/
// button_9:1 to button_16:1
} FP_BUTTONS;
的结构而这个功能,让一个无符号整数,它的位应该建立上述
void FP_UpdateData(FP_BUTTONS *data, uint8_t b1, uint8_t b2)
{
data->button_1 = (b1 & (1 << 1)) >> 1;
data->button_2 = (b1 & (1 << 2)) >> 2;
data->button_3 = (b1 & (1 << 3)) >> 3;
data->button_4 = (b1 & (1 << 4)) >> 4;
data->button_5 = (b1 & (1 << 5)) >> 5;
data->button_6 = (b1 & (1 << 6)) >> 6;
data->button_7 = (b1 & (1 << 7)) >> 7;
data->button_8 = (b1 & (1 << 8)) >> 8;
//Do the same thing for button 9 to 16
}
的结构现在存储后,我必须把它发送到其他地方:
void APP_Send(){
uint8_t packet[2];
packet[0] = *((uint8_t*) &FP_BUTTONS_Data);
packet[1] = *(((uint8_t*) &FP_BUTTONS_Data)+1);
//Send stuff away.....
}
尽管所有的努力,没有上述代码似乎窝RK。我在一个嵌入式处理器上做这件事,它很难调试。我想知道一些C-Guru家伙是否可以告诉我这段代码有什么问题?
您的第一班不应该是'1 << 0'吗? (不是一个解决方案,因为它仍然应该做*某事* - 错误的,但仍然)。 – usr2564301
当涉及到可移植性或甚至在具有字节顺序的单个平台内时,位域显然可能成为主要悲伤的根源。值得避免他们赞成只是按照自己的逻辑进行按位逻辑。也就是说,如果他们工作的很好,而且你还可以,那么我真的推荐一个带有'fpButtons'和'uint8_t'的工会。那么你不必麻烦抽取/包装位。否则,无论如何,当你只是要进行所有这种按位提取时,使用位域似乎毫无意义。 –
@Ike我真的不能使用联合解决方案,因为它是项目的其他部分所必需的。 –