АСКЕ В SerialPort.java, я хотел бы знать следующее на writeBytes и readBytes методах:Чтение и запись Timeouts в
- бы эти блоки?
- Как интерпретировать возврат --boolean-- code?
АСКЕ В SerialPort.java, я хотел бы знать следующее на writeBytes и readBytes методах:Чтение и запись Timeouts в
Для чтения (я использую версию 2.8.0) существуют также методы, такие как , где вы можете указать тайм-аут. Для чтения лучший подход может заключаться в регистрации SerialPortEventListener
. На самом деле я никогда не пытался использовать readBytes
непосредственно за его пределами.
Код типа boolean должен быть 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() + "]");
}