그라운드 임베디드 유튜브 구독

노트 / 통신 프로토콜

프로토콜 설계: 나만의 통신 규칙 만들기

헤더, 길이, 명령, 데이터, CRC. 바이트 흐름에서 패킷을 안정적으로 잘라 내는 통신 규칙을 설계합니다.

GROUND EMBEDDED · 정리 노트통신 12프로토콜 설계필드크기역할시작 바이트1~2패킷 시작 표시 (예: …길이1뒤따르는 데이터 길이

UART나 BLE는 바이트를 흘려 줄 뿐 "어디서부터 어디까지가 한 메시지인지"는 알려 주지 않습니다. 그 규칙을 정하는 것이 프로토콜 설계입니다.

기본 패킷 구조

필드 크기 역할
시작 바이트 1~2 패킷 시작 표시 (예: 0xAA 0x55)
길이 1 뒤따르는 데이터 길이
명령 / ID 1 무슨 메시지인가
데이터 N 내용
CRC 2 깨졌는지 확인

수신 파서는 상태 머신으로

시작 바이트 대기 → 길이 → 명령 → 데이터 N개 → CRC 확인. 중간에 이상한 값이 오면 처음으로 돌아갑니다. 바이트 사이 시간이 너무 길면 타임아웃으로 초기화합니다.

설계 체크리스트

  • 엔디언: 다바이트 값의 바이트 순서를 문서에 명시 (보통 리틀 엔디언)
  • 재전송: 중요한 명령은 응답(ACK)을 받고, 일정 시간 안에 없으면 다시 보냄. 순번을 붙여 중복 실행을 막음
  • 버전 필드: 나중에 포맷을 바꿔도 호환되게
  • 바이트 스터핑: 데이터 안에 시작 바이트가 나와도 혼동하지 않게 하려면 COBS나 SLIP 같은 인코딩 사용
  • 구조체를 그대로 보내지 않기: 패딩과 엔디언 문제 (C 언어 구조체 노트 참고)

새로 만들기 전에 Modbus, MAVLink, CANopen처럼 이미 검증된 프로토콜이 맞는지 먼저 봅니다.