如何模拟COM端口,向其写入数据并从中读取数据?
我试图测试从设备连接到我的电脑和船上时创建的USB端口(设备连接时为COM25)读取的代码。当不在船上时,我无法给USB设备供电,所以测试很困难。有人可以让我知道如何模拟COM端口并向其写入数据,以便我的测试程序能够连接到该模拟COM端口并读取该数据?如何模拟COM端口,向其写入数据并从中读取数据?
我正在从Java程序中读取它,但仿真不需要使用Java或任何特定语言。只是一个程序,将模拟COM端口,并允许我连接到它。我从AGG软件下载了一个COM端口仿真器,它似乎写入了我认为是COM25的内容,但我无法通过Java测试连接到它。
这种问题的一般答案是在实现接口的类中封装与COM端口通信的代码。如果你将它作为Facade(模式)来使用,那么你也可以从你的结尾使你称之为合理的COM方法变得明智。
接口然后可以被模拟或伪造以进行测试。 (关于测试对象有一篇很棒的文章,但我还没有找到它。)这里的一个优点是您可以创建一个假的版本来抛出异常,或者做其他事情来做端口可以做的事情,但是在实践中很难做到这一点。
我在哪里工作,我们解决了类似的问题,让我们的模拟器根本不欺骗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();
}
}
}
}
希望这有助于!
我推荐fabulatech的虚拟调制解调器。在http://www.virtual-modem.com
得到它,你可能还需要得到一个COM端口监视器为你的测试 - 你可以在 http://www.serial-port-monitor.com
同船祝你好运找到它! :)
感谢迄今为止所有的答案!这是我在工作中推荐的结果。
- 从网上下载AGG软件
- 从网上下载Eltima软件的虚拟串口驱动程序(VSPD)
(我只是随机挑选一个免费的数据仿真和虚拟COM端口数据模拟器(CPDE)串行端口封装有很多替代方案)
使用VSPD,创建虚拟串行端口24和25并通过虚拟调制解调器电缆连接它们。这有效地创建了24端口和25端口。
将CPDE连接到24,并开始写入我的测试数据。
然我的测试程序,连接到25,并能够从中
这部分有很多相关的答案。但就我而言,我个人使用虚拟串行端口驱动程序,这对我来说非常合适。但是我必须承认,在创建虚拟端口方面有很多选择:freevirtualserialports.com; comOcom仅举几例。但我没有机会使用它们,所以我推荐解决这个问题的是虚拟串行端口驱动程序。
虚拟调制解调器是否具有程序员可访问的API?因为我没有看到提供的信息。至于监控串口,该产品看起来不错。但是如果你只需要一个输入控制台,HyperTerminal就可以工作。 – rtperson 2009-06-29 18:55:11