【发布时间】:2015-05-30 01:48:24
【问题描述】:
我有下面的结构
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.....
}
尽管付出了所有努力,但上面的代码似乎都不起作用。我在嵌入式处理器上这样做,它真的很难调试。不知道有没有 C-Guru 大佬能告诉我这段代码有什么问题?
【问题讨论】:
-
你的第一班不应该是
1<<0吗? (不是解决方案,因为它仍然应该做某事 - 错误,但仍然。) -
当涉及到可移植性,甚至在具有字节序的单一平台中时,位域显然是一个主要问题。可能值得避免使用它们,而只需要自己执行按位逻辑。就是说,如果它们工作正常并且您对此没意见,我真的建议在这里与
fpButtons和uint8_t建立一个工会。然后您不必费心提取/打包位。否则,当您无论如何都要做所有这些按位提取时,使用位字段似乎特别没有意义。 -
@Ike 我真的不能使用联合解决方案,因为项目的其他部分需要它。
-
@SaeidYazdani 怎么样?对于依赖它的其他部分,您仍然可以将原始的
fpButton字段从联合中取出。 -
@Ike 哎呀你是对的!
标签: c bit-manipulation bitwise-operators stm32