Posts 바이트 단위로 변수 값 파싱하기
Post
Cancel

바이트 단위로 변수 값 파싱하기

MCU, MPU를 사용할 때 통신 패킷을 이용해 byte 단위로 붙였다 장난치는 경우가 많다. 보통 2byte 짜리 센서값을 통신으로 1byte 씩 받을 경우 비트쉬프트(bit shift) 해서 하위비트 상위비트 따로 처리한다.

예시)

센서로 부터 1byte씩 얻은 데이터가 data에 저장되었다고 가정

data 변수에서 distance 변수 값과 pulse 변수 값을 구한다.

1
2
3
4
5
6
// Raw data
uint8_t data[] = {0x11, 0x22, 0x33};

// filted data
uint16_t distance = 0x2211;
uint8_t pulse = 0x33;

1. bit-shifting

1
2
3
4
5
6
7
8
9
10
11
uint16_t upbyte;
uint16_t downbyte;

upbyte = ((uint16_t)data[1] << 4);
downbyte = (uint16_t)data[0];

distance = upbyte | downbyte;
pulse = data[2];

// distance = 0x2211
// pulse = 0x33
2. Union-type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
union RawData_{
    uint8_t raw[3];
    struct {
        uint16_t distance;
        uint8_t pulse;
    } parse;
} rawData;

rawData.raw[0] = data[1];
rawData.raw[1] = data[0];
rawData.raw[2] = data[2];

distance = rawData.parse.distance;
pulse = rawData.parse.pulse;

// distance = 0x2211
// pulse = 0x33

Union 타입을 선언해놓으면 raw에 값을 대입하는 것만으로도 간단하게 parsing 할 수 있다.

컴파일러에 따라 struct packing 필요할 수 있다

This post is licensed under CC BY 4.0 by the author.