强制两个未签名的字符进入联合

时间:2017-11-05 02:06:36

标签: c struct bit-manipulation bitwise-operators unions

在我的微控制器中,我从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'      

我感到绝望,我认为工会我不去哪里......请你告诉我我的代码和实现中出了什么问题,而更好的方法是什么才能做到这样的事情?这对新手来说是一个很大的帮助。

1 个答案:

答案 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;

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