在下面的while循环中,我发现输出有些奇怪的行为。我已经花了几个小时仔细研究了一下,但是对于为什么它返回原来的方式我感到困惑。
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
为true,则if块中的代码将循环21次。
如果firstbyte == -91
为true,则if块中的代码循环24次。
在Arrays.copyOfRange()
的第二个参数中,它确切地循环了多少次,这似乎不是巧合,但是第二个参数应该指定位置我要包括在数组中的最后一个字节吗?>
有人知道为什么会这样吗?我没有办法解决此问题。
答案 0 :(得分:0)
在这种情况下,我们无法知道循环的整个行为b / c,这取决于您的BT设备的动态行为(我们无法访问)。设备发送的数据可以说是预测循环作用的最重要因素。
正如您在评论中提到的那样,设备正在以一种意想不到的方式发送数据-即,长度不断增加的数据块始终始终位于byte1
(90或-91)的前面。由于与BT链接的速度相比,您的循环运行更快,因此它总是总是最先读取byte1
。我希望mmInStream.read()
返回1,然后2,然后3,依此类推,进行21或24次迭代,直到发送完整的有效数据包为止。这就解释了您看到的行为。
换句话说,循环正在完全按照您的指示执行操作,但是设备在执行意外的操作。而且,一旦您能够解决问题,就发现了问题。