トホホな疑問(1) 仮想COMポートのお名前 WSL/Cygwin/MSYS

最近、マイコン開発ボード間の接続にUARTを使うようなことを始めております。時間もないので途切れ途切れにソフトを書くしかないのですが、そのマイコン上でなければ書けないようなものならともかく、UART使った文字ベースのプログラムであれば、

パソコンの上である程度作って、デバッグしてから

マイコンに持っていけば簡単じゃん、とか思ってしまうわけです。とは言え、VCでWindowsのAPI使って書く気が起きませぬ(普段Windows上ではお手軽なC#ばかりだから)。WSL(上のUbuntu)か、Cygwinか、MSYS2か、いずれにせよ、gccで書いてマイコンのgccに持ち込むのがよろしかろう、などと考えました。しかし、まてよ、WindowsのCOMxxってその手の環境で使ったことなかった。どんなお名前で呼べば良いの?トホホな疑問です。

※「トホホな疑問」投稿順Indexはこちら

まずは、検証のためにマイコンに働いてもらいましょう。いつものNUCLEO-F072RBボードを取り出し、MbedのWeb環境で数行のプログラムを書きボードに書き込みます。

USB-SerialのUART2で受信した文字をUART1へ、UART1受信はUART2へ

可哀そうに単なる子供の使いです。USB-Serialアダプタが2個あれば単に繋ぐだけで良かったのですが、数が足らないために、一種のブリッジというか、USB-Serial替わりにNUCLEO-F074RBを使ってしまいました。

そして2本のUSBケーブルでパソコンに接続します。COM3がNUCLEO、COM4がUSB-Serialアダプタに割り当てられたようです。とりあえず、Teratermを2つ、立ち上げ、それぞれに接続すれば、右の画面に打ち込んだものが、左の画面へと、繋がっております。そこでおもむろにCOM3側の仮想端末を閉じ、今度は、コマンドプロンプトから動かしてみます。

当然ですが、Windowsのコマンドプロンプトからは COM3 というお名前でファイルを転送することができました。当たり前だな。

さて次に、Windows上でLinuxのバイナリがそのまま動くMSのサブシステムWSL(の中で動いているUbuntu)を使ってみます。Ubuntuだし、ちゃんと/devあるし

/dev/ttyS3

とかで動くでしょ、と思ったらまさかの拒絶に会いました。

-bash: /dev/ttyS3: Permission denied

どういう事でしょう。しかし、WSLは流石にMSの製品なので情報がしっかりしています。MSDNに

Serial Support on the Windows Subsystem for Linux

というページがありました。ぶっちゃけその対処は

$ sudo chmod 666 /dev/ttyS3

でした。言われた通りにしたら動きました。何のことはない。シリアルポートの設定なども通常のLinuxと変わらずできるようです。設定を確認しているところ。

WSLのお名前は予想通りだったのですが、次のCygwinは、ちょっと違っていました。ここでも、教えてくれる良いページ(それも日本語)がありました。

シリアルポートの使い方@windows

早稲田大のヤジマさんという方のページです。なんとCygwinでは、LinuxとWindowsが混じった感じ

/dev/com3

でした。Cygwinのbashからファイルを/dev/com3へcatすれば、ちゃんとCOM4に接続した仮想端末に現れます。しかし、段々、ウインドウが多くなって収拾がつかなくなってきました。何時ものことなので、そのまま次へ行きます。

一番よく使うMSYS2のbashを立ち上げてみます。/dev/ttyS3が存在するので、これに流し込んでみますが、案の定、

Permission denied

でした。しかし、調べてみると ファイルのモードは666になっているし、オーナーもグループも「私のモン」です。なして拒絶?ということで、Stack Overflow様などをほじくっていると、皆さん、

MSYSから、WindowsのAPI(ハンドルとかメンドイやつ)呼び出している

ことに気付きました。どうも、MSYS、なんらかのお事情(一部のライブラリをサポートしていない?)により、メンドイことになっているようです。

ま、残念ですが、WSL上でgccで書けばOKですかね。

トホホな疑問(2) ピンヘッダに泣く に進む