Linuxで2MbpsなUARTを使ってみたら、ハマりましましたが解決できました。
組み込みARMな環境で2MbpsのUARTを使ってバイナリデータの連続受信をしてみました。
プログラムを何も書かなくて、1.1Mbps程度のストリームデータを処理できることがすばらしいです。
2Mbpsが設定できない
- busyboxのsttyだと2000000が設定できない
- GNU coreutilsのsttyを使うと設定できる。
- コマンド例
# stty -F /dev/ttySC8 2000000
データが受信できない。データが化ける。
- テキストデータなら、想定したデータが受信できるのに、バイナリデータだと受信できなかったり、データが抜けたりした。
- Linuxではttyはcookedと呼ばれる 状態になっており、テキスト転送用の設定になっている。 改行を受信しないと受信バッファからデータが取り出せないことがあります。
- raw モードにしたら解決しました。
- コマンド例
# stty -F /dev/ttySC8 raw
データが化ける
- ジャンパケーブルみたいなので配線をするとデータが化けます。
- ケーブルを短くして、良い感じのケーブルを使いましょう。
動作確認
- バイナリデータの受信を確認する場合はodを使って16進ダンプを表示させると良い。
# od -x /dev/ttySC8
結果
上記の対応をしたら、2MbpsのUARTで安定してバイナリデータを安定して受信できるようになりました。
こんな感じでTSの再生ができました。 (ただし、エラーフリーにはなっていないと思います。エラーフリーが不要な案件だったので。。。)
# cat /dev/ttySC8 | mplayer -
その他
- FDTIのUSB UART(FT232RQなど)は3Mbpsまで対応しています。Windowsでは3Mbpsは動作していました。 (FT232Hは12Mbpsまで対応とあるが、持っていないので試したことはないです。)
- UARTのデータ抜けが無い事をチェックするのは、https://github.com/geertu/fifotest と https://github.com/geertu/sertest でテストするのが良いみたいです。