ioctlシステムコールにTCSETSとtermios構造体変数を渡すと、指定のファイルディスクリプタに端末情報を設定できる。
TCSETSの使いどころというと、やはりシリアル通信だろう・・・。
ということで、シリアル通信を始める。
といっても、昨今デスクトップPCでもなかなかシリアル(COM)ポートが使えるものは少ない・・・。
シリアルケーブルもないし、ましてや現在使っているのは「New Surface Pro」だし・・・。
ということで、VirtualBox上のゲストのFedoraと、ホストのWindows10の間で仮想的にシリアル通信できるかを調べたら、
VirtualBox内のLinuxとホストPC(Windows)間でシリアル通信を行う方法メモ - 『何故ならば・・・、』
こんなのがあったので、
Null-modem emulator (com0com) 日本語情報トップページ - OSDN
ここにあるcom0comという仮想シリアルポートを設定できるツールを使う。
com0com-3.0.0.0-i386-and-x64-signed.zipのzip開けたら、64bit用のSetup_com0com_v3.0.0.0_W7_x64_signed.exeを実行。
あとは、このインストーラでぽちぽちしてインストール。
完了してもデバイスマネージャを見ると失敗してそう。
ドライバ署名の問題かな・・・。
仮想シリアル(COM) ポートドライバ「com0com」によるシリアル通信 - Qiita
Windows10 64bitだとドライバロゴ認証通してないといけないのだが、通してないのか・・・。
テストモードにするか・・・。
Windows10で署名なしドライバをインストールする方法/テストモードにする方法 - ぼくんちのTV 別館
で、
コマンドプロンプトを管理者権限で起動し、
今度はセキュアブートの問題。
Windows 10でBIOS/UEFIセットアップ画面を確実に開く方法:Tech TIPS - @IT
電源押して出すよりは、設定からのほうが楽かな。
設定で、
[回復]の[PCの起動をカスタマイズする]で、[今すぐ再起動]。
起動時に、
詳細オプション。
で再起動。
こっからUEFIで、
Secure Bootが有効に。
None。
Disabledになった。
Restart nowで再起動。
Windowsロゴの上にこんなのが出て。
BitLockerを解決しないといけない。
https://support.microsoft.com/ja-jp/help/4026181/windows-10-find-my-bitlocker-recovery-key
スマホのブラウザから、
http://windows.microsoft.com/recoverykey
ここにアクセスすると、MSアカウントログインを求められるので、手持ちのhotmailアカウントでログインして、
ページに長いキーが書いてあるので、
入力して続行すると、
これが出るので再起動。
さて、Windowsに戻ってきたら、テストモードに。
今度は成功。
起動した段階で治っていた。
そしてCOMポートが既にできていた。
com0comを起動。
COM3とCOM4が繋がっているらしい。
Tera Term (テラターム) プロジェクト日本語トップページ - OSDN
実際にCOM3とCOMで通信できるかをTera Termで確認。
ぽちぽちteraterm-4.103.exeをインストール。
Tera Term起動。
COM3。
もう1個起動してこっちはCOM4。
COM3にフォーカスを合わせているのにCOM4に"ABC"が出る。
逆にCOM4にフォーカス合わせて"XYZ"を入力してもCOM3側に出る。
互いに相手側に出ているので通信出来ていると言える。
次は、VirtualBoxにCOMポート設定する。
Fedoraの設定で、
さきほど出てきたCOM4をFedoraの仮想COM1(IRQ4, 0x3f8)とする。
Fedoraを起動したら、
dmesgでIRQ4がわかる。
ということは、ttyS0が仮想COM1(IRQ4, 0x3f8)である。
screenコマンドで接続。
この状態になる。
Windows側はCOM3で待つ。
Fedora側からXYZ。
Windows側からABX。(ABCと打とうと思ったら間違えた。)
デタッチはCtrl+aの後にdらしい。
ただ何度かやらないと抜けられない・・・。下手なだけかもだが。
デタッチなのにセッションがいない。
macだと残っていた気もするが。
(その場合はセッションプロセスをkillした。)
さて、最後にFedora側にシリアルサーバプログラムを置いて、Windows側の通信を受信する。
TCSETSで、基本的なシリアルの設定を最終セットする。
Fedora側は、ttyS0がrootじゃないと受け付けないのでsudoで起動。
Windows側はCOM3で接続。
Windows側で、aと入力すると、aが受信出来てるのがわかる。
1回に1文字ずつか。
b, c, d, eも1回に1文字ずつ。
bufは256バイト読み込むはずだが。
qが入力されたら終了するようにしてあるので、こうなる。
こんな感じでシリアル通信できる。
今回は仮想ポートだが、ディスプレイポートの付いたマシン(緊急サブ用のLatitude)は無くもないので、いずれそれでの通信も扱いたいが・・・。いやはや大変だった・・・。
Sample/unixsyscall/TCSETS/TCSETS/src/TCSETS at master · bg1bgst333/Sample · GitHub