【问题标题】:How can I emulate a COM port, write data to it and read data from it?如何模拟 COM 端口,向其写入数据并从中读取数据?
【发布时间】:2009-06-29 17:22:04
【问题描述】:

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

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

【问题讨论】:

    标签: java usb serial-port


    【解决方案1】:

    此类问题的一般答案是将与 COM 端口通信的代码包装在实现接口的类中。如果您将其作为外观(模式)执行,那么您还可以使您调用的 COM 方法从最终开始变得合理。

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

    【讨论】:

      【解决方案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();
                      }
                  } 
      
      
           }
      }
      

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        感谢到目前为止的所有答案!这是我在工作人员的建议下最终做的事情。

        1. 从 AGG Software 下载 COM 端口数据仿真器 (CPDE)
        2. 从 Eltima Software 下载了虚拟串行端口驱动程序 (VSPD)

        (我只是随机选择了一个免费的数据模拟器和虚拟串口包。那里有很多替代品)

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

        2. 运行 CPDE,连接到 24 并开始写入我的测试数据。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

            祝你好运! :)

            【讨论】:

            • 虚拟调制解调器是否有程序员可访问的 API?因为我没有从提供的信息中看到一个。至于监控串口,产品看起来不错。但是,如果您只需要一个控制台进行输入,超级终端也可以正常工作。
            【解决方案6】:

            我使用com0com,它非常适合我的需要。

            【讨论】:

              【解决方案7】:

              除此之外,我想添加这个不错的免费模拟器https://sites.google.com/site/terminalbpp/ 我确实使用过。我也使用 AGG Com 端口数据模拟器。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-29
                • 1970-01-01
                • 1970-01-01
                • 2023-03-09
                • 1970-01-01
                相关资源
                最近更新 更多