2013-10-29 68 views
1

我编写了一个Java方法,通过串口向远程设备发送指令,并获取已知数量的字节作为答案。代码使用librxtx-java库在RaspberryPi上运行。验证远程设备发送预期长度的答案。IndexOutOfBoundsException从流中读取时

下面的代码是此方法的最后一部分,RaspberryPi等待答案的所有字节达到给定时间“t_max”。

该代码在System.arraycopy期间会引发IndexOutOfBoundsException。如果我通过try ... catch包装arraycopy指令并在catch处打印指针变量,确实存在索引溢出。

但是,如果我取消注释打印出指针值的行,则不会再有异常。即使用System.out.println("X");代替这条线,例外情况也不例外,但System.out.print("X");则不例外。

我试图将变量更改为不稳定但没有更多的运气。如何才能打印出终端更改变量的值?

long t0 = System.currentTimeMillis(); 
long t = t0; 
byte[] answer = new byte[answerLength]; 
byte[] readBuffer = new byte[answerLength]; 
int numBytes = 0; 
int answerPointer = 0; 
while (t - t0 < t_max) { 
    try { 
     if (inputStream.available() > 0) { 
      numBytes = inputStream.read(readBuffer); 
     } 
    } catch (Exception e) { 
    } 

    if (numBytes > 0) { 
     // System.out.println("answerPointer="+answerPointer); 
     System.arraycopy(readBuffer, 0, answer, answerPointer, numBytes); 
     answerPointer = answerPointer + numBytes; 
    } 

    if (answerPointer == answerLength) { 
     return (answer); 
    } 

    t = System.currentTimeMillis(); 
} 
+1

方面评论:不要使用'available()'来确定是否有剩余的字节需要读取。相反,只要'read'返回'-1'就停止。另外,请在您的问题中包含您的堆栈跟踪,因为它可能对我们有帮助。 –

+0

这里有几个问题:'Exception'的空接收是坏的,确实非常糟糕。很多奇怪的问题可能会在这里被吞噬,这会让你的代码后来表现得很糟糕。另一件事是你通过尽可能快地循环并检查可用字节来阅读的方式。 – Matthias

+0

在你的while(...){重新初始化你的numBytes为0(并且捕获你的异常! – Tyco

回答

0

您是否尝试验证输出流和输入流是否以任何方式链接?可能是输入流正在从输出流中读取,而'\ n'(新行)正被用作流字符的结尾。你可以尝试打印输出到字节数组输出流而不是标准输出流,并查看是否执行ps.println(“X”)会导致异常?如果它确实会导致异常,那么标准输出和输入流可能会被链接,这就是为什么执行System.out.println(“X”)会使异常消失。

另外,volatile关键字用在线程的上下文中。它在单线程环境中不会有任何效果。

+0

“链接”流是什么意思?输入流从串口读取,输出流写入stdout。 – Baltazar

+0

通过链接流,我的意思是询问输出流是否以任何方式写入输入流。如果你确定他们不是,那么我上面所说的不是答案,你可以忽略它。否则,你需要检查。仔细检查输出流是否写入您正在读取的串行端口! –

0

如果代码inputStream.available()略知while (t - t0 < t_max)变量numBytesreadBuffer住宿旧值初始化的第二次迭代的异常。尝试将块while (t - t0 < t_max)中的所有代码包装为try {} catch {},并且不要隐藏异常。