我在哪裏工作,我們解決了類似的問題,讓我們的模擬器根本不欺騙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