的读取和写入超时在JSSC

问题描述:

在SerialPort.java,我想知道writeBytes和方法的ReadBytes如下:的读取和写入超时在JSSC

  • 请问那些块?
  • 如何解释返回--boolean--代码?

对于阅读(我正在使用版本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() + "]"); 
}