私は、レガシーアプリケーションのテストを自動化するユーティリティを開発中です。レガシーアプリケーションはWindows 2000上で動作し、シリアル(COM)ポート経由で接続された3つのデバイスを使用します。実際のシリアルポートと仮想シリアルポートのペアを作成する
私はアプリケーションのソースコードにアクセスできますが、何か変更を加える必要はありません。しかし、ソースコードでは、デバイスのCOMポート名が、COM1(プリンタ)、COM2(銀行券リーダー)、COM3(バーコード/ OMRリーダー)のようにアプリケーションにハードコードされていることを確認できました。各デバイスに送信されるバイトと、アプリケーションが返品をどのように処理するかを見ることもできます。
今のところ、私は紙幣リーダーに関するテストを書きたいと思います。ここではさまざまな質問(例:Faking an RS232 Serial Port)からcom0comを使用してシリアルポートを偽装することができます。私は、実際のCOMポートデバイスに代わってバイトを送信する方法があることを期待していましたが、これはアプリケーションによって取得されます。
ユーティリティをインストールした後、私は "COM2"としてペアを "COM6"に設定しました。 、私は[キャンセル押すことができます
ポート名COM2がすでに他のデバイス\デバイスのために使用されている\シリアル1
:COM2ラベルは赤で表示され、私はOKを押したとき、私は以下のようなメッセージが取得します再試行するか、続行してください。
私が手続行押すオン:
COM2がすでにCOMポートデータベース
再び
に "使用中" としてログインしているポート名I続行]を押します。
私は、COM2とCOM6ポートのペアリングをテストするためにC#で小さなアプリケーションを作成しました。有効なバイトをCOM2に送信すると、予想される11バイトが返されます(これは、レガシーアプリケーションのシナリオを正確に反映します)。 COM6では何も受信されません。同じバイトをCOM6に送信すると、COM2またはCOM6のいずれからも応答が得られません。
私は別のCOMポート(COM1からCOM6、COM3からCOM6へ)を試してみましたが、これらの仮想ポート(COM1とCOM3も赤色であり、私はcom0com経由で同じエラー)。次のように
テストC#のアプリがある:私はハイパーターミナルを使用する場合、私は、メッセージが2つの仮想ポート間で送信されているが、何も現実と仮想ポートとの間で送信されていない
using System;
using System.IO.Ports;
public class Com
{
private static byte[] s_pDataSent = new byte[32];
private static byte[] s_pDataRead = new byte[32];
private static void port_OnReceivedDatazz(
object sender,
SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
var buffer = new byte[sp.BytesToRead];
Console.WriteLine("DATA RECEIVED ON " + sp.PortName);
sp.Read(buffer, 0, buffer.Length);
foreach(var b in buffer)
{
Console.Write(b.ToString() + " ");
}
Console.WriteLine();
}
public void Do(string portName, string virtualPort)
{
var port = new SerialPort(
portName,
9600,
Parity.Even,
7,
StopBits.One);
port.RtsEnable = false;
port.DtrEnable = false;
port.DataReceived += port_OnReceivedDatazz;
port.Open();
if (!port.IsOpen)
{
Console.WriteLine("Port is closed");
}
var vport = new SerialPort(
virtualPort,
9600,
Parity.Even,
7,
StopBits.One);
vport.RtsEnable = false;
vport.DtrEnable = false;
vport.DataReceived += port_OnReceivedDatazz;
vport.Open();
if (!vport.IsOpen)
{
Console.WriteLine("VPort is closed");
}
for (var i = 0; i < s_pDataSent.Length; ++i)
{
s_pDataSent[i] = 0;
}
// populate s_pDataSent ...
// I have left these steps out of this example
// ...but they do exist in my test app
port.Write(
s_pDataSent,
0,
8);
Console.ReadLine();
Console.WriteLine("Closing");
port.Close();
}
}
見ることができます。
実際のCOMポートと仮想COMポートをcom0comなどでペアにすることはできますか?
もしそうなら、どのように問題を解決できますか?
実際のシリアルポートからの出力を偽装する方法はありますか?
なぜリアルポートと仮想ポートをペアにする必要がありますか?あなたは正確に何をしようとしていますか? PCのシリアルポートに送られたすべてのメッセージを盗聴したいのですか? – idanp
@Idank - いいえ、私は実際のポートの代わりに接続されたアプリケーションにメッセージを送信したいと思います。私は仮想ポートにペアリングしてこのポートに書き込むことができると仮定しました(実際のポートで出力されるように)。これは間違っていますか? – camelCase
2つのペアになった仮想ポートcom0comに間違いがありますか?なぜ第2のポートが本当に必要なのですか? – idanp