UART
Universal Asynchronous Receiver/Transmitter

오늘의 주제는 UART이다. 파이널 프로젝트를 수행하게 되면 아마 가장 먼저 써먹지 않을까 싶은 개념이면서, 사전 기획 단계에서도 계속 등장하는 친구였다. 대충 어떤 건진 알겠는데... 그래도 명확히 공부해두면 추후 직접 하드웨어를 건드릴 때 도움이 되지 않을까 싶어 오늘의 주제로 선정하였다. 간단하게 조사해보자.
1. UART의 개요
1.1 UART의 정의와 역할
UART(Universal Asynchronous Receiver/Transmitter)는 직렬 통신을 위한 하드웨어 장치이자 프로토콜로, 데이터를 비트 단위로 송수신하는 데 사용된다. 이는 컴퓨터, 마이크로컨트롤러, 임베디드 장치 간의 통신에 널리 사용되며, 데이터를 전송하기 위해 클럭 신호를 공유하지 않는 비동기 통신 방식을 채택한다.
UART는 송신 측에서 데이터를 직렬화(병렬 데이터를 1비트 단위로 변환)한 후 전송하고, 수신 측에서는 이를 다시 병렬화하여 원래 데이터로 복원한다. 이 과정을 통해 장치 간 효율적인 데이터 교환이 가능해진다.
역할
- 데이터 변환: 병렬 데이터를 직렬 데이터로 변환하고, 다시 병렬 데이터로 복원
- 속도 동기화: 송수신 장치 간 보드레이트(전송 속도)를 설정하여 통신
- 에러 검출: 데이터를 보호하기 위해 패리티 비트와 같은 기본적인 에러 검출 기능 제공
1.2 UART의 역사와 발전 과정
UART의 역사는 컴퓨터의 초기 통신 기술 개발과 함께 시작되었다. 20세기 중반, 전신 및 초기 컴퓨터 시스템에서 데이터를 전송하기 위해 병렬 통신이 사용되었으나, 거리와 비용 문제로 인해 직렬 통신 기술이 부상하게 되었다.
주요 발전 단계
-
초기 직렬 통신
- 1950~60년대, RS-232 표준이 도입되며 직렬 통신의 기초가 마련되었다.
- 당시 UART는 주로 대형 컴퓨터와 주변 기기를 연결하는 데 사용되었다.
-
UART 칩의 등장
- 1970년대, UART 기능이 전용 칩으로 구현되기 시작.
- 대표적으로 Intel 8250 UART는 IBM PC와 같은 초기 개인용 컴퓨터에서 사용되며 표준으로 자리 잡았다.
-
내장형 UART
- 1980~90년대, UART는 마이크로컨트롤러와 마이크로프로세서에 내장되기 시작하여 별도의 칩 없이도 직렬 통신이 가능해졌다.
-
현대적 발전
- 고속 통신과 USB, I2C와 같은 새로운 인터페이스의 등장으로 UART는 임베디드 장치와 간단한 데이터 통신에 주로 사용되고 있다.
1.3 UART와 다른 직렬 통신 방식의 비교
UART는 직렬 통신 방식 중 가장 단순하고 널리 사용되는 방법이지만, 다른 기술과 비교했을 때 장단점이 명확하다.
특징 | UART | SPI | I2C |
---|
통신 방식 | 비동기 | 동기 | 동기 |
데이터 라인 | TX, RX, GND | MOSI, MISO, SCLK, SS | SDA, SCL |
속도 | 중간 (~1Mbps) | 빠름 (~10Mbps 이상) | 느림 (~3.4Mbps 최대) |
거리 제한 | 짧음 (~1.5m) | 매우 짧음 (~30cm) | 중간 (~1m) |
확장성 | 1:1 통신 | 1:1 또는 1:N | 1:N 통신 가능 |
적용 분야 | 임베디드 시스템, 디버깅 | 센서 통합, 고속 데이터 전송 | 다중 센서 네트워크 |
UART의 장점
- 설계 단순성: 클럭 신호가 필요 없으며, 적은 핀으로 통신이 가능
- 범용성: 거의 모든 마이크로컨트롤러에서 기본적으로 지원
- 낮은 비용: 하드웨어 요구사항이 간단하여 경제적
UART의 단점
- 속도 한계: 동기 통신 방식에 비해 느린 전송 속도
- 거리 제한: 신호 간섭 및 감쇠로 인해 통신 거리가 짧음
- 확장성 부족: 한 번에 하나의 장치와만 직접 통신 가능
UART는 설계가 간단하고 비용 효율적이기 때문에 디버깅, IoT 장치 통신, 펌웨어 업로드와 같은 응용 분야에서 여전히 중요한 역할을 하고 있다.
2. UART의 동작 원리
2.1 직렬 통신과 병렬 통신의 차이
UART는 직렬 통신 방식을 사용하는데, 이는 데이터를 한 번에 1비트씩 전송하는 방식이다. 반면 병렬 통신은 여러 비트를 동시에 전송한다. 이 두 방식은 속도, 거리, 복잡성에서 명확한 차이를 보인다.
직렬 통신
- 동작 원리
직렬 통신에서는 데이터가 송신 측에서 비트 단위로 순차적으로 전송되고, 수신 측에서 이를 다시 병렬 데이터로 복원한다.
- 장점
- 데이터 전송을 위한 선이 적어 하드웨어 요구사항이 단순하다.
- 신호 간섭과 감쇠에 대한 저항성이 높아 긴 거리 전송에 적합하다.
- 단점
- 한 번에 한 비트씩 처리되므로, 전송 속도가 병렬 통신보다 느릴 수 있다.
병렬 통신
- 동작 원리
병렬 통신에서는 여러 비트를 동시에 각 라인으로 전송하며, 속도가 더 빠르다.
- 장점
- 고속 데이터 전송이 가능하다.
- 대량의 데이터를 짧은 시간에 처리할 수 있다.
- 단점
- 신호 간섭과 감쇠로 인해 긴 거리 전송에 적합하지 않다.
- 많은 데이터 라인이 필요해 하드웨어가 복잡하고 비용이 증가한다.
항목 | 직렬 통신 | 병렬 통신 |
---|
데이터 전송 방식 | 한 번에 1비트씩 | 여러 비트 동시에 |
속도 | 느림 | 빠름 |
거리 | 긴 거리 적합 | 짧은 거리 적합 |
하드웨어 요구 | 단순 | 복잡 |
UART는 직렬 통신 방식의 대표적인 구현체로, 긴 거리에서도 신뢰성 있는 데이터 전송을 제공한다.
2.2 UART의 데이터 프레임 구조
UART 데이터 전송은 일정한 규칙에 따라 데이터를 비트 단위로 전송한다. 이 데이터는 프레임(frame) 구조로 정의되며, 각 프레임은 다음과 같은 구성 요소로 이루어진다.
데이터 프레임 구성 요소
-
시작 비트(Start Bit)
- 데이터 전송이 시작됨을 나타내는 신호.
- 송신 측은 라인을 고전압(1) 상태에서 저전압(0) 상태로 전환하여 시작 비트를 생성한다.
-
데이터 비트(Data Bits)
- 실제 데이터 비트를 포함하며, 길이는 일반적으로 5~9비트이다.
- 데이터를 순차적으로 전송하며, LSB(Least Significant Bit)부터 MSB(Most Significant Bit) 순서로 송신된다.
-
패리티 비트(Parity Bit) (선택적)
- 전송된 데이터의 에러를 감지하기 위한 비트.
- 짝수 패리티: 전송된 데이터의 1의 개수가 짝수가 되도록 추가
- 홀수 패리티: 전송된 데이터의 1의 개수가 홀수가 되도록 추가
-
정지 비트(Stop Bit)
- 데이터 전송이 끝났음을 나타내는 신호.
- 일반적으로 1~2비트 길이로 설정되며, 라인을 다시 고전압(1) 상태로 전환
데이터 프레임 예시
구성 요소 | 비트 길이 | 설명 |
---|
시작 비트(Start) | 1비트 | 데이터 전송 시작 표시 |
데이터 비트(Data) | 8비트 | 전송되는 실제 데이터 |
패리티 비트(Parity) | 1비트 | (선택적) 에러 감지 |
정지 비트(Stop) | 1~2비트 | 데이터 전송 종료 표시 |
예제
8N1(8 Data Bits, No Parity, 1 Stop Bit) 설정으로 "A"를 전송하는 경우:
- ASCII 값: 65 (01000001)
- 전송 비트:
Start(0) + 01000001(Data) + Stop(1)
2.3 보드레이트와 통신 속도의 관계
보드레이트(Baud Rate) 는 단위 시간당 전송되는 신호 변화 수를 의미하며, UART에서 데이터 전송 속도를 결정짓는 중요한 요소다.
보드레이트 정의
- 1초당 전송되는 심볼(신호 변화)의 개수
- 일반적인 보드레이트: 9600, 115200bps 등.
데이터 전송 속도와의 관계
보드레이트는 데이터 전송 속도(bits per second, bps)와 밀접한 관계가 있다.
- UART에서 1심볼은 일반적으로 1비트를 나타내므로, 보드레이트는 bps와 같을 수 있다.
- 단, 패리티 비트, 정지 비트 등이 포함될 경우 실제 데이터 전송 속도는 감소한다.
실제 데이터 전송 속도 계산
실제 데이터 전송 속도 (bps)=프레임 길이데이터 비트 수×보드레이트
예를 들어:
- 보드레이트: 9600bps
- 프레임 구성: 1 Start + 8 Data + 1 Stop = 10비트
- 데이터 속도: 108×9600=7680bps
보드레이트 설정의 중요성
- 송수신 장치의 보드레이트가 일치하지 않으면 데이터 손실 및 오류 발생.
- 너무 높은 보드레이트를 설정하면, 신호 간섭과 데이터 손실 가능성이 증가한다.
UART 통신에서 보드레이트는 시스템 성능과 신뢰성을 좌우하는 중요한 파라미터로, 설정 시 환경과 요구사항을 면밀히 고려해야 한다.
3. UART의 하드웨어 구성과 인터페이스
3.1 UART 컨트롤러와 레지스터
UART의 핵심은 데이터 송수신을 담당하는 UART 컨트롤러다. 이는 마이크로컨트롤러나 컴퓨터에 내장된 하드웨어 모듈로, 데이터를 변환하고 전송을 제어한다. UART 컨트롤러는 레지스터를 통해 작동하며, 사용자는 레지스터 값을 설정하거나 읽어 하드웨어를 제어한다.
주요 레지스터
-
데이터 레지스터(Data Register, DR)
- 송수신되는 데이터를 임시로 저장
- 송신 시 데이터를 UART에 쓰고, 수신 시 데이터를 이 레지스터에서 읽는다.
-
상태 레지스터(Status Register, SR)
- UART의 상태를 나타냄
- 주요 플래그:
- TXE(TX Empty): 송신 버퍼가 비어 있음을 나타냄.
- RXNE(RX Not Empty): 수신 버퍼에 데이터가 있음을 나타냄.
- Overrun Error: 데이터가 너무 빨리 들어와 기존 데이터를 덮어씌운 경우.
-
보드레이트 레지스터(Baud Rate Register)
- 데이터 전송 속도를 설정
- 일반적으로 CPU 클럭 주파수와 분주율(Divider)을 기반으로 보드레이트를 계산.
-
제어 레지스터(Control Register, CR)
- UART의 동작을 제어하는 레지스터
- 주요 설정: 데이터 비트 수, 패리티 비트 사용 여부, 정지 비트 수 등
UART 컨트롤러의 역할
- 데이터 프레임 생성 및 파싱
- 송수신 버퍼 관리
- 에러 검출 및 처리
- 클럭 신호를 통한 데이터 동기화
3.2 UART 핀 구성 (TX, RX, GND 등)
UART는 최소한 3개의 핀을 사용하여 통신한다. 간단한 설계로 인해 저비용, 저복잡도로 다양한 임베디드 시스템에 적합하다.
기본 핀 구성
-
TX (Transmit)
- 송신 데이터가 출력되는 핀.
- 한 장치의 TX는 다른 장치의 RX에 연결해야 함.
-
RX (Receive)
- 수신 데이터가 입력되는 핀.
- 데이터 전송 방향에 따라 TX와 교차 연결.
-
GND (Ground)
- 신호 참조를 위한 공통 접지.
- 모든 장치가 동일한 GND를 공유해야 신호의 안정성이 보장됨
추가 핀 (확장 기능)
-
RTS (Ready to Send)
- 송신 준비 상태를 알리는 제어 신호.
- 하드웨어 흐름 제어에 사용.
-
CTS (Clear to Send)
- 수신 준비 상태를 알리는 제어 신호.
- 하드웨어 흐름 제어와 함께 사용.
-
VCC (Power Supply)
- 일부 모듈에서 사용되며, UART 장치에 전원을 공급.
UART 핀 연결 예시
아래는 두 장치 간 UART 연결의 기본 구성
장치 1 핀 | 장치 2 핀 | 설명 |
---|
TX | RX | 데이터 송신 |
RX | TX | 데이터 수신 |
GND | GND | 공통 접지 연결 |
3.3 UART와 TTL, RS-232의 차이
UART는 직렬 통신 프로토콜로 정의되며, 물리적 신호 수준을 정의하지 않는다. 대신, UART는 TTL(Transistor-Transistor Logic) 또는 RS-232와 같은 표준에 따라 동작한다.
TTL (Transistor-Transistor Logic)
- 전압 수준
- Logic High: +3.3V 또는 +5V
- Logic Low: 0V
- 특징
- 저전력 소비 및 간단한 회로 설계
- 신호 감쇠로 인해 통신 거리가 짧음(최대 약 1.5m)
- 사용 환경
RS-232
- 전압 수준
- Logic High: -3V ~ -15V
- Logic Low: +3V ~ +15V
- 특징
- 높은 전압으로 긴 거리 통신 가능(최대 약 15m)
- 더 큰 노이즈 내성을 제공하나, TTL에 비해 회로 설계가 복잡
- 사용 환경
특징 | TTL | RS-232 |
---|
전압 수준 | 0V ~ 5V | ±3V ~ ±15V |
전송 거리 | 약 1.5m | 최대 약 15m |
소비 전력 | 낮음 | 높음 |
호환성 | 현대적 임베디드 시스템 | 구형 장치 및 산업 장비 |
TTL과 RS-232 변환기
현대 장치 간 통신에서는 TTL과 RS-232 간의 신호 변환이 필요할 수 있다. 변환기는 물리적 신호 수준을 조정하여 두 시스템 간 호환성을 제공한다.
예시: USB to UART 모듈
- TTL 신호를 USB 포맷으로 변환하여, 컴퓨터와 마이크로컨트롤러 간의 데이터 교환을 가능하게 함.
- 일반적으로 FT232RL 또는 CH340 칩셋이 사용된다.
4. UART 프로토콜의 활용 사례
4.1 임베디드 시스템에서의 UART
UART는 임베디드 시스템에서 가장 널리 사용되는 통신 프로토콜 중 하나다. 특히 마이크로컨트롤러(MCU)와 센서, 액추에이터 등의 주변 장치 간 데이터 교환에 적합하다. UART의 단순한 설계와 낮은 하드웨어 요구사항 덕분에, 작은 규모의 시스템에서도 쉽게 통합할 수 있다.
예시
- 온도 센서 데이터 전송: 온도 센서에서 측정된 데이터를 UART를 통해 마이크로컨트롤러에 전달
- GPS 모듈 통신: GPS 수신기에서 위치 데이터를 UART로 MCU에 제공하여 실시간 위치 추적
4.2 디버깅과 펌웨어 업로드
UART는 디버깅 도구로도 널리 사용된다. UART를 통해 장치의 내부 상태를 실시간으로 출력하거나, 오류를 모니터링할 수 있다. 또한, 펌웨어 업데이트 시 UART를 활용하면 빠르고 안정적으로 코드를 업로드할 수 있다.
디버깅 활용
- 시리얼 콘솔 출력: 시스템 로그를 UART로 출력하여, 동작 상태와 오류를 모니터링
- 테스트 데이터 전송: 디버깅 도구와 연결해, 명령어를 전송하고 반응을 확인
펌웨어 업로드 예시
- Arduino와 같은 개발 보드에서는 UART 인터페이스를 통해 펌웨어를 업로드
- Bootloader를 활용해 외부 플래시 메모리에 코드를 로드하고 실행
4.3 UART를 활용한 IoT 장치 통신
IoT 장치는 종종 UART를 통해 데이터를 교환하며, 간단한 네트워크 설정과 저전력 통신이 필요한 환경에서 특히 유용하다. UART는 IoT 시스템에서 센서 데이터를 수집하거나, 명령을 전달하는 데 사용된다.
예시
- 스마트 홈 기기: 스마트 조명과 허브 간의 데이터 통신.
- 산업용 IoT: 공정 관리에서 센서 데이터를 UART로 전송하여 중앙 서버로 수집.
- 저전력 통신: UART의 간단한 구성으로 배터리 기반 IoT 장치의 에너지 효율성을 극대화.
UART는 임베디드 시스템, 디버깅, IoT 통신 등 다양한 분야에서 간단하지만 강력한 데이터 교환 솔루션을 제공하며, 소규모 프로젝트부터 대규모 네트워크까지 폭넓게 활용되고 있다.
5. UART 설정과 문제 해결
5.1 보드레이트 불일치와 동기화 문제
문제 설명
UART 통신에서 보드레이트 불일치는 가장 흔한 문제 중 하나다. 송신 장치와 수신 장치가 서로 다른 보드레이트로 설정되면, 데이터가 왜곡되거나 손실될 가능성이 높다. 보드레이트는 9600bps, 115200bps와 같은 공통 값을 사용하는 것이 일반적이다.
해결 방법
-
보드레이트 일치 확인
- 송신 장치와 수신 장치의 보드레이트를 동일하게 설정.
- 일반적으로 UART 디버거나 시리얼 터미널 소프트웨어(예: PuTTY, Tera Term)를 사용해 설정을 검증.
-
분주율(Divider) 설정
- UART 보드레이트는 시스템 클럭과 분주율 설정에 따라 결정된다.
- 예: STM32의 경우 UART 보드레이트는 다음 공식을 통해 계산:
- Baudrate=(16×Divider)Fclk
- Divider 값을 수정하여 정확한 보드레이트를 설정
-
오차 허용 범위 확인
- 허용 오차 범위(일반적으로 ±2%)를 초과하면 동기화 문제가 발생한다.
5.2 노이즈와 신호 간섭 해결 방법
문제 설명
UART는 직렬 통신의 특성상 긴 케이블 사용 시 신호 간섭과 노이즈에 취약하다. 이는 데이터 손실, CRC 오류 등을 유발할 수 있다.
해결 방법
-
케이블 길이 줄이기
- 케이블 길이가 길수록 노이즈 발생 가능성이 증가한다. 1.5m 이하로 유지하는 것이 이상적이다.
-
Shielded Cable 사용
- 외부 전자기 간섭(EMI)을 줄이기 위해 차폐 케이블(Shielded Cable)을 사용.
- Twisted Pair 케이블은 신호 간섭을 최소화하는 데 효과적이다.
-
푸시풀(Push-Pull) 방식 사용
- UART의 신호 전송 방식을 푸시풀로 변경하여 노이즈에 대한 내성을 증가
- TTL 신호가 RS-232로 변환되는 환경에서는 이 방식이 특히 효과적이다.
-
하드웨어 필터 추가
- RC 필터 또는 페라이트 비드(Ferrite Bead) 를 사용해 고주파 노이즈를 제거
- 전원선에는 디커플링 커패시터를 추가해 전원 노이즈를 줄인다.
5.3 소프트웨어 설정과 UART 드라이버
문제 설명
UART 통신에서 소프트웨어 설정 오류는 통신 실패의 주된 원인이다. 보드레이트, 데이터 비트, 패리티 비트, 정지 비트 등이 올바르게 설정되지 않으면 데이터가 왜곡된다.
해결 방법
- 소프트웨어 설정
- 송신 장치와 수신 장치의 UART 설정 매개변수를 일치시킨다.
- 보드레이트: 9600bps, 115200bps 등
- 데이터 비트: 7비트 또는 8비트
- 패리티 비트: 짝수(Even), 홀수(Odd), 없음(None)
- 정지 비트: 1비트 또는 2비트
- 설정 예제 (Python
pySerial
라이브러리 사용):
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1
)
ser.write(b'Hello UART\n')
response = ser.readline()
print(f"Received: {response}")
ser.close()
-
드라이버 설치 및 업데이트
- USB-to-UART 변환기를 사용할 경우, 적절한 드라이버(예: FTDI, CP210x)를 설치
- 오래된 드라이버는 통신 오류를 초래할 수 있으므로 최신 버전으로 유지.
-
버퍼 관리
- 송수신 데이터가 많을 경우, 송신(TX) 및 수신(RX) 버퍼 크기를 적절히 조정
- 오버플로를 방지하기 위해 수신 데이터를 주기적으로 읽어와 버퍼를 비우는 것이 중요.
6. 마무리
오랜만에 low-level의 CS 지식을 배우고 나니 상당히 새롭고 신선한 기분이다. 아직 익숙한 분야도 아니고, 내용도 여전히 어렵지만 가까운 시일 내에 이 지식을 이용해 직접 하드웨어에서 펌웨어를 추출할 것이라 생각하니 조금 설레인다.