强制两个无符号字符合并
Forcing two unsigned chars into a union
在我的微控制器中,我从 UART 接收到两个 uint8_t
。我需要对其进行解析,以便以后可以轻松地引用其内容。传入的数据是这样的:
10 | 9 8 | 7 6 | 5 4 | 3 2 1 0
TRETRY | DEAD_TMIE | OCP_MODE | OCP_DEG | VDS_LVL
因为我是菜鸟,无法使用位掩码,所以我尝试了 union 技巧……但它没有按预期工作。这是我的工会:
typedef union {
struct {
uint8_t dont_care :5; //b15-b11 these bits should be discarded
uint8_t retry_time :1; //b10
uint8_t dead_time :2; //b9-b8
uint8_t ocp_mode :2; //b7-b6
uint8_t degl_time :2; //b5-b4
uint8_t vds_lvl :4; //b3-b0
} bits;
uint16_t data;
uint8_t bytes[2];
} DRV_OverCurrentProtection;
我收到的正是0000000101011001
我试过这样填充工会:
DRV_OverCurrentProtection ocp;
ocp.data = buff[0] << 8 | buff[1];
但我在调试器中得到了这个(显然是错误的!):
//actual data
buff[0] volatile uint8_t 1 (Binary)
buff[1] volatile uint8_t 1011001 (Binary)
//after assignment to the union
data uint16_t 101011001 (Binary)
//bits
dont_care uint8_t 25 '1'
retry_time uint8_t 0 '[=13=]'
dead_time uint8_t 1 '[=13=]1'
ocp_mode uint8_t 1 '[=13=]1'
degl_time uint8_t 0 '[=13=]'
vds_lvl uint8_t 0 '[=13=]'
我感到绝望,我认为与工会我无处可去...请你告诉我我的代码和实现中出了什么问题,但更好的是做这样的事情的最佳方法是什么?对新手帮助很大
您的结构正在按从低到高的顺序打包位域。只是颠倒顺序:
struct {
uint8_t vds_lvl :4; //b3-b0
uint8_t degl_time :2; //b5-b4
uint8_t ocp_mode :2; //b7-b6
uint8_t dead_time :2; //b9-b8
uint8_t retry_time :1; //b10
uint8_t dont_care :5; //b15-b11 these bits should be discarded
} bits;
这应该会产生您正在寻找的关联。
在我的微控制器中,我从 UART 接收到两个 uint8_t
。我需要对其进行解析,以便以后可以轻松地引用其内容。传入的数据是这样的:
10 | 9 8 | 7 6 | 5 4 | 3 2 1 0
TRETRY | DEAD_TMIE | OCP_MODE | OCP_DEG | VDS_LVL
因为我是菜鸟,无法使用位掩码,所以我尝试了 union 技巧……但它没有按预期工作。这是我的工会:
typedef union {
struct {
uint8_t dont_care :5; //b15-b11 these bits should be discarded
uint8_t retry_time :1; //b10
uint8_t dead_time :2; //b9-b8
uint8_t ocp_mode :2; //b7-b6
uint8_t degl_time :2; //b5-b4
uint8_t vds_lvl :4; //b3-b0
} bits;
uint16_t data;
uint8_t bytes[2];
} DRV_OverCurrentProtection;
我收到的正是0000000101011001
我试过这样填充工会:
DRV_OverCurrentProtection ocp;
ocp.data = buff[0] << 8 | buff[1];
但我在调试器中得到了这个(显然是错误的!):
//actual data
buff[0] volatile uint8_t 1 (Binary)
buff[1] volatile uint8_t 1011001 (Binary)
//after assignment to the union
data uint16_t 101011001 (Binary)
//bits
dont_care uint8_t 25 '1'
retry_time uint8_t 0 '[=13=]'
dead_time uint8_t 1 '[=13=]1'
ocp_mode uint8_t 1 '[=13=]1'
degl_time uint8_t 0 '[=13=]'
vds_lvl uint8_t 0 '[=13=]'
我感到绝望,我认为与工会我无处可去...请你告诉我我的代码和实现中出了什么问题,但更好的是做这样的事情的最佳方法是什么?对新手帮助很大
您的结构正在按从低到高的顺序打包位域。只是颠倒顺序:
struct {
uint8_t vds_lvl :4; //b3-b0
uint8_t degl_time :2; //b5-b4
uint8_t ocp_mode :2; //b7-b6
uint8_t dead_time :2; //b9-b8
uint8_t retry_time :1; //b10
uint8_t dont_care :5; //b15-b11 these bits should be discarded
} bits;
这应该会产生您正在寻找的关联。