usb シリアル受信での16msの遅延

FTDIのICを使用した、スイッチサイエンス製のUSB-Serial変換基板を使用していたのですが、pyserialを使ってシリアル通信をしていると、どうも受信時に15ms前後の遅延を感じていました。

回路かプログラムかpyserialの問題か、どれか分からなかったのですが、結論として、FTDIのICのデバイス設定のレイテンシタイマ(latency_timer)の時間のせいだということが分かりました。

レイテンシタイマとは何かというと、
ICが一定データ量(64byte)を受け取るorレイテンシタイマの時間分経過したとき、データをPC側に送る。

という設定になっている、これのことです。デフォルトでは16msに設定されています。
つまり、一定時間での受信データ数は少ないのに、早く受信値が欲しい時でも、最低レイテンシタイマ分は遅れが発生するということです。
このレイテンシタイマは最低1msに設定することができます。

私の環境はUbuntuなので、その設定を示しますと、

現在のレイテンシタイマの値を取得
cat /sys/bus/usb-serial/devices/ttyUSB0/latency_timer

レイテンシタイマの値を1に変更
echo 1 > /sys/bus/usb-serial/devices/ttyUSB0/latency_timer
とします。

もし、「許可がありません」と表示されるなら、書き込み権限がないということなので、 sudo chmod a+w /sys/bus/usb-serial/devices/ttyUSB0/latency_timer

などとしてから書き換えてください。
もちろん、ttyUSB0の部分は環境に合わせて変更してください

注意として、このままだと、USBを抜き差しするたびにデフォルトの値に書き換わるので、ruleなどで設定する必要があります。

それは次の記事

参考ページ

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)