最近、マイコン開発ボード間の接続に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は、ちょっと違っていました。ここでも、教えてくれる良いページ(それも日本語)がありました。
早稲田大のヤジマさんという方のページです。なんと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ですかね。