도구스개발

UART 보율 오차 계산기

클럭과 목표 보율에서 분주비와 실제 보율, 오차를 계산합니다. 오차가 프레임 끝에서 얼마나 누적되는지와 흔한 클럭·보율 조합 가운데 어떤 것이 통신이 안 되는지를 표로 보여 줍니다.

MHz
bps

보율 오차

-3.549%

실제 보율 111,111bps입니다. 이론 한계 5.26%는 안 넘었지만 실무 예산 ±2%는 넘었습니다 — 상대편 오차까지 겹치면 위험합니다.

이상 분주비8.6806
실제 분주비9 (단위 1)
실제 보율111,111.1 bps
프레임 길이10비트
정지비트에서 밀리는 양비트폭의 33.7%
이론 한계 0.5/(9+0.5)±5.263%
한계 대비 쓴 여유67.4%

분주비를 한 칸씩 옮기면

분주비실제 보율오차
7142,857+24.008%
8125,000+8.507%
9111,111-3.549%
10100,000-13.194%
1190,909-21.086%

분주비는 정수(또는 소수부 단위)로만 고를 수 있어 이상값에 가장 가까운 것을 씁니다. 그 반올림 몫이 그대로 보율 오차가 됩니다.

흔한 클럭 × 보율 오차 (%)

클럭9.6k19.2k38.4k57.6k115.2k230.4k460.8k921.6k
8 MHz0.20.20.2-3.58.58.58.5-45.7
11.0592 MHz000000-25-25
12 MHz0.20.2-2.30.2-78.5-18.6-18.6
16 MHz0.20.20.22.1-3.58.58.58.5
20 MHz0.20.2-1.4-1.4-1.48.5-9.635.6
24 MHz0.20.20.20.20.2-78.5-18.6
48 MHz-0.20.20.20.20.20.2-78.5
72 MHz-0.10.20.20.20.2-2.3-2.3-2.3

지금 고른 오버샘플링 16배·프레임 10비트 기준입니다. 붉은 값은 이론 한계를 넘어 통신이 안 되는 조합입니다. 11.0592MHz 줄이 230400까지 전부 0인 것이 이 크리스털이 아직도 팔리는 이유입니다.

115,200bps를 오차 0으로 내는 클럭

1.8432 MHz · 3.6864 MHz · 5.5296 MHz · 7.3728 MHz · 9.216 MHz · 11.0592 MHz · 12.9024 MHz · 14.7456 MHz

오버샘플 16배에 정수 분주를 쓰면 클럭이 16×115,200 = 1.8432 MHz의 정수배일 때만 오차가 0입니다. 11.0592MHz가 이 목록에 있는 것은 우연이 아니라 그러라고 만든 값입니다.

오차는 프레임 끝에서 터집니다. 수신기는 시작비트 가장자리에 한 번 동기를 맞춘 뒤 자기 클럭만 믿고 비트 한가운데를 찍어 나갑니다. k번째 비트를 찍는 시각이 (k + 0.5)비트시간 뒤라 오차가 그만큼 곱해지고, 마지막 비트에서 비트폭의 절반을 넘게 밀리면 프레임이 깨집니다. 그래서 한계가 0.5/(N + 0.5)이며 8N1이면 ±5.26%입니다. 데이터 비트나 패리티를 늘리면 한계가 더 좁아집니다 — 잘 되던 통신이 프레임을 늘리는 순간 깨지는 것이 이 때문입니다.
이 계산은 한쪽 오차만 봅니다. 실제로는 보내는 쪽과 받는 쪽의 오차가 겹치고, 거기에 크리스털의 온도·초기 편차(수십 ppm)와 내장 RC 발진기의 오차(교정해도 ±1~2%, 교정 안 하면 훨씬 큼)가 더해집니다. 이론 한계에 여유를 두고 한쪽당 ±2%로 잡는 관행이 여기서 나옵니다. 내장 RC로 115200을 쓰다 온도가 바뀌면 끊기는 일이 흔합니다.

사용 방법

  1. 1주변장치 클럭과 목표 보율을 넣습니다.
  2. 2오버샘플링 배수를 고릅니다. 보통 16배이고 고속에서 8배를 씁니다.
  3. 3MCU가 분주비 소수부를 지원하면 그 단위를 고릅니다.
  4. 4프레임 구성(데이터 비트·패리티·정지비트)을 맞춥니다.
  5. 5오차와 정지비트에서 밀리는 양을 확인하고, 표에서 안전한 조합을 고릅니다.

자주 묻는 질문

분주비 = round(클럭 ÷ (오버샘플링 × 목표 보율))로 정수를 구한 뒤, 실제 보율 = 클럭 ÷ (오버샘플링 × 분주비)를 계산해 목표와 비교합니다. 보율은 클럭을 정수로 나눠 만들기 때문에 목표와 딱 맞아떨어지는 일이 오히려 드뭅니다.

8N1이면 이론상 ±5.26%까지입니다. 수신기가 시작비트에 동기를 맞춘 뒤 k번째 비트를 (k + 0.5)비트시간 뒤에 찍으므로, 마지막 비트에서도 비트 안에 머물려면 오차가 0.5/(9 + 0.5)보다 작아야 하기 때문입니다. 다만 이건 양쪽 오차를 합친 값이라 실무에서는 한쪽당 ±2% 안쪽으로 잡습니다.

오차가 비트마다 누적되기 때문입니다. 시작비트에서 한 번 맞춘 뒤로는 자기 클럭만 믿고 세어 나가므로 뒤로 갈수록 샘플 시각이 밀립니다. 데이터 비트를 9개로 늘리고 패리티와 정지비트 2개를 붙이면 한계가 5.26%에서 4%로 좁아집니다.

보율 오차를 0으로 만들려고 씁니다. 11059200을 16으로 나누면 691200이고, 이 값이 9600·72이자 115200·6이라 흔한 보율로 정확히 나누어떨어집니다. 반대로 8MHz나 16MHz 같은 깔끔한 값이 115200에서는 크게 어긋납니다.

16MHz를 16배 오버샘플링으로 나누면 이상 분주비가 8.68이라 9로 반올림되어 실제 보율이 111111bps, 오차가 −3.5%가 됩니다. U2X로 8배 오버샘플링을 켜면 분주비 17에 +2.1%로 줄어듭니다. ATmega328P 데이터시트의 보율 표에 그대로 실려 있는 값입니다.

분주비가 작아져 반올림 한 단계의 몫이 커지기 때문입니다. 분주비가 2 아래로 내려가면 한 칸 차이가 25%를 넘길 수 있습니다. 그때는 오버샘플링을 8배로 낮추거나 클럭을 올려야 합니다.

분주 단위가 1/2의 거듭제곱으로 잘게 나뉘어 오차가 그만큼 줄어듭니다. 1/16 단위면 대개 0.5% 아래로, 1/256 단위면 0.05% 아래로 내려갑니다. STM32의 USART가 1/16 단위를 씁니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 한쪽의 오차만 계산합니다. 실제로는 보내는 쪽과 받는 쪽의 오차가 겹치므로 한쪽당 예산을 절반으로 잡아야 합니다.
  • 클럭 자체가 정확하다고 봅니다. 크리스털의 온도·초기 편차(수십 ppm)와 내장 RC 발진기의 오차는 따로 더해야 합니다.
  • 수신기가 비트 한가운데를 정확히 찍는다고 봅니다. 실제로는 시작 가장자리 검출에 오버샘플링 한 칸만큼의 불확실성이 더 있습니다.
  • 분주비의 최댓값(레지스터 폭)은 확인하지 않습니다. MCU 데이터시트의 범위를 함께 보셔야 합니다.
  • ATmega328P 데이터시트의 보율 표를 정답지로 삼아 검증했습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.