03. 직렬통신 (UART, USART) 완전 분해

owljun·2025년 7월 25일

UART

UART 는 직렬(Serial) 통신의 종류로서, H/W 간의 안정적인 통신을 보장해주는 범용 통신 프로토콜이다.

UART는 병렬 데이터를 직렬화하여 1비트씩 전송한다.
즉, 데이터는 한 줄(Single Wire, Tx/Rx)로 시간차를 두고 순차적으로 전달된다.

이 UART의 동작을 이해해보자.

  • UART의 핵심 구조
    • 비동기 방식의 통신
    • 시작비트 -> 데이터비트 -> 패리티(옵션) -> 스톱비트

UART 동작의 이해

이걸 가지고 어떻게 통신하는걸까?

데이터는 하나의 프레임으로 구성이 되며, 수신측은 시작비트를 검출한 뒤 자체 클럭으로 비트를 샘플링하며 데이터를 수신한다.

시작 비트 검출이 바로 UART가 비동기로 동작할 수 있는 핵심 이유이다.

직렬 통신 특성상 노이즈에 취약한 단점이 있는데, 이 단점을 상쇄하기 위해 패리티 비트를 넣어서 오류를 검출 할 수 있다. (하지만 오류를 바로 수정할 순 없음)

틈새 패리티 종류 설명

Even Parity : 전송된 1의 개수를 짝수로 맞춤
Odd Parity : 전송된 1의 개수를 홀수로 맞춤

Stop 비트는 프레임의 종료를 알리며, 다음 시작 비트를 확실히 구분할 수 있도록 Idle 구간을 만들어 다음 시작 비트를 명확히 구분할 수 있게 해준다, 보통 1~2bit로 구성된다.

궁금증 -> 해답을 통한 학습

궁금증 1.

시작비트 부터 끝 비트까지 어떻게 파싱을 할까?
클럭 신호를 통해 구분한다고 적혀있는데, 그렇다면 Baud Rate가 클럭의 주기가 되고 rate가 9600 이라면
1/9600 초당 1비트를 구분하는것인지?

수신 장치는 시작 비트를 검출한 뒤, 내부 타이머를 시작하여 일정 주기로 비트를 샘플링한다.
예: 9600bps라면 약 104μs 간격으로 데이터를 읽어 프레임을 구성한다.

궁금증 2.

송신, 수신측에서 데이터비트 , 패리티 사용여부 등을 직접 정의해서 맞춰줘야하는가?

UART는 매우 단순한 하드웨어이므로 데이터 비트(보통 8bit), 패리티(On/Off), Stop bit 수(1/2) 등을
양쪽에서 동일하게 설정해야 통신이 성립한다.
ex: 8N1 (8bit data, No parity, 1 stop bit)

궁금증 3.
시작 비트 와 끝 비트는 어쨋든 0, 1 둘 중 하나일텐데 정해져있는것인지? 아니면 사용자가 정의해서 사용하는건지?

UART는 Idle 상태에서 기본 전압이 HIGH (1) 이고,
데이터 전송을 시작할 땐 LOW (0) 으로 떨어지면서 시작 비트를 보낸다.
수신 장치는 HIGH -> LOW 전이(edge) 를 보고 "시작됐다!" 판단한다.


USART

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)는 UART의 상위 호환으로,
비동기(Asynchronous)와 동기(Synchronous) 통신 모두 지원하는 하드웨어 기반 통신 모듈이다.

간신히 UART를 이해했는데 이건 또 뭐야? 라고 생각하실 필요없다,
오히려 UART를 이해 했다면 이건 '덤' 이다.

USART의 두 가지 동작 모드

  1. 비동기 모드

    • UART와 거의 동일하게 동작
    • 시작 비트 -> 데이터비트 -> 패리티(옵션) -> 스탑비트 구조
    • Baud Rate 동일 하게 맞춰야 사용 가능 (중요)
  2. 동기 모드 (핵심)

    • 송신자와 수신자가 공통 클럭(CK) 공유
    • 클럭 동기화가 되므로 훨씬 정확하고 고속 통신 가능
    • SPI나 I2C처럼 다수 장치를 안정적으로 제어할 수 있음

모드 비교 요약

구분비동기 모드동기 모드
클럭없음있음
동작 방식시작 비트 검출 → 샘플링공통 클럭 기준으로 정렬된 통신
정확성클럭 오차에 민감매우 정확함
속도일반적 UART 수준고속 가능

USART 동기 통신 구조

  • 클럭(CK)는 마스터(ex: 제어 장치 MCU 등)에서 슬레이브(ex: 센서)로 공급
  • 데이터가 없는 상태에서도 클럭은 계속 유지됨
  • 슬레이브는 클럭의 엣지(상승/하강)에 맞춰 비트를 읽음

궁금증 -> 해답을 통한 학습

궁금증1.

클럭신호가 동기화의 핵심 기술인거 같은데, 자세한 동작이 궁금해요.
일정 주기로 어떤 데이터를 보내다가 , 데이터를 전송시작하면 어떠한 값을 지닌 클럭값을 보내는 구조이겠네요?

단순 USART 통신 (Point-to-Point) : 데이터가 없으면 TX는 Idle(유휴)상태 유지, 하지만 CK는 계속 토글된다. 즉, 클럭은 한 틱당 1bit를 보내는데, 그 bit가 상승신호일때, 데이터가 있다고 판단, 읽기를 시작한다.

궁금증2.

말만 들어보면 비동기 통신이 훨씬 빠를거 같은데 , 동기의 장점이 따로 있겠죠?

정확하다, 비동기 통신은 속도가 빠를수록 싱크가 안맞아질 가능성이 존재한다, 동기방식의 통신은 안정성과 정확성을 확보하고, 대신 속도를 조금 포기한 트레이드 오프가 일어난 것.

궁금증3.

어라 CK를 통해 동기화를 해야하는데 , 마스터만 CK를 보내는데 양방향 통신은 안되나요 그럼?

결론부터 말하면, 양방향 통신이 가능하다. 하지만 모든 제어권은 마스터에게 있다.
CK신호는 무조건 마스터만 제어가 가능하다, 즉 상승에지를 CK에 실어보낼때, 데이터를 같이 보내면 마스터가 데이터를 전송하는 것이고, 상승에지만 실어보낸다면 데이터를 수신하겠다고 슬레이브에게 전달하는 것이다.

정리 UART vs USART

항목UARTUSART
통신 방식비동기비동기 + 동기
클럭 신호 필요 여부불필요동기 모드에서 필요
구성 핀 수TX, RXTX, RX, (CK)
전송 정확도중간 (Baud 맞추기 필수)높음 (클럭 동기화)
응용 분야단순 시리얼 통신SPI/I2C 대체, 고속/정확한 통신 요구
profile
Embedded S/W Developer :)

0개의 댓글