kledgeb Ubuntuの使い方や日本語化、アプリの使い方を紹介しています。

シリアルデバイス(COMポート)にアクセス可能に

Build 16176」にて「WSL」がシリアルデバイスのサポートを行い、「Ubuntu」からシリアルデバイスにアクセスできるようになりました。



WindowsのCOMポート

Windowsでは、各COMポートごとに「COM1」から「COM256」までポート名が割り当てられます。

Linuxのシリアルデバイスの扱い

一方Linuxでは、 シリアルデバイスは任意の名称を持つことができますが、通常シリアルデバイスは、メジャー番号4かつ64から256のマイナー番号の組み合わせを持つキャラクターデバイスであり、「/dev/ttyS0」から「/dev/ttyS191」のデバイスファイルで表現されます。
(256 - 64 = 192)


mknodがマッピングを行う

デフォルトでは、「init」が「mknod」システムコールを呼び、このマッピングを行っています。
また必要に応じて実行時に「mknod」によるマッピングを作成することもできます。


WSLでの扱いとマッピング

WSLでは、「lxcore」ドライバーがWindowsの「COM<N>」を「/dev/ttyS<N>」に結びつけることで、COMポートをLinuxのデバイスファイルへとマッピングしています。
(<N>はCOMポート番号やデバイスファイルの番号)

Ubuntuから見ると「/dev/ttyS1」はマイナー番号65であり、これは「COM1」に結び付けられます。
同様に「/dev/ttyS2」はマイナー番号66であり、これは「COM2」に結び付けられます。

ptyやttyそしてttySは、ターミナルライブラリーのコードを共有するため、ttySはptyや ttyと似たような振る舞いを行いますが、ttySは以下のtermios設定をサポートしており、この設定からWindowsのシリアルドライバーのioctlへとマッピングを行います。

設定項目 設定内容
標準のボーレート B*(*はボーレート値)
ストップビット CSTOPB
文字サイズ CSIZE
パリティーチェック PARENB
PARODD
CMSPAR
INPCK
ソフトウェアフロー制御 IXON
IXOFF
ハードウェアフロー制御 CRTSCTS
CLOCAL
制御文字 VSTART
VSTOP
VEOF

上記の仕組みを通じ、WSLはWindowsのCOMポートをシリアルデバイスとしてUbuntuに提供しています。



テストと動作確認

以下のテストケース(シナリオ)では、動作確認が行われています。

  1. Programming pixhawk light controller
  2. cuツールを利用してRaspberry Pi 2シリアルターミナルへ接続する
  3. 様々なシリアル設定上でデータを転送する

「3.」では、以下の環境でテストが行われています。

  1. Hyper-V仮想COMポート
  2. FTDI USBシリアル変換機
  3. Prolific USBシリアル変換機 
  4. 通常のCOMポート

シリアルドライバーの中には、既知の不具合があるドライバーがあります。
これらの既知の不具合は、Windows及びWSLどちらからの利用でも発生します。

動作しないケース

現状以下の使い方は動作しません。

  1. TCGETSやTCSETS*を使用せず、レガシーなraw ioctlを使用したシリアルデバイスの設定や問い合わせ
  2. 上記のアクセス方法に依存したScreenやminicom

Screenやminicomは現在シリアルターミナルとして利用することはできませんが、cuがその代わりとして利用できます。

今後リリースされるInsider buildで上記の問題を解決するため、改良作業が行われていく予定です。


関連記事一覧
オプション