シリアルのプロキシ(中継)を試す(仮想 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 ペアで橋渡しします。

① CommSim.Sampleアプリ役:COM10 で送信
仮想COMペア①com0com(COM10⇄COM11)
CommSim 本体プロキシ:下流COM11/上流COM21
仮想COMペア②com0com(COM20⇄COM21)
② CommSim.Sample実機役:COM20 で応答
② =このチュートリアル専用の「実機の代役」です。本番ではこの位置に実際の計測器(実機の COM ポート、または USB-シリアル変換器経由)が入ります。
CommSim.Sample で「動かすサンプル=計測器プロキシ(シリアル・上流あり)」を選ぶと、① が COM10・② が COM20 に自動で揃い、② の自動応答が ON になります。自分の仮想ペアのポート名が既定と異なる場合は、各ペインの COM ポート欄で選び直してください。
役割開くポートこのチュートリアルでは
① アプリ役COM10CommSim.Sample 左ペイン(*IDN?/MEAS?/RST を送信)
CommSim 本体(下流)COM11①と仮想ペア①で繋がる待受口
CommSim 本体(上流)COM21②へ中継する転送先
② 実機役COM20CommSim.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
「Setup Command Prompt」がスタートメニュー検索に出てこない場合:検索欄に「com0com」と入力してもアプリ側の項目が出ず Web 検索結果しか出ないことがあります。その場合は com0com のインストール先フォルダ(既定 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 起動時点で上流未接続となり、後から ② を起動しても自動では再接続されません(本体側でセッションを再起動してください)。

  1. CommSim.Sample を起動し、上部の「動かすサンプル」で「計測器プロキシ(シリアル・上流あり)」を選ぶ。① ペインが COM10・② ペインが COM20 になり、② の自動応答が ON になる。
  2. 先に ② 実機役を起動する(② ペインの「起動」=COM20 を開く。上流の実機が先に立っている状態にする)。
  3. CommSim 本体で samples/serial-proxy/serial-proxy.commsim を開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。
  4. セッション「計測器プロキシ(シリアル)下流 COM11 → 上流 COM21」の「接続」タブで、下流 COM ポート=COM11、上流(転送先)プロトコル=Serial・COM ポート=COM21 になっていることを確認する(自分の環境のポート番号が異なる場合はここで選び直す)。
  5. 起動」をクリックする。下流 COM11 を開き、同時に上流 COM21 へ接続する。上流未接続の警告バナーが出ないことを確認する(出る場合は ② が未起動)。
CommSim 接続タブ:プロトコル Serial・COM4、転送先(上流)へ中継するが ON で上流プロトコル Serial・COM6。ヘッダに「中継(プロキシ)として動作 — フック 0 件」
serial-proxy.commsim の「接続」タブ。下流=COM11(画面は検証環境の仮想ペアで撮影しており COM4)で開き、「転送先(上流)へ中継する」を ON にして上流=COM21(画面では COM6)へ接続する中継構成。ヘッダが「中継(プロキシ)として動作 — フック 0 件」=純素通し中継であることを示す。ポート番号は既定値(COM11/COM21)と異なってよく、自分の環境に合わせて読み替えてよい。

ステップC:① アプリ役から送って中継を観察する

  1. CommSim.Sample の① ペインで「起動」(接続)をクリックし、COM10 を開く。
  2. デモ送信」を押す。① が *IDN?MEAS?RST を順に送る。
  3. CommSim 本体の「ログ」タブで、種別フィルタの「Proxy」だけを ON にする。下流→上流の転送と、上流→下流の中継が時系列に記録されているのが見える。

観察できること

  • 下流→上流 転送:*IDN?(① → 本体 → ②)AppToDevice
  • 上流→下流 中継:CommSim,MODEL-100,SN12345,1.0(② → 本体 → ①)DeviceToApp
  • 下流→上流 転送:MEAS?(① → 本体 → ②)
  • 上流→下流 中継:MEAS 23.5 degC(② → 本体 → ①)
  • 下流→上流 転送:RST(① → 本体 → ②)
  • 上流→下流 中継:OK(② → 本体 → ①)
CommSim ログペイン:種別 Proxy の行で *IDN?/MEAS?/RST が下流→上流 転送、CommSim,MODEL-100,SN12345,1.0/MEAS 23.5 degC/OK が上流→下流 中継と記録される
CommSim 本体(中継)のログ(種別「Proxy」)。①からの *IDN?/MEAS?/RST「下流→上流 転送」で②へ届き、②の応答が「上流→下流 中継」で①へ返る。純素通しなので CommSim は中身を変えず記録だけしている。
狙った 1 コマンドだけ偽装(フック)したい場合は、プロキシ(中継)を実機なしで試す §ステップB と同じ要領で、CommSim 本体のセッションにパケット一致オートメーション(アクション=Send)を 1 つ追加してください(一致データ形式を UTF-8/Contains にし MEAS? 等を指定する点以外は同じ手順です)。

自分のケースへの当てはめ方

このサンプルの流れを、自分のシリアル機器のプロキシに応用するときの判断の糸口です。

問いはいいいえ
上流の実機(計測器)は手元にあるか?上流の COM ポートに実機が繋がっている実際の COM ポート名を指定する(仮想ペア②は不要)CommSim.Sample(または別の CommSim スタブ)を実機役にする(このサンプルと同じ)
テスト対象アプリは特定の COM ポート名を指定して開くか?下流の仮想ペアの片方をその名前に合わせる(com0com の Setup Command Prompt で changeアプリ側の設定でポート名を変えられるならどちらでもよい
記録するだけか、狙い撃ちで偽装もするか?パケット一致フック(アクション=Send・先勝ちで上流転送を抑止)を足す純素通し中継のまま(ルール空)で全往復を記録する

次に読む