원하는 기능과 필요한 오류 검사 양에 따라 직렬 프로토콜을 작성하는 방법에는 여러 가지가 있습니다.
포인트-투-포인트 프로토콜에서 흔히 볼 수있는 몇 가지 사항은 다음과 같습니다.
메시지 끝
가장 간단한 ASCII 프로토콜은 메시지 문자 시퀀스의 끝을 갖습니다. 종종 \r
또는 \n
Enter 키를 누르면 인쇄됩니다. 이진 프로토콜은 0x03
다른 공통 바이트를 사용합니다.
메시지 시작
메시지가 끝났을 때의 문제점은 메시지를 보낼 때 이미 수신 한 다른 바이트를 모른다는 것입니다. 그런 다음이 바이트는 메시지의 접두어가되어 잘못 해석됩니다. 예를 들어 Arduino가 절전 모드에서 해제 된 경우 직렬 버퍼에 약간의 가비지가있을 수 있습니다. 이 문제를 해결하려면 메시지 순서가 시작됩니다. 귀하의 예에서 ^
, 이진 프로토콜에서0x02
오류 확인
메시지가 손상 될 수있는 경우 오류 검사가 필요합니다. 이것은 체크섬 또는 CRC 오류 또는 다른 것일 수 있습니다.
탈출 캐릭터
체크섬이 '메시지 시작'또는 '메시지 끝'바이트와 같은 제어 문자에 추가되거나 메시지에 제어 문자와 같은 값이 포함되어있을 수 있습니다. 해결책은 이스케이프 문자를 도입하는 것입니다. 이스케이프 문자는 실제 제어 문자가 없도록 수정 된 제어 문자 앞에 배치 됩니다. 예를 들어 시작 문자가 0x02 인 경우 이스케이프 문자 0x10을 사용 하여 메시지에서 0x02 값을 바이트 쌍 0x10 0x12 (바이트 XOR 제어 문자)로 보낼 수 있습니다.
패킷 번호
메시지가 손상된 경우 nack 또는 retry 메시지로 재전송을 요청할 수 있지만 여러 메시지가 전송 된 경우 최신 메시지 만 재전송 할 수 있습니다. 대신 패킷에는 특정 수의 메시지 후에 롤오버되는 숫자가 제공 될 수 있습니다. 예를 들어,이 번호가 16 인 경우, 전송 장치는 마지막 16 개의 메시지 전송을 저장할 수 있으며, 손상된 경우 수신 장치는 패킷 번호를 사용하여 재전송을 요청할 수 있습니다.
길이
이진 프로토콜에서는 수신 장치에 메시지에 몇 개의 문자가 있는지 알려주는 길이 바이트가 표시됩니다. 이렇게하면 올바른 바이트 수가 수신되지 않은 경우 오류가 발생한 것처럼 다른 수준의 오류 검사가 추가됩니다.
아두 이노 전용
Arduino 용 프로토콜을 제안 할 때 가장 먼저 고려해야 할 사항은 통신 채널의 안정성입니다. 대부분의 무선 매체, XBee, WiFi 등을 통해 전송하는 경우 이미 오류 검사 및 재시도 기능이 내장되어 있으므로 프로토콜에 넣을 필요가 없습니다. RS422를 통해 몇 킬로미터를 보내려면 필요합니다. 내가 포함하는 것은 메시지의 시작과 메시지의 끝 문자입니다. 내 일반적인 구현은 다음과 같습니다.
>messageType,data1,data2,…,dataN\n
쉼표로 데이터 부분을 구분하면 쉽게 구문 분석 할 수 있으며 메시지는 ASCII를 사용하여 전송됩니다. ASCII 프로토콜은 직렬 모니터에 메시지를 입력 할 수 있기 때문에 좋습니다.
이진 프로토콜을 원한다면 메시지 크기를 줄이려면 데이터 바이트가 제어 바이트와 같을 수있는 경우 이스케이프를 구현해야합니다. 이진 제어 문자는 전체 범위의 오류 검사 및 재 시도가 필요한 시스템에 더 좋습니다. 원하는 경우 페이로드는 여전히 ASCII 일 수 있습니다.