로봇에 외장 기기를 부착할 경우 USB 시리얼포트 디바이스를 많이 사용한다. 요즘 나온 메인보드엔 시리얼포트가 없으니 당여한 이야기인데, USB 통신의 특성상 latency timer 값이 16ms로 기본으로 설정되어 있어, 빠른 응답 특성을 요구할때엔 속도 저하의 이유가 된다.
먼저 현재 설정된 latency_timer 값을 확인해본다.
$ cat /cat/sys/bus/usb-serial/devices/ttyUSB0/latency_timer
16
ttyUSB0는 사용자의 포트 번호에 따라 변경하여 사용하면 된다. 위와 같이 16ms로 설정되어 있는 값을 1ms로 변경해본다.
$ echo 1 | sudo tee /sys/bus/usb-serial/devices/ttyUSB0/latency_timer
문제는 이를 부팅때마다 반복해야 되는데, setserial 명령어를 udev 룰에 추가해서 이를 간단히 해결할 수 있다. 먼저 setserial를 설치한다.
$ sudo apt install setserial
다음으로 /etc/udev/rules.d로 이동해서, 99-ttyUSB.rules 파일을 만들거나, 이미 사용하고 있는 룰에 다음과 같이 추가한다.
KERNEL=="ttyUSB[0-9]*", MODE="666", ATTRS{idVendor}="0403", RUN+="/bin/setserial /dev/%k low_latency"
저장하고, 재부팅한다.
이제 명령어로 확인해보면
$ cat /cat/sys/bus/usb-serial/devices/ttyUSB0/latency_timer
1
$ cat /cat/sys/bus/usb-serial/devices/ttyUSB1/latency_timer
1
$ cat /cat/sys/bus/usb-serial/devices/ttyUSB2/latency_timer
1
모든 USB 시리얼포트의 latency_timer 값이 1ms로 설정되어 있음을 볼 수 있다.