먼저 알아둘 용어
UART(Universal Asynchronous Receiver/Transmitter)·baud·8N1 — UART는 비동기 직렬 통신 장치입니다. 일반적인 이진 UART의 baud 값은 초당 비트(bit) 수와 대응합니다. 8N1은 데이터 8비트, 패리티 없음, 정지 1비트이며 시작 비트까지 한 바이트(byte) 전송에 10비트가 필요합니다.
송신 버퍼(buffer)·백프레셔(backpressure) — 송신 버퍼는 전송을 기다리는 데이터를 임시 저장합니다. 데이터가 빠져나가는 속도보다 생성 속도가 빠르면 공간이 가득 차고, 출력 호출이 기다리거나 데이터를 버리는 처리가 필요합니다.
제어 주기·최악 실행 간격 — 제어 주기는 입력을 읽고 출력을 갱신하는 시간 간격입니다. 평균이 짧아도 가장 긴 간격이 요구를 넘으면 순간적으로 제어가 늦을 수 있습니다.

출력량과 전송량의 균형을 계산합니다
반복해서 온도나 상태를 출력하는 작업도 시간과 버퍼를 사용합니다. 먼저 펌웨어(firmware)에서 출력 호출을 없앤 경우, 낮은 빈도로 출력하는 경우, 원래 출력량인 경우를 비교합니다. 모니터 창을 닫는 것만으로 보드(board)의 출력 호출이 없어지는 것은 아닐 수 있습니다.
버퍼가 있다고 전송 속도가 무한해지지는 않습니다
하드웨어 UART 송신 구현 중에는 버퍼가 가득 차면 빈 공간이 생길 때까지 쓰기 함수가 기다리는 경우가 있습니다. availableForWrite와 같은 기능은 남은 공간을 알려 주고, flush는 전송 완료를 기다릴 수 있습니다. 사용 구현에서 실제 의미를 확인합니다. USB(Universal Serial Bus) 가상 시리얼에서는 설정한 baud가 하드웨어 UART와 똑같이 선로 속도를 결정한다고 가정하지 않습니다.
설명용으로 8N1 UART의 9600 bit/s에서 60바이트를 보내는 선로 시간은 60×10/9600=0.0625초, 즉 62.5 ms입니다. 이를 50 ms마다 반복하면 다음 데이터가 생기기 전에 이전 데이터가 다 나가지 못합니다. 버퍼는 잠시 차이를 흡수할 뿐 지속적인 초과 출력을 해결하지 못합니다. 숫자 변환 결과, 구분 문자, 줄바꿈도 전송 바이트 수에 포함합니다.
출력 방법의 영향을 같은 조건에서 비교합니다
먼저 출력문을 잠시 꺼도 장치의 시험 조건을 재현할 수 있도록 명령과 입력을 고정합니다. 루프(loop)나 중요한 작업의 시작·끝을 별도 핀(pin) 변화 등 적합한 방법으로 표시하고 실행 간격을 확인합니다. 측정을 위해 추가한 코드 자체에도 시간이 든다는 점을 고려합니다.
다음에는 원래 출력, 낮은 빈도의 출력, 출력 제거를 비교합니다. 증상이 출력량에 따라 변하면 전송 대기뿐 아니라 문자열 처리와 인터럽트(interrupt) 부하도 후보가 됩니다. 모니터 창을 닫는 것과 펌웨어의 출력 호출을 없애는 것은 같지 않을 수 있으므로 구분해서 기록합니다.
필요한 정보는 상태가 바뀔 때만 보내거나 일정 간격으로 모아 보냅니다. 긴 메시지(message)는 사용 가능한 송신 공간 안에서 나누고 제어 작업으로 돌아오도록 설계할 수 있습니다. 로그를 버릴 수 있다면 버린 개수도 남깁니다. 반드시 보존해야 하는 로그라면 제어의 마감 시간을 지킬 수 있는 별도 저장·전송 구조가 필요합니다. baud를 올리는 방법은 수신기와 배선의 통신 여유까지 확인해야 합니다.
끝내기 전에 확인할 조건
출력을 줄였을 때 오류가 사라졌다는 사실은 진단 단서입니다. 실제 배포 상태의 출력량, 가장 긴 메시지, 연속 오류 로그가 쏟아지는 상황에서도 제어 주기를 확인합니다. 특히 오류가 나면 로그가 늘고, 그 로그가 다시 지연을 늘리는 반복이 없는지 봅니다. 정상 로그 한 줄만으로 최악 상태를 대표하지 않습니다.
기록에는 출력 주기·최대 바이트 수·통신 방식·baud·버퍼 처리 정책·가장 긴 제어 간격을 넣습니다. 어느 출력 조건에서 얼마의 지연이 생겼는지 수치로 기록하면, 제어 주기를 지키기 위해 출력량을 얼마나 줄여야 하는지 판단할 수 있습니다.