Linux でシリアル通信を行う方法

この記事のまとめ:
  • Linux OS でのシリアル通信の方法をまとめています。
背景

令和の時代になってもネットワーク機器の初期操作にはシリアル通信を使わなければならい機会は意外と多く、Linux OS でのシリアル通信の使い方を忘れがちで、その都度調べてしまうので操作方法等をまとめておきます。

もくじ

  • シリアルポートデバイスのリンボリックリンク
  • シリアル通信デバイスとの通信コマンド
    • cu コマンドの使い方
    • screen コマンドの使い方

シリアル通信デバイスへのスペシャルファイル

Linux システムではシリアル通信デバイスへの I/O は /dev/tty*「TTY」は teletype の略)と名付けられたスペシャルファイルを介して行います。* の部分については OS とデバイスに依存し、一般的にはマザーボード上のシリアルポートに接続されるデバイスは /dev/ttyS* や、USB アダプターには /dev/ttyUSB* などとなります。

複数のシリアルポートにデバイスが接続されているときに、デバイスを見分けるためには、下記のディレクトリー配下にあるファイルは、シリアル通信デバイスのスペシャルファイルへのシンボリックになっているので、シンボリック名を参考にすればわかりやすいかもしれません。

  • /dev/serial/by-id : シリアル通信デバイスのメーカーや種類などが書かれたスペシャルファイルへのシンボリック
  • /dev/serial/by-path : シリアル通信デバイスが接続されているバス番号などが書かれたスペシャルファイルへのシンボリック

例えば、このようなシンボリックが置かれます。

$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13  2月 22 21:43 usb-Dell_Dell_Wireless_5814e_LTE_Mobile_Broadband_Card_359337050266330-if02 -> ../../ttyACM0
 
$ ls -l /dev/serial/by-path/
total 0
lrwxrwxrwx 1 root root 13  2月 22 21:43 pci-0000:00:14.0-usb-0:3:1.2 -> ../../ttyACM0
シリアル通信デバイスとの通信コマンド

シリアル通信デバイスに接続するためには、シリアル通信デバイスのスペシャルファイルの読み書きができないといけませんので、下記のように実行ユーザーに権限をあらかじめ与えておくか、特権ユーザーでアクセスする必要があります。 下記のようにシリアル通信を使うユーザーを dialout グループに所属させることが必要があります

sudo gpasswd -a $USER dialout

上記に対して、あらしくんさんからコメントをいただきましたので修正しました。ありがとうございます!!

また、シリアル通信デバイスとの接続時には必ずボーレートが必要になります。設定すべきボーレートはシリアル通信デバイスに依存しますので、デバイスのマニュアルをご覧ください。なお、標準のボー レートは、110、300、600、1200、2400、4800、9600、14400、19200、38400、57600、115200、128000、256000 ビット/秒です。

cu コマンド

基本的には下記のように -s-l のオプションさえ使えばほとんどのシリアル通信デバイスに接続できると思います。

$ cu -s <baud_rate> -l /dev/tty*

シリアルコンソールの終了に関しては少し癖があります。 シリアルコンソールからローカルコンソールへの切り替えは ~! を入力します(cu コマンドによるシリアルコンソールは接続し続けている状態です)。

シリアルコンソールに元に戻る場合は、ローカルコンソールから Ctrl+d を押すとシリアルコンソールに戻ります。

そのままシリアルコンソールを終了する場合は、kill コマンドを使えばよいです。あるいは、シリアルコンソールから ~. を入力すると cu は終了します。

ただし、もし、シリアル通信デバイスが接続されているマシンのローカルコンソールへのアクセスが SSH 等でリモートログインしている場合は、cu の終了とともにリモートログインのセッションも切断してしまう仕様になっていそうです。これを回避するためには SSH 接続時に ssh -e none <host_name> のオプションを付けて接続する必要があります

コマンド詳細:

screen コマンド

screen コマンドはシリアル通信専用のコマンドではなく、CUI 環境でコンソールを複数立ち上げたり、ウィンドウを分割したりして、コンソールを便利に使うツールです。ローカルコンソールとして使うだけでなく、リモートコントロールとして使うこともでき、その対象をシリアル通信デバイスにすることで、シリアル通信デバイスとの通信に使えます。

基本的には下記のように入力すれば、シリアル通信デバイスと接続できます。

screen /dev/tty* <baud_rate>

シリアルコンソールからログアウトする際は Ctrl+a -> k を押す

コマンド詳細:

蛇足

この記事を書くにあたって、簡単にシリアル通信について前知識を入れようと思ったら、調べていくうちに想像以上にシリアル通信の単語には紛らわしいものが沢山ありましたので要約してちょっとだけ載せておきます(間違っていたらごめんなさい)。

RS-232C は正確には、後に改定され EIA-232-D となり、現在では運営組織が変わり、 TIA-232-F となっていますRS-232C では D-Sub 25 ピンと 26 ピンのピン配置しかしておらずD-Sub 9 ピンのものは EIA/TIA-574RJ45 のものは EIA/TIA-561 が正式な規格です。ただし、(日本においては?)これらをすべて含めて広義な意味で RS-232C と呼ばれることがあります。

また、シリアルポートを通じて接続されるシリアル通信デバイスは、CPU もしくは PCH には UART というデバイスを通じて接続されます。そのため、OS からは RS-232C デバイスとしてではなく、UART に接続されているデバイスとして見えます。その通信規格も異なるため、マザーボード上に RS-232C のシリアルポートがあったとしても、内部的で RS-232C と UART の変換を行っています。


今回は以上です。 最後まで読んでいただき、ありがとうございます。

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法