UART란? (KR)

UART (Universal Asynchronous Receiver-Transmitter)

UART는 두 장치 간에 직렬(Serial) 통신을 하기 위한 하드웨어/프로토콜이다.


Baud Rate

UART는 클럭 신호 없이 비동기(Asynchronous) 방식으로 데이터를 주고받는다. 클럭이 없는 대신, 양쪽 장치가 같은 속도로 타이밍을 맞추는데 이 속도를 Baud Rate라고 한다. Baud Rate는 초당 전송하는 심볼(비트) 수를 의미한다.

예를 들어 Baud Rate = 9600이면:

  • 1초에 9600비트 전송
  • 비트 하나의 지속 시간 = 1 / 9600 ≈ 104 마이크로초

수신 측은 Start bit를 감지하는 순간부터 104μs마다 선의 전압을 읽어서 0인지 1인지 판단한다. 만약 양쪽의 Baud Rate가 조금이라도 다르면, 읽는 타이밍이 점점 어긋나서 데이터가 깨진다.

프레임 구조

UART는 데이터를 한 번에 한 프레임씩 전송하며, 프레임은 아래 순서로 구성된다.

① Start bit (1비트) 전송 시작을 알리는 신호로, 항상 **0 (LOW)**이다. 평소에 선이 HIGH 상태로 유지되다가 갑자기 LOW로 떨어지는 순간, 수신 측이 “아, 데이터가 온다!” 하고 카운팅을 시작한다.

② Data bits (보통 8비트) 실제 전송하는 데이터다. 주의할 점은 LSB(최하위 비트)부터 먼저 전송된다는 것이다.

예: 'A' = 0b01000001 → 오른쪽 끝 비트부터 전송: 1, 0, 0, 0, 0, 0, 1, 0

파형을 직접 볼 일이 생기면 이 순서를 모르면 헷갈리기 쉬우니 기억해두는 게 좋다.

③ Parity bit (선택, 0 또는 1비트) 오류 검출을 위한 선택적 비트다. 데이터 비트에서 1의 개수가 짝수인지 홀수인지를 기록해 수신 측이 확인한다. 다만 1비트짜리 단순한 검출이라 2비트 이상 오류는 잡지 못한다.

④ Stop bit (1~2비트) 전송 종료를 알리는 신호로, 항상 **1 (HIGH)**이다. 선을 다시 HIGH로 돌려놓아 다음 Start bit를 감지할 수 있게 준비시킨다.

전압 표현 (HIGH / LOW)

UART는 전압으로 0과 1을 표현한다.

  • Idle 상태 (아무것도 안 보낼 때): 선이 HIGH (보통 3.3V 또는 5V) 상태로 유지
  • Start bit: 선을 갑자기 **LOW (0V)**로 떨어뜨린다
  • 데이터 비트: HIGH = 1, LOW = 0
  • Stop bit: 다시 HIGH로 올려서 “전송 끝”을 알린다

Start bit가 0인 것도, Stop bit가 1인 것도 결국 이 전압 규칙에서 나온다. Idle이 HIGH이기 때문에 LOW로 떨어지는 순간이 “시작”의 신호가 되고, HIGH로 복귀하는 것이 “끝”의 신호가 되는 것이다.

장단점

UART가 지금도 널리 쓰이는 이유는 설정이 극도로 단순하기 때문이다. Baud Rate만 맞추면 선 3개(TX, RX, GND)로 바로 통신이 가능하고, 디버깅 목적으로 사용하기에도 알맞다. 임베디드 개발 환경에서 printf 디버깅을 할 때 거의 항상 UART를 쓰는 이유다.

다만 단점도 있다. 오류 감지가 약하고, 속도에 한계가 있으며 (최대 수 Mbps 수준으로 SPI나 USB에 비해 느리다), 1:1 통신만 가능하다. 여러 장치를 연결하려면 I2C나 SPI를 써야 한다.

실제 사용 사례

단순함 덕분에 UART는 다양한 곳에서 살아있다.

자동차 OBD-II: ELM327 칩이 OBD 프로토콜을 해석한 뒤 UART → Bluetooth로 스마트폰에 전달한다

아두이노 / STM32: Serial.print()가 UART로 PC에 전달되며, IDE의 시리얼 모니터가 이를 표시한다

라즈베리 파이: GPIO의 TX/RX 핀을 통해 모니터·키보드 없이 헤드리스 접속이 가능하다

GPS 모듈 (NEO-6M 등): NMEA 포맷의 위치 데이터를 UART로 스트리밍한다

무선 모듈 (ESP8266, HC-05, SIM800L): MCU와 UART로 연결되어 AT 커맨드로 제어한다

산업용 장비: RS-232, RS-485 모두 UART 기반 프로토콜이다

개인 프로젝트 구상

위 사례 중 특히 관심을 두는 부분은 OBD-II다. 이와 관련한 보안 프로젝트를 구상 중이기 때문이다.

블루투스 동글을 차량 OBD-II 포트에 연결해 데이터를 클라우드로 전송하고, 클라우드에 내장된 보안 소프트웨어가 자동차의 이상 여부를 점검하는 시스템이다. 제조사들도 유사한 프로젝트를 진행 중이지만, 내가 원하는 것은 좀 더 사용자 직관적인 탐지 방법이다.

물론 현재로서는 CAN Bus에 암호화가 없다는 점, OBD-II 포트로는 전체 CAN 트래픽의 극히 일부만 볼 수 있다는 점, 차종마다 메시지 포맷이 다르다는 점 등 한계가 있다. 하지만 하나씩 공부해나가다 보면 또 다른 아이디어와 돌파구가 보이지 않을까 싶다.

ⓒ 2025. Chaewon JEON All Rights Reserved.