シリアル機器のソフトウェアエミュレータを作るのに便利なツール
更新日時:2017年07月25日
プログラム
/ PC
/ Windows
/ ハードウェア
/ ソフトウェア
ちょっと仕事で関連する業務をしているのでメモ
ちょっとお仕事でシリアル機器用のWindowsアプリを触っているのですが、ハードウェア(特にシリアル機器のような簡単な作りのもの)に付属するアプリ作るときってまずエミュレータ作るのが一般的じゃないっすかね?(あくまで個人的イメージです)
でも、今のお仕事では作られてませんでした。
今後アプリを更新していくのに、ハードがないとろくにテストも出来ないなんてあり得ないと思って、プロトコルもいわゆるシリアル通信では一般的な感じで簡単なものだったのでサクっとエミュレータでも作ろうと思ったんですが、シリアル←→USBの変換ケーブルもう一個用意したり、ドライバとかから自分で作ったりしてもアホなので仮想シリアルポートドライバみたいなのでループバックのテスト出来るような汎用的なものないかな~?と探していましたら
で、ネットで調べてましたらNull-modem emulator(com0com)と言うまさにソレなツールが見つかりました。
このツールは二つの仮想COMポートの入出力の橋渡しをしてくれるツールで、例えばCOM10とCOM11と言う二つの仮想COMポートを橋渡しする設定にすると、COM10から入ってきたデータをCOM11へ渡してくれます。
他のサイトでも導入方法など解説されてますが、もっと簡単に。
まず、最新版だとドライバの署名がなくて導入にいろいろ手がかかるのでちょっと前の署名済み版使うのがいいかと思います。
com0com-2.2.2.0-x64-fre-signed.zip
ってのがそのままインストール出来て楽です。
インストール後、設定用のプロンプトが開けるので開きます(UIの設定ツールもありますが、プロンプトのが早いです)
スタートメニュ→ com0com → Setup Command Prompt
からも開けます。
最初に名前なしの二つのCOMポートドライバ CNCA0 と CNCB0 が出来ているのでこれに名前を付けて
command> change CNCA0 PortName=COM10
command> change CNCB0 PortName=COM11
とかすればループバックテストに使えるCOM10とCOM11の出来上がりです。
これで片方のアプリはCOM10を、もう片方のアプリはCOM11をオープンすると、あたかもシリアルケーブルでで繋がったかのような動作をしてくれます。
厳密にシリアル機器と同じ動作をするかと言うと微妙に違ったりもしますが。
自分の場合は片方のアプリだけを起動し、C#のシリアルポートクラスSerialPortでオープンしてまだ相手方のアプリがオープンしてない状態でWrite()メソッドを使ったらそこでフリーズしたまま帰ってこなくなりました。
(本物のハードに接続してる場合は何も無かったかのようにWriteを抜けてきました)
これはSerialPortオブジェクトにタイムアウト(SerialPort.Writetimeout)を設定すれば回避出来ましたが、気づくのにだいぶかかりました(笑)
この辺はSerialPortのシェイクハンドの設定なんかと絡んでくるんだと思いますが少なくとも同じ動作にはならなかった事例と言うことで。
でもとにかく便利です。
おかげさまであくまで適当ですが簡単なエミュレータ作れてテストデータ作りなどだいぶ楽になりました。
お勧めです。
ちょっとお仕事でシリアル機器用のWindowsアプリを触っているのですが、ハードウェア(特にシリアル機器のような簡単な作りのもの)に付属するアプリ作るときってまずエミュレータ作るのが一般的じゃないっすかね?(あくまで個人的イメージです)
でも、今のお仕事では作られてませんでした。
今後アプリを更新していくのに、ハードがないとろくにテストも出来ないなんてあり得ないと思って、プロトコルもいわゆるシリアル通信では一般的な感じで簡単なものだったのでサクっとエミュレータでも作ろうと思ったんですが、シリアル←→USBの変換ケーブルもう一個用意したり、ドライバとかから自分で作ったりしてもアホなので仮想シリアルポートドライバみたいなのでループバックのテスト出来るような汎用的なものないかな~?と探していましたら
で、ネットで調べてましたらNull-modem emulator(com0com)と言うまさにソレなツールが見つかりました。
このツールは二つの仮想COMポートの入出力の橋渡しをしてくれるツールで、例えばCOM10とCOM11と言う二つの仮想COMポートを橋渡しする設定にすると、COM10から入ってきたデータをCOM11へ渡してくれます。
他のサイトでも導入方法など解説されてますが、もっと簡単に。
まず、最新版だとドライバの署名がなくて導入にいろいろ手がかかるのでちょっと前の署名済み版使うのがいいかと思います。
com0com-2.2.2.0-x64-fre-signed.zip
ってのがそのままインストール出来て楽です。
インストール後、設定用のプロンプトが開けるので開きます(UIの設定ツールもありますが、プロンプトのが早いです)
スタートメニュ→ com0com → Setup Command Prompt
からも開けます。
最初に名前なしの二つのCOMポートドライバ CNCA0 と CNCB0 が出来ているのでこれに名前を付けて
command> change CNCA0 PortName=COM10
command> change CNCB0 PortName=COM11
とかすればループバックテストに使えるCOM10とCOM11の出来上がりです。
これで片方のアプリはCOM10を、もう片方のアプリはCOM11をオープンすると、あたかもシリアルケーブルでで繋がったかのような動作をしてくれます。
厳密にシリアル機器と同じ動作をするかと言うと微妙に違ったりもしますが。
自分の場合は片方のアプリだけを起動し、C#のシリアルポートクラスSerialPortでオープンしてまだ相手方のアプリがオープンしてない状態でWrite()メソッドを使ったらそこでフリーズしたまま帰ってこなくなりました。
(本物のハードに接続してる場合は何も無かったかのようにWriteを抜けてきました)
これはSerialPortオブジェクトにタイムアウト(SerialPort.Writetimeout)を設定すれば回避出来ましたが、気づくのにだいぶかかりました(笑)
この辺はSerialPortのシェイクハンドの設定なんかと絡んでくるんだと思いますが少なくとも同じ動作にはならなかった事例と言うことで。
でもとにかく便利です。
おかげさまであくまで適当ですが簡単なエミュレータ作れてテストデータ作りなどだいぶ楽になりました。
お勧めです。
コメント
新規コメント