シリアル ポート経由でリモート デバイスに命令を送信し、既知のバイト数を応答として取得する Java メソッドを作成しました。コードは、librxtx-java ライブラリを使用して RaspberryPi で実行されます。リモート デバイスは、予想される長さの応答を送信することが確認されました。
以下のコードは、このメソッドの最後の部分であり、RaspberryPi は指定された時間 "t_max" まで応答のすべてのバイトを待ちます。
そのままのコードでは、 中に IndexOutOfBoundsException がスローされSystem.arraycopy
ます。arraycopy 命令を try...catch でラップし、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();
}