如何模拟COM端口,向其写入数据并从中读取数据?

时间:2009-06-29 17:22:05

标签: java usb serial-port

我正在尝试测试从设备连接到计算机和船上时创建的USB端口(连接设备时为COM25)的代码。不在船上时,我无法为USB设备供电,因此测试很困难。有人能让我知道如何模拟COM端口并向其写入数据,以便我的测试程序能够连接到该模拟的COM端口并读取该数据吗?

我正在从Java程序中读取它,但模拟不需要使用Java或任何特定语言。只是一个程序,它将模拟COM端口并允许我连接到它。我从AGG软件下载了一个COM端口仿真器,看起来它写的是我认为的COM25,但是我无法通过Java测试连接到它。

7 个答案:

答案 0 :(得分:5)

这类问题的一般答案是在实现接口的类中包含与COM端口对话的代码。如果你以Facade(模式)的形式执行此操作,那么你也可以使你认为最合适的COM方法合理。

然后可以模拟或伪造接口以进行测试。 (关于测试对象有一篇很棒的文章,但我还没有找到它。)这里的一个优点是你可以创建一个假的版本,抛出异常或以其他方式完成端口可以执行的操作但是很难在实践中做到这一点。

答案 1 :(得分:2)

在我工作的地方,我们通过让我们的模拟器完全不欺骗COM端口来解决类似的问题。这是你如何做到的:

  • 定义用于与COM端口通信的接口,例如IUsbCommService
  • 使用标准Java Comm API
  • 实现真正的COM通信服务
  • 对于您的模拟器,只需踢出一个线程,该线程会定期向您的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();
                }
            } 


     }
}

希望这有帮助!

答案 2 :(得分:2)

感谢到目前为止的所有答案!这是我最终在工作中得到推荐的结果。

  1. 从AGG软件下载COM端口数据模拟器(CPDE)
  2. 从Eltima Software下载虚拟串行端口驱动程序(VSPD)
  3. (我只是随机选择了一个免费的数据模拟器和虚拟串口包。那里有很多替代方案)

    1. 使用VSPD,创建虚拟串行端口24和25,并通过虚拟零调制解调器电缆连接它们。这有效地创建了一个24的写端口和一个25的读端口。

    2. 跑到CPDE,连接到24并开始编写我的测试数据。

    3. 跑完我的测试程序,连接到25并且能够从中读取测试数据

答案 3 :(得分:2)

本节中有很多相关的答案。但就我而言,我个人使用虚拟串行端口驱动程序,这对我来说非常适合。但我必须承认,在创建虚拟端口时有很多选择:freevirtualserialports.com; comOcom仅举几例。但我没有机会使用它们,所以我建议解决这个问题的是虚拟串口驱动程序。

答案 4 :(得分:1)

我推荐fabulatech的虚拟调制解调器。 在http://www.virtual-modem.com

获取

您可能还想为测试获取COM端口监视器 - 您可以在以下位置找到它 http://www.serial-port-monitor.com

祝你好运! :)

答案 5 :(得分:1)

我使用com0com,它可以满足我的需要。

答案 6 :(得分:1)

除了所有其他的,我想添加这个很好的免费模拟器https://sites.google.com/site/terminalbpp/我确实使用。我也使用AGG Com端口数据模拟器。