마이크로 컨트롤러에서 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에 큰 도움이 될 것입니다.
정확하게 2 바이트를받는 것처럼 들리므로 ocp.data에 복사 할 수 있습니다. – mnistic
8 비트 값을 제공하기 위해 8 비트의 왼쪽 시프트가 무엇을 기대합니까? – Peter
"노조 트릭"을 건너 뛰고 규칙적인 이전 비트 마스킹 및 전환 만 수행합니다. 비트 필드와 노조가 어떻게 작동하는지 정의하면 컴파일러가 구현에 대해 어느 정도 융통성을 갖게되어 사용자의 기대치와 일치하지 않을 수 있습니다. – jdigital