More than 1 year has passed since last update.

■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

catechoをつかったやりとりをいちいち切断せずたくさん試したくなったら、
minicom, screenなどのシリアルポートに対応したターミナルエミュレーションコマンドで接続する。

minicomは設定画面で一時的にtty端末、ボーレート、パリティなどを設定して通信できるので便利。

minicom -s -c on

minicomctrl+a→qで切断&終了できる


screenが入っているマシンは多いと思う。screenでも、tty端末、ボーレート、パリティを指定して接続できる。
なんかエラーがでたら、rootでの実行を試してみる

screen /dev/tty.iap 19200,cs8

screenctrl+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
      • バイナリデータの転送
    • 区切り文字などのメタ文字と受取りたい文字が混ざっているとバグの原因になる

■まったく何も送られてきていないとき、明らかに仕様と違った値が送られてくるとき

・ケーブルの接続を確認

・ハードウェアの故障を確認

■さらに他の情報を見てみる

この記事は以下のページの内容をまとめたものです

http://b.hatena.ne.jp/yuiseki/serialport