シリアルデバイス(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に提供しています。
テストと動作確認
以下のテストケース(シナリオ)では、動作確認が行われています。- Programming pixhawk light controller
- cuツールを利用してRaspberry Pi 2シリアルターミナルへ接続する
- 様々なシリアル設定上でデータを転送する
「3.」では、以下の環境でテストが行われています。
- Hyper-V仮想COMポート
- FTDI USBシリアル変換機
- Prolific USBシリアル変換機
- 通常のCOMポート
シリアルドライバーの中には、既知の不具合があるドライバーがあります。
これらの既知の不具合は、Windows及びWSLどちらからの利用でも発生します。
動作しないケース
現状以下の使い方は動作しません。- TCGETSやTCSETS*を使用せず、レガシーなraw ioctlを使用したシリアルデバイスの設定や問い合わせ
- 上記のアクセス方法に依存したScreenやminicom
Screenやminicomは現在シリアルターミナルとして利用することはできませんが、cuがその代わりとして利用できます。
今後リリースされるInsider buildで上記の問題を解決するため、改良作業が行われていく予定です。