2016-12-02 40 views
2

我就可以自動遺留應用程序的測試實用工作之間的一對。傳統應用程序在Windows 2000上運行,並使用通過串行(COM)端口連接的3個設備。創建一個真實的和虛擬的串口

我有權訪問應用程序的源代碼,但沒有進行任何更改。但是,源代碼允許我驗證設備COM端口名稱作爲COM1(打印機),COM2(鈔票閱讀器)和COM3(條形碼/ OMR閱讀器)硬編碼到應用程序中。我還可以看到發送給每個設備的字節以及應用程序如何處理退貨。

現在,我還想寫關於鈔票閱讀器測試。我從這裏的各種問題中讀到(例如Faking an RS232 Serial Port),我可以使用com0com僞造一個串口。我希望有一種方法可以代表真正的COM端口設備發送字節,該設備將被應用程序接收。

安裝實用程序後我配置的一對爲「COM2」到「COM6」。 COM2的標籤顯示爲紅色,而當我按OK我收到以下消息:

COM2已用於其他設備\ Device \接口Serial1

然後我可以按取消端口名稱,重試或繼續。

在壓制繼續,我得到:

端口名COM2在COM端口數據庫

我再次按繼續已經登錄爲「使用中」。

我在C#寫了一個小的應用程序來測試和COM2端口COM6配對。當我向COM2發送有效字節時,我得到了預期的11個字節(這反映了傳統應用程序中的場景)。 COM6上沒有收到任何信息。當我發送相同的字節到COM6時,我從COM2或COM6都沒有響應。

我試過重新啓動機器,再次設置配對,嘗試不同的COM端口(COM1到COM6,COM3到COM6),但從來沒有在這些虛擬端口上得到響應(COM1和COM3也是紅色的,我通過com0com同樣的錯誤)。

測試C#應用程序如下:

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(); 
    } 
} 

當我使用超級終端,我可以看到2個虛擬端口之間發送消息,但是一個實際和虛擬端口之間正在發送什麼。

是否可以通過com0com或其他方式將實際和虛擬COM端口配對?

如果是這樣,我該如何解決我的問題?

有沒有其他的方法來僞造真實串口的輸出?

+0

爲什麼要配對真實和虛擬端口?你究竟想要做什麼?你想嗅探發送到PC上某個串口的所有消息嗎? – idanp

+0

@Iankank - 不,我想代表實際端口向連接的應用程序發送消息。我假設我可以配對一個虛擬端口,並寫入此端口(以便它在真實端口上變爲輸出)。這是錯的嗎? – camelCase

+0

對我來說看起來沒問題,com0com兩個配對的虛擬端口有什麼問題?爲什麼你需要第二個港口是真實的? – idanp

回答

0

我得到了一個完整的自動化測試系統啓動和運行:

  • 使用com0com設置增加2個虛擬端口配對(COM6-COMD和COMI-COMJ)。
  • 編寫一個簡單的應用程序,通過在COMD上讀取某些內容時將一組字節寫回到COMD來模擬設備。寫回的字節將是默認的「無所事事」字節,除非在COMJ上也讀取了測試字節。
  • 爲我的自動化測試腳本添加了能夠在COMI上發送特定字節的功能。例如,表示正在閱讀的5英寸鈔票的字節或鈔票無效。
  • 使用十六進制編輯器修改舊版可執行文件以將「COM2:」ascii字符串(即硬編碼端口)替換爲「COM6:」。

我現在可以將測試終端設置爲使用原始遺留應用程序進行手動測試。所有設備都能正常工作。在同一個終端上,自動測試腳本鏈接到修改後的可執行文件。該可執行文件將使用仿真設備。

我需要維護一個「修改」的可執行文件,直到完成工作以使COM端口在應用程序中可配置爲止。

一個小問題是,我需要在修改的exe中使用「真實」COM端口名稱。例如,我不能使用「COMA」。它需要是COM1到COM9。

0

快速和骯髒的解決方案,而不是使用com0com:

只需將PC端口(COM6)到另一個端口(的COMx)使用crossover cable( 「零調制解調器」)中的一個(交換Tx和Rx) 。 現在您可以使用兩個端口,它們通過兩個不同的應用程序相互連接,一個端口上發送的每個字節都會在另一個端口上接收,反之亦然。

而且這兩個端口都是真實的。

您現在可以使用另一個使用COMx的應用程序模擬您的設備。

+0

因此,將字節發送到COMx將由正在偵聽COM2的原始傳統應用程序讀取? – camelCase

+0

顯示OP希望將應用程序com端口連接到真實設備。 – barny

+1

@camelcase是的。 – idanp

1

您可以將物理端口更改爲7,8和9,並將端口1 2 3硬編碼,然後您可以安裝3個虛擬COM對,例如COM1-COM4,COM2-COM5,COM3-COM6以使「舊的「應用程序可以打開,您可以監控然後將讀取的字節路由到另一個端口。

舊的應用程序 - > COM1 - > COM4 - >您的應用程序 - > COM7(打印機)