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 필요할 수 있다