首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSSC中的读写超时

JSSC中的读写超时
EN

Stack Overflow用户
提问于 2014-10-03 17:59:07
回答 1查看 3.2K关注 0票数 2

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

  • 那些东西会阻塞吗?
  • 如何解释返回--布尔-代码?
EN

回答 1

Stack Overflow用户

发布于 2015-04-20 00:58:49

对于阅读(我使用的是2.8.0版本),还有一些方法,比如readBytes(int byteCount, int timeout),您可以在其中指定超时。要阅读,更好的方法可能是注册一个SerialPortEventListener。事实上,我从未尝试过直接在readBytes之外使用它。

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

如果查看例如writeBytes(byte[] buffer)的Java代码,只有第一行是抛出一个SerialPortException,则实际的传输将使用布尔返回代码来处理:

代码语言:javascript
复制
this.checkPortOpened("writeBytes()");
return this.serialInterface.writeBytes(this.portHandle, buffer);

写入部分可以阻塞,例如,如果串行端口没有响应。我用了一条线来防止这样的事情:

代码语言:javascript
复制
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;
    }
}

然后用超时来调用它:

代码语言:javascript
复制
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() + "]");
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26184226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档