强制两个无符号字符合并

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;

这应该会产生您正在寻找的关联。