티스토리 뷰
개요
시리얼로 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 값이 잘 전달됨 |
'embedded' 카테고리의 다른 글
Arduino - Memory and PROGMEM, F() macro (0) | 2018.09.28 |
---|---|
Arduino - TCP Client로 명령받기 (10) | 2018.09.18 |
UART, TTL, RS232, RS422, RS485 간단 구분 (3) | 2018.08.24 |
아두이노에서 ds18b20 온도센서 다루기 (0) | 2018.08.22 |
아두이노를 이용한 온습도 센서 측정 (3) | 2018.08.10 |
- Total
- Today
- Yesterday
- 체호프
- notion
- 제이펍
- OpenAI
- 티스토리챌린지
- 노션
- 잡학툰
- Bug
- 독서
- agile
- 독서후기
- 인텔리제이
- intellij
- folklore
- golang
- Gin
- 오블완
- 2023
- websocket
- strange
- bun
- solid
- API
- go
- 엉클 밥
- github
- clean agile
- 영화
- 클린 애자일
- ChatGPT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |