繁体   English   中英

JSSC中的读写超时

[英]Read and Write Timeouts in JSSC

在SerialPort.java中,我想了解关于writeBytes和readBytes方法的以下知识:

  • 那些会阻止吗?
  • 如何解释返回布尔值代码?

为了阅读(我使用的是2.8.0版),还有类似readBytes(int byteCount, int timeout) ,您可以在其中指定超时时间。 为了阅读,更好的方法可能是注册SerialPortEventListener 实际上,我从未尝试直接在其外部使用readBytes

对于写入方法,布尔返回码必须为true 原因是返回代码来自后面的C ++ JNI实现。 在JNI部分中不会抛出任何异常,最好在这里也是一个异常。

如果查看例如writeBytes(byte[] buffer)的Java代码,则仅第一行抛出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() + "]");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM