2016-12-02 23 views
2

私は、レガシーアプリケーションのテストを自動化するユーティリティを開発中です。レガシーアプリケーションは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などでペアにすることはできますか?

もしそうなら、どのように問題を解決できますか?

実際のシリアルポートからの出力を偽装する方法はありますか?

+0

なぜリアルポートと仮想ポートをペアにする必要がありますか?あなたは正確に何をしようとしていますか? PCのシリアルポートに送られたすべてのメッセージを盗聴したいのですか? – idanp

+0

@Idank - いいえ、私は実際のポートの代わりに接続されたアプリケーションにメッセージを送信したいと思います。私は仮想ポートにペアリングしてこのポートに書き込むことができると仮定しました(実際のポートで出力されるように)。これは間違っていますか? – camelCase

+0

2つのペアになった仮想ポートcom0comに間違いがありますか?なぜ第2のポートが本当に必要なのですか? – idanp

答えて

0

私はで完全に自動化されたテストシステム稼働を取得するために管理:設定するcom0comを使用し

  • 2つの仮想ポートのペアリング(COM6-COMDとCOMI-COMJ)をサポートします。
  • COMDで何かが読み込まれたときに、一連のバイトをCOMDに書き戻すことで、デバイスをエミュレートする単純なアプリケーションを作成しています。書き戻されたバイトは、テストバイトもCOMJで読み込まれない限り、「何もしない」バイトのデフォルトセットになります。
  • COMIで特定のバイトを送信できる自動テストスクリプトに機能を追加しました。たとえば、£5の音符を表すバイト、またはその音符が無効です。
  • "COM2:" ASCII文字列(ハードコードされたポート)を "COM6:"に置き換えるために、16進エディタで従来の実行ファイルを変更しました。

これで、手動テストに元のレガシーアプリケーションを使用するようにテスト端末を設定できるようになりました。すべてのデバイスが正常に動作します。同じターミナルでは、自動テストスクリプトは変更された実行可能ファイルにリンクされています。この実行ファイルは、エミュレートされたデバイスを使用します。

アプリケーションでCOMポートを構成可能にする作業が完了するまで、「変更された」実行可能ファイルを維持する必要があります。

私は、修正されたexeで「本当の」COMポート名を使用する必要があるということを軽視しました。例えば「COMA」は使えませんでした。それはCOM1からCOM9である必要がありました。

0

代わりcom0comを用いる溶液迅速かつ汚い:

だけ(TxとRxをSWAP)crossover cable( "ヌルモデム")を使用して、別のポート(COMxの)へのPCポート(COM6)のいずれかをプラグ。 2つの異なるアプリケーションで互いに接続された2つのポートを使用できるようになりました.1つのポートで送信された各バイトはもう1つのポートで受信され、その逆も同様です。

そして両方のポートがリアルです。

COMxを使用する別のアプリケーションを使用してデバイスをエミュレートできるようになりました。

+0

したがって、COMxにバイトを送信することは、COM2をリッスンしている元のレガシーアプリケーションによって読み取られますか? – camelCase

+0

OPがアプリケーションのCOMポートを実際のデバイスに接続したままにしたいと表示されます。 – barny

+1

@camelcaseはい。 – idanp

1

物理ポートを7,8,9に変更し、ポート1,2,3をハードコードしたままにしておくと、COM1-COM4、COM2-COM5、COM3-COM6などの3つの仮想COMペアをインストールして、古い "アプリを開くことができますし、その後、別のポートに読み取りバイトを監視することができます。

OLD APP - > COM1 - > COM4 - > YOUR APP - > COM7(プリンタ)

関連する問題