Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟COM端口,向其写入数据并从中读取数据?_Java_Usb_Serial Port - Fatal编程技术网

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

Java 如何模拟COM端口,向其写入数据并从中读取数据?,java,usb,serial-port,Java,Usb,Serial Port,我正在尝试测试我的代码,该代码从USB端口(设备连接时为COM25)读取,该端口是设备连接到我的计算机和船时创建的。我不在船上时无法为USB设备供电,因此测试很困难。有人能告诉我如何模拟COM端口并向其写入数据,以便我的测试程序能够连接到该模拟COM端口并读取该数据吗 我是从一个Java程序中读到这篇文章的,但是模拟不需要使用Java或任何特定的语言。只是一个程序,将模拟COM端口,并允许我连接到它。我从AGG软件下载了一个COM端口模拟器,它似乎在写我认为是COM25的东西,但我无法通过Jav

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


我是从一个Java程序中读到这篇文章的,但是模拟不需要使用Java或任何特定的语言。只是一个程序,将模拟COM端口,并允许我连接到它。我从AGG软件下载了一个COM端口模拟器,它似乎在写我认为是COM25的东西,但我无法通过Java测试连接到它。

这种问题的一般答案是将与COM端口对话的代码封装在实现接口的类中。如果您将此作为一个Facade(模式)来执行,那么您还可以使您调用的COM方法从您的终端变得合理


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

在我工作的地方,我们解决了一个类似的问题,我们的模拟器根本没有欺骗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();
                }
            } 


     }
}
导入您的包。无法访问的设备异常;
导入您的Package.NodeataAvailableException;
公共接口IUsbProviderService{
public void initDevice()抛出不可访问的DeviceException;
公共UsbData getUsbData()
抛出不可访问的DeviceException、NoDataAvailableException;
}
//真正的服务
导入javax.comm.SerialPort;/。。。。以及java comm API的其余部分
公共类UsbService实现IUsbProviderService{
.
.
.
}
//仿真器
公共类UsbServiceEmulator实现IUsbProviderService{
私有线程listenerThread;
专用静态最终长等待时间ms=10L;
私有字符串usbData;
公共UsbServiceEmulator(长maxWaitTime)抛出不可访问的DeviceException{
初始化();
布尔成功=假;
长期睡眠=0;
while(!success&&sleep

希望这有帮助!

我推荐fabulatech的虚拟调制解调器。 在

您可能还想为您的测试获取一个COM端口监视器-您可以在


祝你在船上好运!:)

感谢到目前为止所有的答案!以下是我在工作中得到的建议

  • 从AGG软件下载COM端口数据仿真器(CPDE)
  • 从Eltima软件下载了虚拟串行端口驱动程序(VSPD)
  • (我只是随机挑选了一个免费的数据仿真器和虚拟串口软件包。有很多选择)

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

  • 运行CPDE,连接到24并开始写入测试数据

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


  • 我使用它,它对我所需要的东西非常有用。

    除其他外,我还想添加我使用的这个漂亮的免费模拟器。我也使用AGG Com端口数据模拟器。

    在这一部分有很多相关的答案。但对于我来说,我个人使用虚拟串行端口驱动程序,它对我来说非常适合。但我必须承认在创建虚拟端口时,有很多替代方法:freevirtualserialports.com;comOcom。但我没有机会使用它们,因此我建议使用虚拟串行端口驱动程序来解决此问题。

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