장치들 사이에서 통신을 할 때 데이터를 어떻게 전달해야 하는가에 대해서 정리해 보았습니다.
아래와 같은 데이터가 있다고 가정해 봅니다. 네모 한 칸은 1Byte를 의미합니다. 주고받고자 하는 데이터 길이가 항상 같으면 좋겠습니다만, 그렇지 않은 경우가 많을 것입니다. 때로는 길이가 짧을 수도 있고 길 수도 있습니다. 보내는 데이터마다 길이가 제각각이라면, 받는 쪽에서는 어디서부터 어디까지가 이번에 들어온 데이터인지를 알 수 없는 문제가 생깁니다.
그렇기 때문에 데이터가 어느 시점에 시작하고 끝나는가를 알 수 있어야 합니다. 우선 시작을 의미하는 값을 데이터를 보내기 전에 추가합니다. 일반적으로 STX(0x02, Start of Text)를 사용합니다. 데이터의 말단에는 끝을 의미하는 값을 추가합니다. 일반적으로 ETX(0x03, End of Text)를 사용합니다. 이런 구조로 데이터 덩어리(패킷)를 만들어 통신한다면 데이터의 길이에 상관없이 정확히 데이터의 시작과 끝을 알 수 있습니다. 이때 사용하는 STX나 ETX를 두고 '전송 제어 문자'라고 합니다.
그런데 만약 데이터 중에 STX(0x02)나 ETX(0x03)에 해당하는 값이 있게되면 문제가 생길 수 있습니다.
위 그림과 같은 경우 0x02는 데이터임에도 불구하고 STX(0x02)로 인식될 수 있어 오류가 발생할 수 있습니다. 이런 경우 데이터 중에 포함된 0x02라는 값은 STX가 아닌 데이터로서 인식하게끔 하는 장치가 필요합니다. 이때 사용하는 또 다른 전송 제어 문자가 DLE(0x10, Data link escape)입니다. 데이터를 앞에서부터 살펴보다가 DLE(0x10)를 만나면 뒤에 나올 0x02, 0x03은 STX나 ETX가 아닌 데이터로 인식하도록 합니다.
한편, DLE(0x10)때문에 비슷한 문제가 생길 수도 있습니다. 예를 들어 ETX 바로 전에 0x10이라는 데이터가 있다면 뒤에 이어지는 ETX는 전송제어문자가 아닌 데이터로 인식하게 되어버립니다.
이런 경우에는 0x10라는 값을 DLE가 아닌 데이터로서 취급하도록 해야합니다. 이를 위해서는 같은 방법으로 DLE를 사용합니다. 0x10이라는 값 앞에는 반드시 DLE를 추가하도록 합니다.
위와 같은 방법으로 이제는 데이터 길이에 상관없이 필요한 만큼의 데이터를 주고받을 수 있을 것 같습니다.
이 내용을 정리하는 도중에 조금 다른 관점으로 똑같은 처리를 할 수 있는 방법도 알게 되었습니다. 그것은 바로 DLE의 용도를 조금 바꾸는 것이었습니다. 데이터 중에 0x10이 있다면 그 앞에 DLE가 붙는 것은 변함이 없습니다. 대신 STX와 ETX 앞에 반드시 DLE가 오도록 합니다. 그렇게 하면 데이터 중에 0x02와 0x03 앞에는 DLE를 붙이지 않아도 됩니다.
실제로 검색을 해보면 방법 1로 구현을 하는 사람도 있고 방법 2로 구현한 사람도 있었습니다. 정확한 통신을 위해서 장치끼리 같은 방법을 선택하여 처리를 한다면 어느 방법도 딱히 문제는 없어 보입니다.
참고 사이트
'연구 노트 > Embedded' 카테고리의 다른 글
[MCS-51] AT89S52 특징 (0) | 2019.12.12 |
---|---|
[MCS-51] MCS-51 기본 구조 (0) | 2019.12.11 |
[STM32] UART 통신 수신 코드 구현 방법 (0) | 2019.10.17 |
PWM으로 스텝모터 제어시 꼭 확인합시다. (0) | 2019.09.19 |
아두이노 설치 및 환경 설정 (0) | 2018.10.09 |