2009-06-29 98 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仅举几例。但我没有机会使用它们,所以我推荐解决这个问题的是虚拟串行端口驱动程序。

相关问题