発端
仕事でデバッグ用機器を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文字を中心にすることが多く、全ての文字列で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以外にもいくつか規約はあるものの、RS232を尊重しているよう見受けられた)
機器は接続相手に対してシリアル接続を行っているわけで、
パソコンのUSB接続だからといってボーレート値を勝手に変更・同期しない。
マイペースに機器に設定されているボーレート値を使って文字列を飛ばし続けるのみである。
なのでパソコンでUSB接続して見張る場合は、
シリアル通信(RS232)のボーレート一覧を参考に何度か切り替えながら試行すれば、
文字化けしないボーレート値の設定がヒットするだろう。
終わりに
きっとシリアル通信を行っていた方の間では常識だったのだろう。
たまたま私が畑違いのジャンルにハマって、
「シリアルコンソール 文字化け」等といくらググっても答えが出なかったに過ぎないのかもしれない。
私なりの対策としてタイトルが「シリアルコンソールが文字化けしたら、まずはボーレートを確認しよう」という記事を作成したことで、
「シリアルコンソール 文字化け」でQiitaの本記事がヒットするようになった。
後のシリアル通信初心者の助けになれば幸いだ。