シリアルのプロキシ(中継)を試す(仮想 COM ペア 2組)
シリアル通信を試す(スタブ単体)と プロキシ(中継)を実機なしで試す(TCP)を掛け合わせた題材です。テスト対象アプリと実機の間に CommSim を挟み、下流=仮想 COM ペア/上流=別の仮想 COM ペアという2 組の仮想 COM ペアを使って、実機の代わりに CommSim.Sample の②ペインに応答させながら中継の往復を観察します。実機は要りません。
Serial下流 COM10⇄COM11上流 COM20⇄COM21ASCII コマンド実機不要要 仮想 COM ペア 2組
このページでできること
- 仮想 COM ペアを 2組(下流・上流)導入し、シリアル機器を挟んだ中継トポロジを実機なしで用意する。
- CommSim 本体を下流 COM ⇄ 上流 COM のプロキシ(中継)として動かし、往復をそのまま記録する。
- 上流の実機役を CommSim.Sample の②ペインが演じる(プロキシ(中継)を実機なしで試すと同じ構図のシリアル版)。
- ①アプリ役から
*IDN?/MEAS?/RSTを送り、下流→上流→②→上流→下流と往復する様子をログで確認する。
登場人物(役割)とポート構成
実機は要りません。① CommSim.Sample(アプリ役)と② CommSim.Sample(実機役)の間にCommSim 本体=中継・記録が入る三者構成です。TCP の proxy-relay と違い、3 者それぞれが別の COM ポートを開き、2 組の仮想 COM ペアで橋渡しします。
| 役割 | 開くポート | このチュートリアルでは |
|---|---|---|
| ① アプリ役 | COM10 | CommSim.Sample 左ペイン(*IDN?/MEAS?/RST を送信) |
| CommSim 本体(下流) | COM11 | ①と仮想ペア①で繋がる待受口 |
| CommSim 本体(上流) | COM21 | ②へ中継する転送先 |
| ② 実機役 | COM20 | CommSim.Sample 右ペイン(計測器として自動応答) |
用意するもの
| ファイル/ツール | 内容 |
|---|---|
| 仮想 COM ペアドライバ(com0com 等) | 導入手順は シリアル通信 §仮想 COM ペアの導入手順 を参照(SourceForge の公式配布のみ使用・他サイトは使わないこと)。本チュートリアルではペアを 2組作成する。 |
serial-proxy/serial-proxy.commsim | プロキシ(中継)セッションのプロジェクト(下流 Serial COM11・上流 Serial COM21・9600 8-N-1・ルール/オートメーションは空=純素通し中継) |
| CommSim.Sample | ① アプリ役・② 実機役の両方を演じる動作確認用アプリ(CommSim に同梱・追加のインストールは不要) |
serial-proxy.commsim は CommSim.Sample の実行フォルダ内 samples/serial-proxy/ に同梱されています。実機は不要ですが、仮想 COM ペア 2組の導入だけは先に済ませてください。
ステップA:仮想 COM ペアを 2組作る
まだ 1 組も作っていない場合は、まず シリアル通信 §仮想 COM ペア(com0com)の導入手順 に従って com0com をインストールします(SourceForge の公式ページからのみ入手。Windows 11 でコード 52 が出た場合の対処も同ページ参照)。インストールすると既定で 1 組目のペア(CNCA0/CNCB0)が自動作成されます。このチュートリアルではこれを下流用に使い、上流用にもう 1 組を追加します。
1組目(下流):既定ペアを COM10⇄COM11 にリネーム
スタートメニューの「Setup Command Prompt」(com0com 同梱・要管理者)を開き、次を実行します。
change CNCA0 PortName=COM10
change CNCB0 PortName=COM11
2組目(上流):ペアを新規追加して COM20⇄COM21 にする
同じ Setup Command Prompt で、install コマンドを使って2 組目のペアを新規作成し、その場でポート名も指定します。
install PortName=COM20 PortName=COM21
成功すると CNCA1/CNCB1 という 2 組目のペアが COM20/COM21 という名前で作成されます(1 組目の CNCA0/CNCB0 はそのまま残ります)。list コマンドで一覧確認できます。
list
C:\Program Files (x86)\com0com\)から 管理者として実行した通常のコマンドプロンプトで setupc.exe を直接呼び出しても同じ操作ができます。cd "C:\Program Files (x86)\com0com"
setupc.exe install PortName=COM20 PortName=COM21
setupc.exe list
デバイスマネージャーで「com0com - serial port emulators」の下に警告アイコンなしでポートが合計 4 つ(COM10/COM11/COM20/COM21)見えれば準備完了です。ポート番号は空いていればいくつでも構いません。異なる番号を使う場合は、以降の手順で自分の環境の番号に読み替えてください。
ステップB:② 実機役 → CommSim 本体(プロキシ)の順に起動する
TCP のプロキシと同様、起動の順番が大切です。上流の ② が先に待ち受けていないと、CommSim 起動時点で上流未接続となり、後から ② を起動しても自動では再接続されません(本体側でセッションを再起動してください)。
- CommSim.Sample を起動し、上部の「動かすサンプル」で「計測器プロキシ(シリアル・上流あり)」を選ぶ。① ペインが COM10・② ペインが COM20 になり、② の自動応答が ON になる。
- 先に ② 実機役を起動する(② ペインの「起動」=COM20 を開く。上流の実機が先に立っている状態にする)。
- CommSim 本体で
samples/serial-proxy/serial-proxy.commsimを開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。 - セッション「計測器プロキシ(シリアル)下流 COM11 → 上流 COM21」の「接続」タブで、下流 COM ポート=COM11、上流(転送先)プロトコル=Serial・COM ポート=COM21 になっていることを確認する(自分の環境のポート番号が異なる場合はここで選び直す)。
- 「起動」をクリックする。下流 COM11 を開き、同時に上流 COM21 へ接続する。上流未接続の警告バナーが出ないことを確認する(出る場合は ② が未起動)。
serial-proxy.commsim の「接続」タブ。下流=COM11(画面は検証環境の仮想ペアで撮影しており COM4)で開き、「転送先(上流)へ中継する」を ON にして上流=COM21(画面では COM6)へ接続する中継構成。ヘッダが「中継(プロキシ)として動作 — フック 0 件」=純素通し中継であることを示す。ポート番号は既定値(COM11/COM21)と異なってよく、自分の環境に合わせて読み替えてよい。ステップC:① アプリ役から送って中継を観察する
- CommSim.Sample の① ペインで「起動」(接続)をクリックし、COM10 を開く。
- 「デモ送信」を押す。① が
*IDN?→MEAS?→RSTを順に送る。 - CommSim 本体の「ログ」タブで、種別フィルタの「Proxy」だけを ON にする。下流→上流の転送と、上流→下流の中継が時系列に記録されているのが見える。
観察できること
- ▶下流→上流 転送:
*IDN?(① → 本体 → ②)AppToDevice - ◀上流→下流 中継:
CommSim,MODEL-100,SN12345,1.0(② → 本体 → ①)DeviceToApp - ▶下流→上流 転送:
MEAS?(① → 本体 → ②) - ◀上流→下流 中継:
MEAS 23.5 degC(② → 本体 → ①) - ▶下流→上流 転送:
RST(① → 本体 → ②) - ◀上流→下流 中継:
OK(② → 本体 → ①)
*IDN?/MEAS?/RST が「下流→上流 転送」で②へ届き、②の応答が「上流→下流 中継」で①へ返る。純素通しなので CommSim は中身を変えず記録だけしている。MEAS? 等を指定する点以外は同じ手順です)。自分のケースへの当てはめ方
このサンプルの流れを、自分のシリアル機器のプロキシに応用するときの判断の糸口です。
| 問い | はい | いいえ |
|---|---|---|
| 上流の実機(計測器)は手元にあるか? | 上流の COM ポートに実機が繋がっている実際の COM ポート名を指定する(仮想ペア②は不要) | CommSim.Sample(または別の CommSim スタブ)を実機役にする(このサンプルと同じ) |
| テスト対象アプリは特定の COM ポート名を指定して開くか? | 下流の仮想ペアの片方をその名前に合わせる(com0com の Setup Command Prompt で change) | アプリ側の設定でポート名を変えられるならどちらでもよい |
| 記録するだけか、狙い撃ちで偽装もするか? | パケット一致フック(アクション=Send・先勝ちで上流転送を抑止)を足す | 純素通し中継のまま(ルール空)で全往復を記録する |
次に読む
- シリアル通信 — 接続設定・失敗診断の詳細
- 中継とキャプチャ — 中継・キャプチャ・フック・注入列の詳細(設定の正)
- シリアル通信を試す — 上流なし・スタブ単体版
- プロキシ(中継)を実機なしで試す — TCP 版・フック/シナリオ化まで含む深掘り
- ← チュートリアル一覧に戻る