2014-10-03 3 views

ответ

1

Для чтения (я использую версию 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() + "]"); 
}