■Linuxにおけるシリアルポートのトラブルシューティング
マニュアルやチュートリアル通りにすんなりいけば問題ないが、ソフトウェアでハードウェアに繋がっているシリアルポートを触っていると、
ちょっとおかしな挙動をしているっぽいなという時などにソフトウェア側とハードウェア側と環境設定のどこで問題が生じているのかわかりにくくなる。
いろいろ試行錯誤した中でこれだけ押さえておけばトラブル時になんとかなるという要点をまとめたので公開しておく。
■シリアルポートの初期設定
デバイスとして認識されているか確認 ここに出てこない場合もある。。
dmesg | grep tty
ボーレート、パリティなどの現在の設定項目を表示して確認する。
この設定がハードウェア側と合っていなければ、当然おかしなことになる。
stty -F /dev/tty.iap -a
設定を変更する(元に戻す必要がある)(lockされていると変更適用できない)
stty -F /dev/tty.iap 19200 cs8 -parenb -cstopb
stty -F /dev/tty.iap 19200
■シリアルポートまわりで問題が起きたら試すこと
送られてきているデータを、直接コンソールで表示してみる
そもそも何が送られてきているのか表示と確認。stty
による設定がうまくいってないとこの時点で文字化けする
cat
は受信(read)専用で使える
cat /dev/tty.iap
while true; do cat /dev/tty.iap; done;
逆に、任意の文字列を送り付けてみる
echo hello > /dev/tty.iap
cat
やecho
をつかったやりとりをいちいち切断せずたくさん試したくなったら、
minicom
, screen
などのシリアルポートに対応したターミナルエミュレーションコマンドで接続する。
minicom
は設定画面で一時的にtty端末、ボーレート、パリティなどを設定して通信できるので便利。
minicom -s -c on
minicom
はctrl+a→q
で切断&終了できる
screen
が入っているマシンは多いと思う。screen
でも、tty端末、ボーレート、パリティを指定して接続できる。
なんかエラーがでたら、rootでの実行を試してみる
screen /dev/tty.iap 19200,cs8
screen
はctrl+a→shift+k
で切断&終了できる
cu
コマンドは入ってないことも多い
cu -l /dev/tty.iap -s 12000
__python__が使える環境なら__pyserial__を使うこともできる。
pure pythonなのでpythonさえ動けば使える。windows環境やjythonだと若干面倒っぽい。
__ruby__が使えて、cがmakeできる環境なら__ruby-serialport__を使うこともできる
スマートフォンのような組み込みLinux端末上でのソフトウェア開発だと、どの方法も厳しかったりする。
最悪sttyとcatでなんとか動作確認はできる。
自分のLinuxマシンに接続して試せるという場合、minicomぐらいは入れておくと色々楽。
■シリアルポートのコーディングで調べること
-
Arduino系でよくあるシリアルポート出力メソッドの挙動を把握しておく
- Serial.print
- ASCIIテキストでデータをシリアルポートへ出力する
- 区切り文字などは特にないため自分で出力する必要がある
- Serial.println
- ASCIIテキストのデータの末尾に__\r\n__を付けてシリアルポートへ出力する
-
screen
,minicon
などでも改行されるのでデバッグしやすい - データを受け取る際も改行区切りで処理すればOK
- 1バイトづつ受け取って、\r=0x0D=__改行文字__と比較すると区切りがわかる
- Serial.write
- バイナリデータの転送
- Serial.print
-
区切り文字などのメタ文字と受取りたい文字が混ざっているとバグの原因になる
■まったく何も送られてきていないとき、明らかに仕様と違った値が送られてくるとき
・ケーブルの接続を確認
・ハードウェアの故障を確認
■さらに他の情報を見てみる
この記事は以下のページの内容をまとめたものです