com0com は Windows 用の仮想 COM ポートペアドライバです。
一方のポートに書き込んだデータがもう一方から読み出せる「ヌルモデム」をソフトウェアで実現します。
SourceForge のプロジェクトページからインストーラをダウンロードしてください。
「com0com - Signed」(署名済み版)を選ぶと、Windows のテスト署名モードを有効にする必要がなく、そのままインストールできます。
スタートメニュー → com0com → Setup を起動します。
インストール直後は CNCA0 ↔ CNCB0 というペアが1つ作られています。
両ポートの 「use Ports class」 にチェックを入れます。
これにより Windows が自動で COM 番号を割り当て、Arduino IDE シリアルモニタ/シリアルプロッタ・TeraTerm・Python・C# など一般アプリが「普通の COM
ポート」として認識できるようになります。
このページ下部の 「スケッチソース」 からスケッチをダウンロードし、Arduino IDE で UIAPduino に書き込みます。
HID受信モード に合わせてスケッチを選んでください。
Chrome または Edge で開いたこのページで、次の順に操作します。
TeraTerm・Arduino IDE シリアルモニタ・Python・C# など、シリアル通信ができるアプリで COM9(ペアの反対側)を開きます。
◆ Protocol モード(HidMonitorTest スケッチ)の場合
UIAPduino が起動し、ブラウザが HID 接続すると自動的にタイトルヘッダとカウンタが送られてきます。
COMモニタ側(COM9)には、UIAPduino が hid.Println() で送った文字列がそのまま表示されます。
Arduino IDE のシリアルモニタを使えば、UIAPduino のデバッグ出力を確認できます。
◆ Raw Binary モード(HidBridgeTest スケッチ)の場合
COMモニタアプリから COM9 にデータを送信すると、UIAPduino を経由してそのままエコーバックされます。
HID 通信の疎通確認や低レベルデバッグに使います。
com0com でペアを作成し、ブリッジ側(例: COM8)をここで選択。外部アプリは反対側(例: COM9)を開いてください。
HID通信 → WebCom通信: HID受信モードで選択。Raw Binary は全バイト転送(HidBridgeTest 向け)。Protocol は 0x50/0x52 をデコードして転送(hid.Print / hid.Write 系スケッチ向け)。
WebCom通信 → HID通信: 常に Raw。受信バイトを 32 バイト Feature Report に詰めて送信(30ms タイムアウト付き)。
Monitor OFF にするとデータ表示を止め、ブリッジ処理に専念します。SYSTEM / ERROR ログは常時表示。
32 bytes 未満はゼロパディング。32 bytes 超過はエラー。
入力バイト列をそのまま WebCom通信へ送信。
書き込み手順: HidBridgeTest.ino / Hid.h / Hid.cpp を同じフォルダに置いて Arduino IDE で書き込む /
ボード: HID ProMicro CH32V003, Tools → USB: Keyboard+Mouse+WebHID
起動時に hid.Ready()(0x53)で準備完了を通知。受信した Feature Report を hid.Send() で Raw エコーバック。
ブリッジを Raw Binary モードで使用してください。COMモニタ(TeraTerm 等)から送ったデータがそのまま返ってきます。
| 用語 | 区間 | 技術 |
|---|---|---|
HID通信 |
UIAPduino ↔ ブラウザ | USB HID(WebHID API) |
WebCom通信 |
ブラウザ ↔ 仮想COMポート | Web Serial API |
VirtualCOM通信 |
仮想COMペア内部(COM8 ↔ COM9) | com0com |
COMモニタ通信 |
仮想COMポート ↔ モニタアプリ | シリアル通信 |
| 方向 | 種別 | サイズ |
|---|---|---|
| UIAPduino → ブラウザ | Input Report | 8 bytes |
| ブラウザ → UIAPduino | Feature Report | 最大 32 bytes |
| マーカー | 名称 | 方向 |
|---|---|---|
0x50 | UIAPduino → ブラウザ | |
0x51 | GetPos | 双方向 |
0x52 | Write | UIAPduino → ブラウザ |
0x53 | Ready | UIAPduino → ブラウザ |
0x01 | 接続通知 | ブラウザ → UIAPduino |
0x50)byte[0] = 0x50 byte[1] = flags 0x80=MORE(続きあり) 0x04=CLEAR(画面クリア) byte[2..7] = テキスト(最大 6 文字、0x00 埋め) ※ 改行は 0x0A をテキストに含めて送信 ※ 6 文字超は複数パケットに分割し MORE フラグで継続を示す
0x51)【リクエスト】UIAPduino → ブラウザ byte[0]=0x51 byte[1]=0x01 byte[2..7]=0x00 【レスポンス】ブラウザ → UIAPduino(Feature Report) byte[0]=0x51 byte[1]=0x01 byte[2..3]=X座標(Little Endian, int16_t) byte[4..5]=Y座標(Little Endian, int16_t)
0x52)byte[0] = 0x52 byte[1] = flags 0x80=MORE(続きあり) byte[2] = ペイロード長(0〜5) byte[3..7] = バイナリペイロード
0x53)byte[0] = 0x53 byte[1..7] = 0x00 ※ 任意使用。ブラウザはログ表示のみ。WebCom通信には転送しない
0x01)byte[0] = 0x01 byte[1..] = 0x00 ※ HID接続時にブラウザが送信。UIAPduino の WaitAvailable() が検出する
| パケット | Protocol モード(デフォルト) | Raw Binary モード |
|---|---|---|
0x50 | テキストを収集し WebCom通信へ転送 | 全バイトをそのまま転送 |
0x52 | byte[2] のサイズ分を WebCom通信へ転送 | |
0x53 | ログのみ。転送しない | |
| その他 | 無視 |
| 32 bytes 以上 | 即 Feature Report 送信 |
| 32 bytes 未満 | 30ms タイムアウト後ゼロパディングして送信 |
| メソッド | プロトコル | 説明 |
|---|---|---|
Print(const char* s) | 0x50 | テキスト送信(改行なし) |
Print(int v) | 0x50 | 整数送信(改行なし) |
Println(const char* s = "") | 0x50 | テキスト送信 + 改行(0x0A) |
Println(int v) | 0x50 | 整数送信 + 改行(0x0A) |
Clear() | 0x50 CLEAR | 画面クリア |
Write(const uint8_t* buf, uint8_t len) | 0x52 | バイナリ送信 |
Send(const uint8_t* buf, uint8_t len) | Raw | マーカーなし Raw 送信 |
Ready() | 0x53 | 準備完了通知(任意) |
Recv(uint8_t* buf, uint8_t maxLen) | — | Feature Report 受信。戻り値: 受信バイト数 |
WaitAvailable(uint32_t timeoutMs = 0) | — | Feature Report 到着まで待つ。データを消費しない。0 = 無限待ち |
GetPos(int16_t& x, int16_t& y) | 0x51 | カーソル座標取得。500ms タイムアウト |