2009-06-29 170 views
9

我試圖測試從設備連接到我的電腦和船上時創建的USB端口(設備連接時爲COM25)讀取的代碼。當不在船上時,我無法給USB設備供電,所以測試很困難。有人可以讓我知道如何模擬COM端口並向其寫入數據,以便我的測試程序能夠連接到該模擬COM端口並讀取該數據?如何模擬COM端口,向其寫入數據並從中讀取數據?

我正在從Java程序中讀取它,但仿真不需要使用Java或任何特定語言。只是一個程序,將模擬COM端口,並允許我連接到它。我從AGG軟件下載了一個COM端口仿真器,它似乎寫入了我認爲是COM25的內容,但我無法通過Java測試連接到它。

回答

5

這種問題的一般答案是在實現接口的類中封裝與COM端口通信的代碼。如果你將它作爲Facade(模式)來使用,那麼你也可以從你的結尾使你稱之爲合理的COM方法變得明智。

接口然後可以被模擬或僞造以進行測試。 (關於測試對象有一篇很棒的文章,但我還沒有找到它。)這裏的一個優點是您可以創建一個假的版本來拋出異常,或者做其他事情來做端口可以做的事情,但是在實踐中很難做到這一點。

2

我在哪裏工作,我們解決了類似的問題,讓我們的模擬器根本不欺騙COM端口。這裏是你如何能做到這一點:

  • 定義的接口,可與您的COM口說話,像IUsbCommService
  • 實現你真正的COM-各項通訊服務,使用標準的Java通信API
  • 爲了您的仿真器,只需簡單地踢出一個線程,該線程可以定期從您的USB設備中獲得相同類型的數據。
  • 使用您選擇的IOC框架(例如Spring)來連接仿真器或真實服務。
  • 只要你適當地隱藏你的實現邏輯,並且只要你編碼到你的接口,你的服務使用者代碼就不會在乎它是在與真實的USB設備還是在與仿真器交談。

例如:

import yourpackage.InaccessibleDeviceException; 
import yourpackage.NoDataAvailableException; 

public interface IUsbProviderService { 

    public void initDevice() throws InaccessibleDeviceException; 

    public UsbData getUsbData() 
     throws InaccessibleDeviceException, NoDataAvailableException; 
} 

// The real service 
import javax.comm.SerialPort; //....and the rest of the java comm API 

public class UsbService implements IUsbProviderService { 
. 
. 
. 
} 

// The emulator 
public class UsbServiceEmulator implements IUsbProviderService { 
    private Thread listenerThread; 
    private static final Long WAITTIMEMS = 10L; 
    private String usbData; 

    public UsbServiceEmulator(long maxWaitTime) throws InaccessibleDeviceException{ 
     initialize(); 
     boolean success = false; 
     long slept = 0; 

     while (!success && slept < maxWaitTime) { 
      Thread.sleep(WAITTIMEMS); 
      slept += WAITTIMEMS; 

     } 
    } 

    private void initialize() throws InaccessibleDeviceException{ 
     listenerThread = new Thread(); 
     listenerThread.start(); 
    } 

    private class UsbRunner implements Runnable { 
     private String[] lines = {"Data line 1", "Data line 2", "Data line 3"}; 
     public void run() { 
      int line = 0; 
      while(true) { 

       serialEvent(lines[line]); 

       if(line == 3) { 
        line = 0; 
       } else { 
        line++; 
       } 

       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        //handle the error 
       } 
      } 

     private void serialEvent(String line) { 
      if(/*you have detected you have enough data */) { 
       synchronized(this) { 
        usbData = parser.getUsbData(); 
       } 
      } 


    } 
} 

希望這有助於!

0

我推薦fabulatech的虛擬調制解調器。在http://www.virtual-modem.com

得到它,你可能還需要得到一個COM端口監視器爲你的測試 - 你可以在 http://www.serial-port-monitor.com

同船祝你好運找到它! :)

+0

虛擬調制解調器是否具有程序員可訪問的API?因爲我沒有看到提供的信息。至於監控串口,該產品看起來不錯。但是如果你只需要一個輸入控制檯,HyperTerminal就可以工作。 – rtperson 2009-06-29 18:55:11

2

感謝迄今爲止所有的答案!這是我在工作中推薦的結果。

  1. 從網上下載AGG軟件
  2. 從網上下載Eltima軟件的虛擬串口驅動程序(VSPD)

(我只是隨機挑選一個免費的數據仿真和虛擬COM端口數據模擬器(CPDE)串行端口封裝有很多替代方案)

  1. 使用VSPD,創建虛擬串行端口24和25並通過虛擬調制解調器電纜連接它們。這有效地創建了24端口和25端口。

  2. 將CPDE連接到24,並開始寫入我的測試數據。

  3. 然我的測試程序,連接到25,並能夠從中

1

我用com0com讀取測試數據,它的偉大工程,爲我所需要的。

2

這部分有很多相關的答案。但就我而言,我個人使用虛擬串行端口驅動程序,這對我來說非常合適。但是我必須承認,在創建虛擬端口方面有很多選擇:freevirtualserialports.com; comOcom僅舉幾例。但我沒有機會使用它們,所以我推薦解決這個問題的是虛擬串行端口驅動程序。