Java 逻辑 - while 循环中发生的奇怪事情
Java logic - strange things happening in while loop
在下面的 while 循环中,我发现输出有一些奇怪的行为。我花了几个小时查看它,但我很困惑为什么它 returns 它的方式。
while (true) {
try {
Log.d("DEBUG BT - BT Service", "IN CONNECTED THREAD RUN");
for(byte firstbyte : buffer){
int j = 0;
int nbytes = mmInStream.read(buffer); //read bytes from input buffer
// int nbytes = mmInStream.available();
String readMessage = new String(buffer, 0, nbytes, "ISO-8859-1");
firstbyte = buffer[j];
byte[] adjbuff;
if(firstbyte == 90){
adjbuff = Arrays.copyOfRange(buffer, 0, 21);
Log.i("Buffer conditioning", "Solenoid syncbyte ran from Connectedthread");
mHandler.obtainMessage(MESSAGE_READ, 22, -1, adjbuff).sendToTarget();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("data incoming loop", "Break at if");
break;
}else if(firstbyte == -91){
adjbuff = Arrays.copyOfRange(buffer, 0, 24);
Log.i("Buffer conditioning", "Sensor syncbyte ran from Connectedthread");
mHandler.obtainMessage(MESSAGE_READ, 25, -1, adjbuff).sendToTarget();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("data incoming loop", "Break at if");
break;
如果 firstbyte == 90
为真,则 if 块中的代码将循环 21 次。
如果 firstbyte == -91
为真,那么 if 块中的代码将循环 24 次。
它在 Arrays.copyOfRange()
的第二个参数中精确循环的次数似乎不是巧合,但第二个参数应该指定我要包含在数组中的最后一个字节的位置?
有人知道为什么会这样吗?我没有办法解决这个问题。
在这种情况下,我们无法了解循环的整个行为,b/c 这取决于您的 BT 设备(我们无权访问)的动态行为。设备发送的数据可以说是预测循环功能的最重要因素。
正如您在评论中提到的,设备正在以一种意想不到的方式发送数据——也就是说,数据块的长度不断增加,前面总是带有 byte1
(90 或 -91)。因为与 BT link 的速度相比,您的循环运行得很快,所以它可能总是先读取 byte1
。我希望 mmInStream.read()
returns 1,然后 2,然后 3,依此类推,进行 21 或 24 次迭代,直到发送完整的有效数据包。这解释了您看到的行为。
换句话说,循环完全按照您的指示执行,但设备执行了意想不到的操作。而且,一旦您能够解决该问题,您就发现了您的问题。
在下面的 while 循环中,我发现输出有一些奇怪的行为。我花了几个小时查看它,但我很困惑为什么它 returns 它的方式。
while (true) {
try {
Log.d("DEBUG BT - BT Service", "IN CONNECTED THREAD RUN");
for(byte firstbyte : buffer){
int j = 0;
int nbytes = mmInStream.read(buffer); //read bytes from input buffer
// int nbytes = mmInStream.available();
String readMessage = new String(buffer, 0, nbytes, "ISO-8859-1");
firstbyte = buffer[j];
byte[] adjbuff;
if(firstbyte == 90){
adjbuff = Arrays.copyOfRange(buffer, 0, 21);
Log.i("Buffer conditioning", "Solenoid syncbyte ran from Connectedthread");
mHandler.obtainMessage(MESSAGE_READ, 22, -1, adjbuff).sendToTarget();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("data incoming loop", "Break at if");
break;
}else if(firstbyte == -91){
adjbuff = Arrays.copyOfRange(buffer, 0, 24);
Log.i("Buffer conditioning", "Sensor syncbyte ran from Connectedthread");
mHandler.obtainMessage(MESSAGE_READ, 25, -1, adjbuff).sendToTarget();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("data incoming loop", "Break at if");
break;
如果 firstbyte == 90
为真,则 if 块中的代码将循环 21 次。
如果 firstbyte == -91
为真,那么 if 块中的代码将循环 24 次。
它在 Arrays.copyOfRange()
的第二个参数中精确循环的次数似乎不是巧合,但第二个参数应该指定我要包含在数组中的最后一个字节的位置?
有人知道为什么会这样吗?我没有办法解决这个问题。
在这种情况下,我们无法了解循环的整个行为,b/c 这取决于您的 BT 设备(我们无权访问)的动态行为。设备发送的数据可以说是预测循环功能的最重要因素。
正如您在评论中提到的,设备正在以一种意想不到的方式发送数据——也就是说,数据块的长度不断增加,前面总是带有 byte1
(90 或 -91)。因为与 BT link 的速度相比,您的循环运行得很快,所以它可能总是先读取 byte1
。我希望 mmInStream.read()
returns 1,然后 2,然后 3,依此类推,进行 21 或 24 次迭代,直到发送完整的有效数据包。这解释了您看到的行为。
换句话说,循环完全按照您的指示执行,但设备执行了意想不到的操作。而且,一旦您能够解决该问题,您就发现了您的问题。