원하는 기능과 필요한 오류 검사 양에 따라 직렬 프로토콜을 작성하는 방법에는 여러 가지가 있습니다.
포인트-투-포인트 프로토콜에서 흔히 볼 수있는 몇 가지 사항은 다음과 같습니다.
메시지 끝
가장 간단한 ASCII 프로토콜은 메시지 문자 시퀀스의 끝을 갖습니다. 종종 \r또는 \nEnter 키를 누르면 인쇄됩니다. 이진 프로토콜은 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 일 수 있습니다.