MacOSX
シリアルコンソール

シリアルコンソールが文字化けしたら、まずはボーレートを確認しよう

発端

仕事でデバッグ用端末のルータとMacをUSBケーブルで繋いで、
シリアルコンソールでログを見張る事になった。
この文字化け(?)に関して3日程ハマったので備忘録として記載する。

# Macのシリアルコンソールはsudo権限が必要なので一旦ログインしておく
$ sudo su

# シリアルコンソールの一覧を確認
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   34,   0  3  2 11:46 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   34,  24  3 22 12:55 /dev/tty.usbserial-AH01KQU5

$ screen /dev/tty.usbserial-AH01KQU5
��kBJNKm�kBC"�Orc&�+��n_��+BCo�߭kBC��o��K�+L����C=RJJJJJJJJJ(BBbCsbCcrG�bCc�������JJJJJJJJJ

例えばUTF-8を使う場合、ASCII文字に限ってはShift-JISやEUC-JPと入れ替えても正常に認識する。
しかし、この機器が吐き出すメッセージは起動直後から明らかに文字化けしている。

流石に第一文字から全ての文字列がASCII文字以外を使っているとは考えにくい。
念の為、様々な文字コードの変換を試してみたが全て無駄だった。

それは当然の話で、今回の文字化けは文字コードが原因ではなかった

解決方法

シリアル通信にはボーレート(BaudRate)という設定が存在する。
辞書サイト等では「一秒あたりに転送するビット数(bps)を単位とした通信速度のこと。」等と記載されており、「数値が高いほうが帯域広くて余裕を持って文字列送信できるんでしょ?」くらいに思ってスルーしていたがとんでもない!

双方のボーレートが一致していなければ、まともに文字列の送受信もできないのだ。
それを証拠に、正しいボーレートを指定しただけで文字化けが解消される。
(今回の機器は少々特殊なケースで、38400を利用していたようだ)

$ screen /dev/tty.usbserial-AH01KQU5 38400
Booting...
init_ram

Tera Term等のツールではボーレートの候補一覧が表示されるが、
Macではscreenやcuを利用することになるので、ボーレートの候補は知っておく必要がある。

ボーレートの候補は下記。

  • 110
  • 300
  • 600
  • 1200
  • 2400
  • 4800
  • 9600
  • 14400
  • 19200
  • 38400
  • 57600
  • 115200
  • 230400
  • 460800
  • 921600

何故この数値が候補になるのか調べたところ、
どうやらシリアル通信の規格であるRS232のボーレートの項目の値が基準となっている。
(RS232以外にもいくつか規約はあるようだったが、下位互換を意識して無下にはしないだろう)

そして機器は接続相手に対してシリアル接続を行っているわけで、
パソコン側がUSBだからといってオリジナルのボーレート値を勝手に使って良いわけではない。
あくまでシリアル通信(RS232)が基準となってボーレートを選択する形となる。

最悪機器が使用するボーレートを知らなくても、
上記のボーレート一覧を元に何度も施行すればいい。

終わりに

きっとシリアル通信を行っていた方の間では常識だったのだろう。
たまたま私が畑違いのジャンルにハマって、
「シリアルコンソール 文字化け」等といくらググっても答えが出なかったに過ぎないのかもしれない。

私なりの対策としてタイトルが「シリアルコンソールが文字化けしたら、まずはボーレートを確認しよう」という記事を作成したことで、
「シリアルコンソール 文字化け」でQiitaの本記事がヒットするようになった。

後のシリアル通信初心者の助けになれば幸いだ。

参考サイト