개인 공부

Serial 통신 ( 직렬통신 )

Machine_웅 2022. 9. 27. 10:12
728x90
반응형

시리얼(Serial) 통신 소개

임베디드 시스템은 각종 프로세서와 회로들 간에 서로 통신하며 동작하는 것이 핵심이기 때문에

데이터를 주고 받는  표준 프로토콜들이 필요한 것은 당연합니다.

 

수많은 프로토콜들이 있지만 일반적으로, 크게 두 개의 카테고리로 나눌 수 있습니다.

바로 패러럴(병렬, parallel)과 시리얼(직렬, serial) 입니다.

 


패러럴(병렬)과 시리얼(직렬)

패러럴(Parallel) 인터페이스는 다수의 비트(bit)를 한번에 전송하는 방법입니다.

이들은 보통 8 또는 16 또는 그 이상의 라인을 통해 동시에 데이터를 보내줍니다.

 

그리고 타이밍(clock)에 맞춰 모든 라인이 같이 동작할 수 있도록

clock(CLK) 라인이 필요하므로 8-bit data bus 의 경우 9라인이 사용됩니다.

 

 

 

 

 

 

 

 

 

 


 

반대로 시리얼(Serial) 인터페이스는 데이터를 스트림으로 바꿔서(직렬화, serialization) 한 번에 한 비트씩 전송합니다.

아래와 같이 시리얼 인터페이스는 clock 라인을 포함 2라인으로 데이터를 전송할 수 있습니다.

 

패러럴이 고속도로라면 시리얼은 국도입니다. 대신 고속도로가 국도보다 소모되는 자원이나 비용이 많은 셈입니다.

패러럴은 빠르고 상대적으로 구현이 쉽지만 input/output(I/O) 라인을 많이 소모합니다.

 

아두이노 UNO 보드에 사용한다고 생각해 보시면 패러럴 방식이 소모하는 I/O 라인이 너무 많다고 느껴지실겁니다.

따라서 속도를 좀 희생하더라도 I/O 라인을 아낄 필요가 있습니다.

 

 


동기식 VS 비동기식

 

동기식 시리얼 인터페이스는 데이터 라인(data line)의 동작을 클럭 시그널(clock signal) 라인의 동작과 동기화 시킵니다. 그리고 시리얼 버스에 함께 연결된 장치들이 이 클럭을 공유합니다.

이 방식은 직관적이고 종종 보다 빠르게 동작하지만 하나의 라인을 더 필요로 합니다.

대표적으로 SPI, I2C 프로토콜이 이런 방식을 사용합니다.

 

 

비동기식은 데이터가 외부 클럭 시그널(external clock signal)의 도움없이 동작하는 것을 의미합니다.

대신 데이터를 안정적으로 전송, 수신할 수 있도록 처리를 해줘야 합니다.

 

이 문서에서 다루는 시리얼(Serial, UART) 통신은 비동기식 시리얼 통신에 초점이 맞춰져 있습니다.

 

일반적으로 시리얼 통신이라 부르는 것들이 대부분이 비동기식 시리얼 통신을 말합니다.

GPS, 블루투스, XBee, Serial LCD 등이 비동기식 시리얼 통신을 사용합니다.

 

동기식 방식

  1. 데이터 신호화는 별도로 동기 신호(Clock 신호)를 함께 전송
  2. 한번에 여러 문자를 수용하는 데이터 블록 단위로 전송하는 방식
  3. 일반적으로 상당히 큰 데이터 블럭인 경우에는 동기식 전송방식이 더 좋은 성능을 가짐
  4. 정보통신에서 사용되는 대부분의 통신 프로토콜에서 이용

 

비동기식 방식

  1. 데이터 신호만을 보내고 각각의 방식에 따라 데이터 비트를 찾아냄
  2. 보통 한 문자 단위와 같이 매우 작은 비트 블럭의 앞과 뒤에 Start 비트와 Stop 비트를 삽입하여 동기화하는 방식
  3. 일반적으로 비동기식 전송방식은 단순하고 저렴하나 각 문자당 Start 비트와 Stop 비트를 비롯해 2~3 비트의 오버헤드를 요구하므로 전송효울이 다소 떨어짐
  4. 보통 낮은 전송속도에서 이용

시리얼 동작 방식

 

시리얼은 한번에 하나의 비트를 보내지만 그건 물리적인 통신의 개념이고

실제로 구현할땐 여러개의 비트의 모음을 짜서 보냅니다.

이를 패킷(packet)이라고 하는데, 8로 설정하면 data를 8bit 씩 보낸다는 겁니다.

 

 

아래와 같은 데이터가 있다고 가정해 봅니다. 네모 한 칸은 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로 구현한 사람도 있었습니다. 정확한 통신을 위해서 장치끼리 같은 방법을 선택하여 처리를 한다면 어느 방법도 딱히 문제는 없어 보입니다.

 

출처: https://jakupsil.tistory.com/11 [작업실 노트:티스토리]

 

 

https://www.hardcopyworld.com/?p=2080 

 

시리얼 통신 기초 (Serial Communication)

아두이노를 사용하면 가장 자주 접하는 통신 방법이 Serial 통신입니다. 일단 PC와 연결되는것 자체가 아두이노 입장에서는 Serial 통신을 사용하는 것이니까요. 그에 반해 Serial 통신의 세부 내용

www.hardcopyworld.com

 

 

 

728x90
반응형