프로토콜 설계: 나만의 통신 규칙 만들기
헤더, 길이, 명령, 데이터, CRC. 바이트 흐름에서 패킷을 안정적으로 잘라 내는 통신 규칙을 설계합니다.
UART나 BLE는 바이트를 흘려 줄 뿐 "어디서부터 어디까지가 한 메시지인지"는 알려 주지 않습니다. 그 규칙을 정하는 것이 프로토콜 설계입니다.
기본 패킷 구조
| 필드 | 크기 | 역할 |
|---|---|---|
| 시작 바이트 | 1~2 | 패킷 시작 표시 (예: 0xAA 0x55) |
| 길이 | 1 | 뒤따르는 데이터 길이 |
| 명령 / ID | 1 | 무슨 메시지인가 |
| 데이터 | N | 내용 |
| CRC | 2 | 깨졌는지 확인 |
수신 파서는 상태 머신으로
시작 바이트 대기 → 길이 → 명령 → 데이터 N개 → CRC 확인. 중간에 이상한 값이 오면 처음으로 돌아갑니다. 바이트 사이 시간이 너무 길면 타임아웃으로 초기화합니다.
설계 체크리스트
- 엔디언: 다바이트 값의 바이트 순서를 문서에 명시 (보통 리틀 엔디언)
- 재전송: 중요한 명령은 응답(ACK)을 받고, 일정 시간 안에 없으면 다시 보냄. 순번을 붙여 중복 실행을 막음
- 버전 필드: 나중에 포맷을 바꿔도 호환되게
- 바이트 스터핑: 데이터 안에 시작 바이트가 나와도 혼동하지 않게 하려면 COBS나 SLIP 같은 인코딩 사용
- 구조체를 그대로 보내지 않기: 패딩과 엔디언 문제 (C 언어 구조체 노트 참고)
새로 만들기 전에 Modbus, MAVLink, CANopen처럼 이미 검증된 프로토콜이 맞는지 먼저 봅니다.