在我的微控制器中,我从UART收到两个uint8_t
。我需要解析它,以便我以后可以轻松地引用它的内容。传入的数据如下:
10 | 9 8 | 7 6 | 5 4 | 3 2 1 0
TRETRY | DEAD_TMIE | OCP_MODE | OCP_DEG | VDS_LVL
由于我是一个菜鸟并且无法进行掩盖工作,所以我选择了工会技巧......但它没有按预期工作。这是我的工会:
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 '\031'
retry_time uint8_t 0 '\0'
dead_time uint8_t 1 '\001'
ocp_mode uint8_t 1 '\001'
degl_time uint8_t 0 '\0'
vds_lvl uint8_t 0 '\0'
我感到绝望,我认为工会我不去哪里......请你告诉我我的代码和实现中出了什么问题,而更好的方法是什么才能做到这样的事情?这对新手来说是一个很大的帮助。
答案 0 :(得分:1)
您的结构将位字段从低到高打包。只需颠倒顺序:
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;
这应该产生你正在寻找的关联。