안녕하세요 제타지니입니다. 오늘은 아두이노의 시리얼 통신에 대해서 더 다루어보겠습니다.
이전에 Serial 클래스를 업로드 하면서 Serial 통신에 대한 개념 포스트가 필요하다는 것을 알게되었습니다.
그래서 이번 포스트에서는 Serial 통신에 대해서 공부하고, 그에 대한 내용을 담아 업로드 하려고 합니다.
Serial 통신
Serial = 직렬, 즉 직렬 통신이라는 뜻이지요. 이 직렬통신은 아두이노 - PC 사이에서 뿐만이아니라, 여러 기기에서 사용되는 통신입니다.
기본 의미부터 살펴보자면, [직렬 통신]...? 그럼 [병렬 통신]도 있나요..?
있죠. 있습니다. Parallel(병렬) 통신이라고 합니다. 둘의 차이란... 무엇일까요?
쉽게, 우리가 물리학에서 나오는 '전기' 파트에서 직렬과 병렬을 보면, 이런 식으로 되어 있지요..?
Figure 1. 직렬 연결(좌), 병렬 연결(우)
비슷한 개념입니다.
저항을 '소자'들 혹은 '아두이노' 등의 '데이터를 받는 역할(수신부, Receive)'로 이해하시고,
전압을 '컴퓨터', '아두이노' 등의 '데이터를 보내는 역할(송신부, Transmit)'으로 이해하신다면,
[직렬 통신]은 한 번에 한 비트씩 순차적으로 송신을 합니다. 그렇기 때문에 직렬 통신은 병렬 통신에 비해서 속도가 느린 편입니다만, '직렬 연결'에서 전압이 나눠지는 것이 아니라, 온전히 지나면서 감소되지요? 그 '힘'이라는 성질과 동일하게 '직렬 통신'은 병렬 통신에 비해서 더 장거리에서 사용이 가능합니다. [병렬 통신]은 기기간 통신 거리가 20m인데 반해 직렬 통신은 케이블 길이가 최대 1.2km까지 가능하거든요. 또한 [직렬 연결]은 병렬 연결에 비해서 훨씬 간단합니다.
반면, [병렬 통신]은 한 번에 전체 바이트를 송신하지요. 이는 병렬 연결이 더 빠른 속도를 지닌다는 것을 이야기합니다. 이는 전자기학에서 병렬연결과 비슷한 성질을 지닙니다.
대부분의 컴퓨터, PC에는 2개의 RS232기반의 포트가 있습니다. (RS232포트는 시리얼 연결시에 쓰이는 포트입니다. 자세한건 밑에서 설명할게요!) 즉, 대부분의 기기는 직렬 통신을 지원하는 데요, 여러가지 디바이스에서 계측을 위한 일반 통신 프로토콜이며, 또한 원격 샘플링 디바이스로 데이터를 수집하는 경우에도 시리얼 통신을 사용할 수 있습니다. 통상적으로 엔지니어들은 ASCII 데이터를 전송할 때 Serial 통신을 이용합니다.
Serial 통신을 이루는 핀에는 세 가지가 있습니다.
이전의 포스트에 올렸던 그림입니다. Serial 통신을 하기 위해서는 송신 데이터 핀(TXD, Transmit Data), 수신 데이터 핀(RXD, Receive Data) 그리고 접지 핀(GND, Ground) 3개의 전송 라인을 통해서 통신합니다. 시리얼은 '비동기식'이므로 한쪽에서 송신을 하면, 다른 쪽에서는 수신을 해야 합니다. 시리얼에서 중요한 개념이 있다면, '보드 속도(baudrate)' '데이터 비트' '정지 비트' '패리티'가 있습니다.
*RS232
RS232라는 녀석은 IBM 호환 PC에서 사용되는 Serial 연결입니다. 엔지니어들은 컴퓨터를 센서 또는 모뎀에 연결하거나 계측기 컨트롤 등 여러 용도로 RS232를 사용합니다.
*baudrate, 보율
baudrate, 보율이라는 것은 '보드 속도'를 나타냅니다. 이는 통신의 속도를 측정하는 수치이며 초당 비트 전송 숫자로 표시됩니다. [Bps와 비교하여 설명하면 이해하기 쉽기에 비교하여 설명해 보도록 하겠습니다.] baudrate은 변조 속도를 나타내는 단위로 프랑스 과학자 J.M.E Baudot를 기념하여 사용되었습니다. 초기의 데이터 통신에서는 데이터 전송 속도를 표시하기 위해서 BPS(Bits Per Second), [즉 1초동안 전달되는 데이터 비트 개수]를 썼습니다. 하지만 최근 통신 기술의 발달로 인하여 신호가 한 번 변할 때 한 비트 이상의 정보를 표현하는 것이 가능해짐에 따라서, bps는 보율보다 크거나 같은 값을 가지게 되었지요.
일반적으로 엔지니어들이 말하는 [클럭 주기]가 보드 속도를 의미한다고 하더군요. 따라서 프로토콜에 4800 보드 속도라고 나오는 경우 클럭이 4800 Hz로 작동한다는 뜻이지요. 다시말하자면, 시리얼 포트는 4800 Hz로 데이터 라인을 샘플링한다는 이야기지요. 보다 높은 보드 속도를 지향할 경우, 디바이스간의 거리가 짧아져야 합니다. 통상적으로 엔지니어들이 높은 보드 속도를 사용할 때는 기기간의 거리가 가까운 경우라고 하더군요.
*데이터 비트
전송되는 실제 데이터 비트의 측정값을 의미합니다. 실제로, 컴퓨터가 정보 패킷을 보낼 때 실제 데이터의 양은 전체 8비트가 되지 않습니다. 데이터 패킷의 표준 값은 5, 7, 8 비트입니다. 즉, [어떤 정보]를 전송하느냐에 따라서 데이터 비트를 세팅하는 것이 관건이라고 하겠습니다. 예를 들어 영문 ASCII 값은 0~127 사이 즉, 7비트 입니다. 확장된 ASCII는 0~255값 (8비트)을 사용합니다. 단순히 ASCII 문자를 보낼 경우, 패킷*당 7비트의 데이터를 보내면 통신에 아무 문제가 없겠지요?? 또한 숫자만 사용하신다면, 4비트가 필요하고, 영문 대/소문자만 사용하신다면 5비트가 필요하니, 패킷당 자신이 전송하려는 정보에 따라 데이터 비트를 세팅하시면 되겠습니다!
(*패킷 = 단일 바이트 전송, 시작/정지 비트, 데이터 비트, 패리티 포함)
*정지 비트
단일 패킷에 대한 통신의 종료를 알리는 데 사용됩니다. 일반적인 값은 1, 1.5 ,2 비트 입니다. 데이터는 모든 라인을 통해 클럭되며 각 디바이스에는 고유의 클럭이 있기 때문에 두 개의 디바이스는 동기화가 되지 않을 가능성이 있습니다. 따라서 정지 비트는 전송의 종료를 알려줄 뿐 아니라 클럭 속도 오류를 방지하기 위한 완충 역할을 합니다. 더욱 많은 비트가 정지 비트에 쓰이면 다른 클럭을 동기화할 수 있지만 데이터 전송 속도는 느려집니다.
*패리티
Serial 통신에서 에러를 체크하는 데 사용됩니다. 바이트 별로 제대로 수신되었는 지 확인하기 위하여 사용됩니다.
패리티에는 짝수, 홀수, 마크, 스페이스 네가지 형태가 있습니다. 혹은 '패리티 없음'을 사용할 수도 있지요. 예를 들어 데이터가 1011이라고 가정한다면, 1이 세 개 이므로 홀수이지요? 여기서 만약 '짝수 패리티'를 선택했다면, 뒤에 1을 하나 더 붙여 짝수로 만드는 것입니다. 따라서, 패리티 비트는 1이지요. 반대로 같은 데이터에 '홀수 패리티'를 선택한다면, 이미 홀수 이므로, 패리티 비트는 0이 되지요. 즉, '짝수 패리티'선택 시에는 1011(1)을 보내고, '홀수 패리티' 선택 시에는 1011(0)을 보내 송신한 data bit가 제대로 수신했는지 체크를 하는 거죠. 하지만 단점이 있다면, 패리티를 이용해서 수신 데이터가 이상한 것은 알 수 있어도 어느 비트에 이상이 있는지를 확인할 수가 없어 보통의 경우는 사용하지 않습니다. 모든 바이트를 일일이 확인하는 대신에 프로토콜에 아예 체크 바이트를 따로 두고, 전체적으로 확인하는 방법을 사용합니다.
*UART 통신 / USART 통신
MCU(Micro-Controller Unit, 마이크로 컨트롤러) 입장에서 보면, RS232C 와 같은 녀석은 전기적인 규격을 의미하고,
논리적인 부분은 UART / USART 입니다.
UART란 Universal Asynchronous Receiver/Transmitter의 약자로, 비동기식 통신을 의미합니다.
USART란 Universal Synchronous Asynchronous Receiver/Transmitter의 약자로, 동기식 통신을 의미합니다. (USART는 동기식 통신과 비동기식 통신 모두 포함합니다.)
가장 극명한 차이점을 나타내는 것은 '데이터를 클럭화 시켜서 보내느냐 / 보내지 않느냐'가 되겠습니다.
즉 동기식 통신의 경우 클럭의 주기에 맞춰서 데이터를 보내는 데 반해서 비동기식 통신은 클럭에는 무관하게 데이터를 순차적으로 보내는 것이지요.
-UART
>비동기식 통신
>USART에 비해 더 작은 data rate를 지원(작은 데이터 전송 속도)
>수신부는 수신을 하기 전 - 즉, 통신 전에 - 에 통신 속도(baudrate)를 알아야 함
>시작 비트, 정지 비트, 패리티(짝수 or 홀수)를 사용하는 간단한 프로토콜
>데이터는 바이트 단위로 전송
>내부적으로 클럭을 발생시켜서 데이터의 흐름과 동기화 시킴
==> 시작비트로의 전환에 용이함
>USART와 비슷한 데이터를 만들지 못함. (USART로 전환 불가)
-USART
>동기식 통신
>클럭화 된 데이터(clocked data) - 즉, 동기화 된 데이터-를 송신하므로, 이는 더 높은 data rate를 지원.
>동기화된 데이터는 블럭 단위로 전송
>수신부는 통신시에 통신 속도(baudrate)을 알 필요가 없음 //clock 신호와 데이터로 알 수 있음
>UART와 비슷한 데이터를 만들 수 있음 ==> UART 로 쓰일 수도 있음
>USART는 복잡한 형태이기에 많은 프로토콜에 쓰임
제 포스트가 도움이 되었거나 혹은 참조,인용하실 때는 댓글, 공감 부탁드립니다.
'만져보는 임베디드 시스템 > 아두이노 소프트웨어' 카테고리의 다른 글
아두이노 소프트웨어-xx. I2C와 SPI 통신 (0) | 2021.01.05 |
---|---|
아두이노 소프트웨어-xviii. 아두이노 String 클래스 - String Class (0) | 2021.01.05 |
아두이노 소프트웨어-xvii. 아두이노 Serial 클래스 - Serial Class (0) | 2021.01.05 |
아두이노 소프트웨어-xvi. 함수 - 인터럽트 함수 (0) | 2021.01.05 |
아두이노 소프트웨어-xv. 함수 - 인터럽트 개념 (0) | 2021.01.05 |