이번 포스팅에서는 지난 RaspberryPi - 시리얼 통신편에서 마지막에 이야기 했던
UART(Universal Asynchronous Receiver&Transmitter) 통신에 대해서 간략하게 알아본 다음 이것을 라즈베리파이에서 어떻게 구현해야 하는지 알아보도록 하자.
UART(Universal Asynchronous Receiver&Transmitter)의 정의는 다음 링크에 자세히 나와있다.
[참고: 위키백과 - UART]
위 링크의 내용을 간단하게 말하면 "비동기 시리얼 통신"을 의미한다고 보면 된다. 바로 다음 내용을 보자.
UART 통신 구현은 하드웨어 구현과 소프트웨어 구현으로 나누어 진다.
하드웨어 구현은 다음과 같이 이루어진다.
위 그림과 같이 보드와 보드 사이에서 RX, TX, GND까지 총 3개의 포트가 물리적으로 연결되어 있어야 한다.
(라즈베리파이나 아두이노 같은 임베디드 보드를 사용할 경우, 점퍼 케이블을 사용하여 연결하면 된다.)
각 포트의 기능을 보면
- RX
첫 글자 R이 Receiver를 의미하는 것으로 데이터를 수신하는 기능을 수행한다.- TX
첫 글자 T가 Transmitter를 의미하는 것으로 데이터를 송신하는 기능을 수행한다.- GND(Ground)
양쪽 보드 간의 전압을 맞춰주는 기능을 수행한다.
연결 시 주의할 사항으로 TX 포트를 RX 포트에 연결해야 한다는 것이다.
가끔 실수로 잘못 연결하는 경우가 생기기도 한다.😂
이전 시리얼 통신 포스팅에서 다뤘던 병렬 통신과 달리 직렬 통신이 가진 장점을 근거로 하여 라즈베리파이와 같은 임베디드 보드에는 UART 모듈이 자체적으로 구비가 되어 있다.
이는 라즈베리파이 핀맵을 보면 바로 알 수 있다.
[사진 출처: Microsoft Docs]
위 사진에서 8번 핀과 10번 핀을 보면 각각 UART 통신의 TX와 RX의 기능을 수행한다는 것을 알 수 있다.
GND의 경우 6번 핀이나 9번 핀 등 여러 GND 핀 중에 하나를 사용하여 연결하면 된다.
(✋라즈베리파이 전원을 위해 1번 핀(3.3v 전원 핀)이나 2번 핀, 4번 핀(5v 전원 핀) 셋 중 하나를 사용하여 전원을 연결하도록 한다.)
Baud Rate란, "초당 심볼 수"를 의미한다.
[참고: 위키백과 - 보(통신 단위)]
여기서 심볼이란, 데이터의 묶음으로 생각하면 되는데 시리얼 통신의 경우 하나의 데이터 묶음이 1byte(8bit)이다.
하지만, 일반적으로 Baud Rate를 설정할 때 사용하는 의미는 BPS(Bit Per Second) 즉, "초당 비트 수"의 의미로 사용한다.
따라서, 완전히 같은 개념은 아니지만 Baud Rate를 초당 전달하는 비트의 수로 이해하면 된다.
예를 들어, 32 baud rate는 32bps이고 이는 1초당 32비트를 전달하는 것으로 1초에 정수 데이터 하나를 전달한다고 보면 된다.
Baud Rate 설정이 필요한 이유는 UART 통신이 비동기식으로 이루어지기 때문이다.
- 동기식 통신의 경우
송신자가 보낸 데이터가 수신자측으로 완전히 전달이 된 다음에야 다음 데이터를 전달할 수 있기 때문에 데이터를 "정확하게" 전달할 수 있다.
하지만,
- 비동기식 통신의 경우
수신자측의 정확한 수신 여부와 관계없이 계속해서 전달이 가능하다.
다시 말해, 수신자측에서 전달 받은 데이터를 정확하게 구분하기 위해 다른 요인이 필요했고 이것이 바로 송신자와 수신자를 같은 Baud Rate로 설정하여 데이터의 전달 속도를 맟추는 것이다.
같은 Baud Rate로 설정하는 것 외에도 데이터를 구분하는 또 다른 요인이 존재하는데 이것은 바로 데이터의 송수신 형태를 결정하는 방법이다.
다음 그림을 보자.
[사진 출처: 위키백과 - UART]
총 11bit로 8bit의 데이터 비트에 맨 앞과 맨 뒤에 시작 비트와 종료 비트가 추가되어 같은 Baud Rate 설정 아래에 수신자측에서 데이터를 정확하게 구분할 수 있도록 한다.
패리티 비트의 경우, 전달 받은 데이터가 손실되지 않았는지 판단하는 비트이다.
글이 길어지다 보니 소프트웨어 구현은 다음 포스팅에서 다루어 보도록 하자.