USB 는 정해진 주기로 데이터를 묶어 주고받습니다. 그래서 USB-시리얼 변환기는 선로에서 받은 바이트를 하나씩 바로 PC 로 넘기지 않고, 버퍼가 차거나 일정 시간이 지나면 한꺼번에 넘깁니다. FTDI 칩은 이 시간을 «Latency Timer» 라고 부르며 기본값이 16 ms 입니다.
무엇이 문제인가
- 프레임이 쪼개집니다: 9600 bps 에서 17바이트 요청은 선로에서 약 19 ms 걸립니다. 변환기가 16 ms 마다 넘기면 PC 에는 두 덩어리로 도착하고, 그 사이 틈이 3.5 문자(4 ms)보다 길어 RTU 프레임이 둘로 나뉩니다. 두 조각 모두 CRC 가 틀려 버려집니다.
- 프레임이 합쳐집니다: 반대로 짧은 응답 여러 개가 한 덩어리로 묶여 와서 하나처럼 보일 수 있습니다.
- 응답이 늦습니다: 요청을 보내고 받는 데 최대 몇십 ms 가 더 걸립니다. 타임아웃을 짧게 잡은 마스터는 «응답 없음» 으로 봅니다.
대처법
- FTDI: 장치 관리자 → 포트(COM) → 해당 포트 속성 → 포트 설정 → 고급 → Latency Timer 를 16 에서 1~4 ms 로 낮춥니다. 다른 칩(CH340·CP210x 등)은 드라이버마다 설정이 다릅니다.
- 프레임을 시간 말고 길이로 끊습니다: Modbus 요청은 함수 번호로 길이를 알 수 있습니다(읽기·단일 쓰기 8바이트, 여러 개 쓰기 7 + 바이트 수 + 2). PortDock Modbus Slave 는 이 방식으로 요청을 다시 합치고, USB 포트이면 최소 간격을 20 ms 로 잡습니다.
- 프레임 구분 시간을 넉넉히: 시간으로 끊는 도구라면 USB 변환기에서는 끊김 시간(조용한 간격)을 20 ms 안팎으로 둡니다. PortDock Serial 은 USB 포트에서 이 점을 안내합니다.
- 마스터 타임아웃에 여유를: 장비 응답 시간 + 변환기 지연(왕복 최대 2 × Latency Timer)을 더해 잡습니다.
어떻게 알아보나
통신 기록에서 한 요청이 두 줄로 나뉘어 찍히고 둘 다 «CRC 틀림» 이면 쪼개진 것입니다. 받은 줄의 시각 간격이 거의 16 ms 단위로 끊겨 있으면 Latency Timer 의 영향입니다.
작성 2026-10-17