Arduino Serial 로 hex 전송하기
개요
시리얼로 custom protocol 을 정의하고 hex 값을 전송해보자.
결과부터 말하자면 (TL;DR)
|
- 패킷을 char array 로 정의하고 값을 넣은 다음에 - 만약 char sendPacket[10]; 이라 정의하였다면 - Serial.write(sendPacket, sizeof(sendPacket)); 이라고 보내면 된다. |
Serial.print와 Serial.write
참고링크 및 이미지 캡처 출처: https://goo.gl/be69UG
Serial.print 는 ASCII 를 시리얼포트로 내보내고
Serial.write 는 Byte 를 시리얼 포트로 내보낸다.
protocol 정의
간단히 아래와 같은 프로토콜을 정의해보았음.
|
구분 |
STX |
OP Code |
Length |
Sensor 1 |
Sensor 2 |
Sensor 3 |
Sensor 4 |
ETX |
|
사이즈 |
0x02 |
0x30 |
2 Bytes (Little Endian) |
1 Byte |
1 Byte |
1 Byte |
1 Byte |
0x03 |
|
예시 |
0x02 |
0x30 |
0x0400 |
0x15 |
0x43 |
0x32 |
0x93 |
|
|
STX, ETX
|
- 패킷의 시작과 끝을 알림 - 수신측에서는 시리얼을 감시하다가 STX와 ETX를 체크함 |
|
OPCode (Operation code) |
- 패킷의 명령어들을 설정 가능. - reset, add, delete, ack 등의 명령에 코드를 할당할 수 있겠다. - 여기에선 그냥 0x30 이라는 OPCode 가 있다고 하자 |
|
Length |
- 순수한 데이터의 길이 - 여기서는 Sensor 1-4 의 값 = 4바이트므로 4가 되며 - Little Endian 으로 표현하며 0x0400 이 된다. - 수신측에서는 이 길이정보를 파싱하는데, 데이터 누락을 체크하는데 쓸 수 있겠다. |
|
Data |
- 여기서는 Sensor 1, 2, 3, 4의 값 |
|
* CRC |
- ETX 이전에 CRC 값을 넣어서 오류 검증을 할 수도 있다. |
// Arduino - Send HEX value to Serial
void setup() {
Serial.begin(9600);
}
void loop() {
// 패킷준비
char serialPacket[9] = {0,};
serialPacket[0] = 0x02; // STX
serialPacket[1] = 0x30; // OP CODE
serialPacket[2] = 0x04;
serialPacket[3] = 0x00;
serialPacket[4] = 0x15;
serialPacket[5] = 0x43;
serialPacket[6] = 0x32;
serialPacket[7] = 0x93;
serialPacket[8] = 0x03; // ETX
Serial.println("Sending");
Serial.write(serialPacket, sizeof(serialPacket));
Serial.println();
delay(1500);
// 비교해보기
// print 와 write 비교, char, int8_t, uint8_t 비교
int8_t testData = 0x43;
Serial.println(testData);
Serial.println((uint8_t)testData);
Serial.println((char)testData);
Serial.write(testData);
Serial.println();
Serial.write((uint8_t)testData);
Serial.println();
Serial.write((char)testData);
Serial.println();
delay(1500);
}
전송해보자
- char array 로 패킷을 만들어서 Serial.write() 로 전송하였음
- print 와 write 를 비교 하였음
- int8_t, uint8_t, char 데이터 타입으로 보내는 경우도 비교하였음
모니터링 방법
아두이노 IDE
Seiral monitor 로는 HEX 값 확인이 어렵다.
Hterm
깔끔하고 이쁘다. 역시 독일 형님들: https://www.heise.de/download/product/hterm-53283
- UART 설정을 해주고
- Newline 을 설정 해주고
- 데이터를 볼 형식을 (중복선택하여) 설정. 여기서는 Ascii, Hex, Bin 을 선택하였다.
1) "Sending" 이라고 Ascii 가 전송되었다.
2) 우리가 정의한 custom packet 이 전송되었다. 02 30 04 00 15 43 32 93 03
|
Serial.println() // int8_t 로 전송 |
십진수로 67이므로 Ascii 문자인 6과 7이 전송됨 |
|
Serial.println() // uint8_t 로 전송 |
int8_t 와 마찬가지로 Ascii 문자인 6과 7이 전송됨 |
|
Serial.println() // char 로 전송 |
Ascii code 0x43 인 C가 전송됨. HEX 값은 0x43 |
|
Seriial.write() - int8_t, uint8_t, char 모두 동일 |
0x43 값이 잘 전달됨 |