1

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

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

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

但是,如果我取消注释打印出指针值的行,则不再有例外。即使将这一行替换为System.out.println("X");使异常消失,但System.out.print("X");例如没有。

我尝试将变量更改为 volatile 但没有更多的运气。打印到终端如何改变变量的值?

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();
}
4

2 回答 2

1

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

此外,在线程的上下文中使用了volatile关键字。它在单线程环境中不会有任何影响。

于 2013-10-29T09:10:50.003 回答
0

如果代码在变量inputStream.available()的第二次迭代中抛出异常并保持使用旧值初始化。尝试将所有代码打包成块,不要隐藏异常。while (t - t0 < t_max)numBytesreadBufferwhile (t - t0 < t_max)try {} catch {}

于 2013-10-29T09:54:25.140 回答