的读取和写入超时在JSSC
答
对于阅读(我正在使用版本2.8.0)也有方法,如readBytes(int byteCount, int timeout)
您可以指定超时。阅读更好的方法可能是注册SerialPortEventListener
。事实上,我从来没有试图直接在其外面使用readBytes
。
写入方法的布尔返回码必须为true
。原因是来自C++ JNI实现的返回代码。在JNI部分中不会引发异常,在这里也更好。
如果您查看Java代码writeBytes(byte[] buffer)
只有第一线被投掷SerialPortException
,实际传输与所述布尔返回码处理:
this.checkPortOpened("writeBytes()");
return this.serialInterface.writeBytes(this.portHandle, buffer);
写入部分可以阻止,例如如果串口没有响应。我已经使用一个线程来防止这一点,是这样的:
private static class BackgroundWriter implements Callable<Boolean> {
private SerialPort serialPort;
private String atCommand;
public BackgroundWriter(SerialPort serialPort, String atCommand) {
this.serialPort = serialPort;
this.atCommand = atCommand;
}
@Override
public Boolean call() throws Exception {
// add carriage return
boolean success = serialPort.writeString(atCommand+"\r");
return success;
}
}
,后来与超时称之为:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Boolean> writeResult = executorService.submit(new BackgroundWriter(serialPort, atCommand));
boolean success;
try {
success = writeResult.get(writeTimeout, TimeUnit.MILLISECONDS);
} catch (Exception e) {
if (serialPort != null && serialPort.isOpened()) {
try {
serialPort.closePort();
} catch (SerialPortException e2) {
LOGGER.warn("Could not close serial port after timeout.", e2);
}
}
throw new IOException("Could not write to serial port due to timeout.", e);
}
if (!success) {
throw new IOException("Could not write to serial port [" + serialPort.getPortName() + "]");
}