본문 바로가기
임베디드 개발/펌웨어

UART 통신에서 2~3%의 Baud rate 오차가 허용되는 이유

by eteo 2026. 8. 26.
반응형

 

 

 

UART는 클럭선을 공유하지 않는 비동기 통신인데도 불구하고 약 ±2~3%의 Baud rate 오차가 존재해도 통신이 가능하다고 말한다. 이게 가능한 이유는? 샘플링 구조 자체가 오차를 흡수하도록 설계되어 있기 때문이다.

 

 

 

1. Start bit로 매 프레임마다 재동기화

UART 한 바이트를 보낼 때마다 맨 앞에 Start Bit가 붙고, 수신기는 Start Bit의 Falling Edge를 감지하는 순간 내부 비트 타이머를 0으로 리셋하고 다시 시작한다.

 

따라서 클럭 오차는 무한대로 쌓이는 것이 아니라, 한 프레임(8N1 설정 기준 10비트) 동안에만 누적되고 사라진다.

 

 

https://microtechtronics.com/theory/communication/uart/

 

 

 

 

2. 오버샘플링과 비트 중앙에서 샘플링

UART 수신기는 정확한 타이밍을 잡기위해 보통 16배 오버샘플링을 사용한다.

 

예를 들어, Baudrate가 115200이면 내부 클럭을 1843200Hz로 구동해 1비트를 16번 샘플링한다. 그리고 비트의 정중앙 값을 기준으로 삼는 방식(Median Sampling)과 다수결 방식(Majority Vote)을 조합해 데이터를 결정한다.

 

 

 

구체적으로 보면 다음과 같다.

 

  1. Start Bit의 Falling Edge를 감지하면 그 때부터 7번째 클럭이 지나갈 때까지 기다린다.
  2. 비트 중앙인 9번째와 그 전/후를 포함해 8, 9, 10번째 샘플링 값을 연속으로 읽어 다수결 판정을 내린다. (ex. 세 번의 샘플 중 Low가 두 번, High가 한 번 나왔으면 해당 비트는 Low로 기록한다.)
  3. Start Bit 중앙을 잡은 후부터는 정확히 16 클럭 주기(1 Bit Time)마다 건너뛰며 다음 비트의 중앙에서 동일하게 Majority Vote로 샘플링을 진행한다.

 

즉, 수신기가 비트의 정중앙(50% 지점)을 조준해서 판정을 내리기 때문에, 오차가 쌓이더라도 샘플링 위치가 비트 경계(0% 또는 100% 지점)를 넘어가지만 않으면 데이터를 올바르게 읽을 수 있는 마진이 확보된다.

 

 

 

 

정리하면...

한 프레임의 시작부터 마지막 Stop Bit를 샘플링할 때까지 누적된 타이밍 오차가 비트 폭의 절반(±50%)을 넘지 않으면 정상적으로 데이터를 판독할 수 있다. 이를 단순화하여 계산하면 Baudrate 허용 오차는 약 5%(50% ÷ 10비트)가 된다. 이는 송신기와 수신기가 함께 만드는 상대 오차이므로 양측이 각각 ±2.5% 이내를 유지해야 한다. 즉, UART 통신에서 "2~3% 오차까지는 허용된다"는 말이 바로 여기서 나온 것이다.

물론 실무에서는 여기에 노이즈, 지터, 오실레이터 편차 등 변수를 고려해 보통 ±2% 이내를 안전한 권장값으로 본다.

 

 

HW 레지스터 설정 시 오차 판단

실제 MCU 레지스터를 설정할 때도 이 허용 오차 기준이 판단의 잣대가 된다.

예를 들어, 16MHz 클럭을 Prescaler /16으로 나누어1MHz 내부 클럭을 만들고, 분주기를 통해 타겟인 9600 Baudrate를 맞추는 상황을 생각해보자. 이때 필요한 분주값은 약 104.167이지만, 소수점을 버리고 정수값인 104를 레지스터에 설정하면 실제 출력되는 Baudrate는 약 9615.38bps로 미세하게 어긋나게 된다. 이때의 오차율을 계산해보면 약 +0.16%((9615.38 - 9600) / 9600 * 100)로, UART 허용 오차 범주인 ±2% 이내에 여유 있게 들어오므로 안정적 통신이 가능한 설정이라고 판단할 수 있다.

 

반응형