java serial read()无限期地等待 - 如何打破它?

时间:2018-06-11 12:46:19

标签: java serial-port read-data

我有一个连接到我的PI的串行设备,我从中读取数据... 一切都很好,但有时电缆移动或串口设备拔掉。

然后

line = r.readLine();

卡住了

我试图通过以下方式解决这个问题:

BufferedReader r = new BufferedReader (newnputStreamReader(p.getInputStream()));     
         try 
            {
                line = r.readLine();
                if (line.length() == 0)
                {
                    logfile.append("problem");
                    logfile.close();
                    System.out.println("Problem");
                    TimeUnit.SECONDS.sleep(5);
                    break;
                }

            }
            catch (IOException e)
            {
                logfile.append(line);
                logfile.close();
            }

但它什么都不做(因为我还在等待数据) 甚至没有抛出异常 我怎么能让他说我有问题? 也许使用计时器或类似的东西? 如果5秒没有数据?

谢谢,

2 个答案:

答案 0 :(得分:0)

在这种情况下你的假设是正确的。 readLine()的{​​{1}}方法有一个内部BufferedReader,它将从基础输入流中检索所有字节,并且只有在到达字符为while-loop或{{}时才会中断1}}。

想想它:

\n

但是一旦输入方法就不会返回。唯一的例外是这两个特殊字符的出现或者InputStream是否关闭(在这种情况下返回\r)。

诀窍是在从InputStream中读取内容之前不要输入:

while(lastChar != '\n' || lastChar != '\r')
{
     //read from stream
}

这只是众多可能解决方案中的一种,我使用System.in作为示例,因为它和其他任何一样都是一个InputStream。但是还有一个名为null的方法,如果有什么要读的话会返回public static void main( String[] args ) throws IOException { boolean awaitInput = true; while(awaitInput) { if(System.in.available() != 0) { awaitInput = false; // read logic } } }

BufferedReader#ready

最后,如果你想要超时,你可以自己轻松地做到这一点:

true

答案 1 :(得分:0)

您可以使用CompletableFuture同时阅读并能够使用超时。

// wrap the readLine into a concurrent call
CompletableFuture<String> lineFuture = CompletableFuture.supplyAsync(() -> r.readLine());
try {
    // do the call, but with a timeout
    String readLine = lineFuture.get(5, TimeUnit.SECONDS);
    // do stuff with the line you read
} catch (TimeoutException e) {
    // plug pulled?
}