我在哪里工作,我们解决了类似的问题,让我们的模拟器根本不欺骗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();
}
}
}
}
希望这有助于!
虚拟调制解调器是否具有程序员可访问的API?因为我没有看到提供的信息。至于监控串口,该产品看起来不错。但是如果你只需要一个输入控制台,HyperTerminal就可以工作。 – rtperson 2009-06-29 18:55:11