2017-11-05 1 views
2

마이크로 컨트롤러에서 UART로부터 두 개의 uint8_t을받습니다. 나중에 내용을 쉽게 참조 할 수 있도록 구문을 분석해야합니다. 내가 멍청한 놈이고, 나는 노동 조합 트릭에 들어갑니다 작업을 마스킹 비트 얻을 수 없기 때문에2 개의 부호없는 문자를 유니온에 넣기

10  | 9  8 | 7  6 | 5  4 | 3  2 1  0 
TRETRY | DEAD_TMIE | OCP_MODE | OCP_DEG |   VDS_LVL  

...하지만 예상대로 작동하지 않습니다 들어오는 데이터는 다음과 같이한다. 내가받은 것은 바로이 같은 조합을 채우기 위해 노력 0000000101011001

입니다

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; 

:

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'  

나는 희망이 없다고 생각하며, 노동 조합으로 생각합니다. 임대 내 코드와 구현에서 잘못된 일이 무엇인지 알려주지 만 이와 비슷한 일을하는 가장 좋은 방법은 무엇입니까? 그것은 newb에 큰 도움이 될 것입니다.

+0

정확하게 2 바이트를받는 것처럼 들리므로 ocp.data에 복사 할 수 있습니다. – mnistic

+0

8 비트 값을 제공하기 위해 8 비트의 왼쪽 시프트가 무엇을 기대합니까? – Peter

+1

"노조 트릭"을 건너 뛰고 규칙적인 이전 비트 마스킹 및 전환 만 수행합니다. 비트 필드와 노조가 어떻게 작동하는지 정의하면 컴파일러가 구현에 대해 어느 정도 융통성을 갖게되어 사용자의 기대치와 일치하지 않을 수 있습니다. – jdigital

답변

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; 

그러면 원하는 연관성이 생성됩니다.

+1

OP의 목표가이 코드를 작동시키는 것이라면이 대답으로 충분할 것입니다. OP가 컴파일러 특정 동작에 의존하지 않는 코드에 관심이 있다면 [C에서 비트 필드를 사용할 때 필드 순서]에 대한 답변 (https://stackoverflow.com/questions/19376426/order-of)을 참조하십시오. -fields-when-using-a-bit-field-in-c) – jdigital

+0

@jdigital 예, 동의합니다. 이것은 단지 OP가보고 있던 동작과 그 환경에서 어떤 변화로 인해 작동하는지 설명합니다. –

+0

지금 당장 문제를 해결해 주셔서 감사합니다 ...하지만 마스킹과 물건으로 어떻게해야하는지 정말 배워야합니다. – DEKKER

관련 문제