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などで設定する必要があります。
それは次の記事で
参考ページ
- http://projectgus.com/2011/10/notes-on-ftdi-latency-with-arduino/
- http://www.hdl.co.jp/USB/FTDI/lt/index.html
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
- 出版社/メーカー: スイッチサイエンス(Switch Science)
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る