UART는 선 하나로 바이트를 한 비트씩 보냅니다. 송신기와 수신기는 클럭 선을 공유하지 않는 대신, 미리 약속한 속도(보레이트)와 프레임 형식에 맞춰 각자 시간을 잽니다.
한 글자가 UART 프레임으로 바뀌어 전송되는 파형을 보여 주는 시뮬레이터
1. 보낼 글자와 통신 설정을 정하세요
2. 전송을 재생하세요
글자 대신 0x41처럼 16진수를 넣어도 됩니다. [전송 재생]을 누르면 송신기가 비트를 하나씩 내보내고, 수신기가 각 비트의 한가운데에서 값을 읽습니다.
프레임은 시작 비트로 열고 정지 비트로 닫습니다
아무것도 보내지 않을 때 선은 high에 머뭅니다. 송신기가 선을 low로 떨어뜨리면 이것이 시작 비트이고, 수신기는 이 순간부터 자기 클럭으로 시간을 재기 시작합니다. 이어서 데이터 8비트가 가장 낮은 비트(D0)부터 나가고, 마지막에 송신기가 선을 다시 high로 올리는 정지 비트로 프레임을 닫습니다.
패리티 비트는 1의 개수를 짝수 또는 홀수로 맞추는 비트입니다. 수신기는 1의 개수를 세어서 비트 하나가 뒤집힌 오류를 알아챌 수 있습니다.
보레이트가 맞아야 하는 이유
수신기는 시작 비트를 기준으로 "1.5비트 뒤, 2.5비트 뒤…"처럼 각 비트의 가운데를 계산해서 읽습니다. 양쪽 클럭이 조금씩 다르면 비트를 읽는 지점이 점점 밀립니다. 정지 비트에 이를 때까지 밀린 거리가 반 비트를 넘으면 잘못 읽으므로, 이론상 양쪽 오차의 합이 약 5%를 넘으면 안 되고 실무에서는 2% 이내로 맞춥니다.
RS-485는 같은 UART 프레임을 차동 신호로 멀리 보내는 물리 계층입니다. Modbus RTU는 한 글자를 11비트로 정해 두어서, 기본은 짝수 패리티와 정지 비트 1개(8E1)이고 패리티를 쓰지 않으면 정지 비트를 2개(8N2) 씁니다.