Java逻辑-while循环中发生的奇怪事情

Java逻辑-while循环中发生的奇怪事情,java,android,arrays,while-loop,buffer,Java,Android,Arrays,While Loop,Buffer,在下面的while循环中,我发现输出有一些奇怪的行为。我花了几个小时查看它,但我不明白它为什么会这样返回 while (true) { try { Log.d("DEBUG BT - BT Service", "IN CONNECTED THREAD RUN"); for(byte firstbyte : buffer){ int j = 0;

在下面的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
为真,则该If块内的代码循环21次。 如果
firstbyte==-91
为真,则该If块中的代码循环24次。 它在
array.copyOfRange()
的第二个参数中循环的次数恰好相同,这似乎不是巧合,但第二个参数应该指定要包含在数组中的最后一个字节的位置


有人知道为什么会这样吗?我没有办法解决这个问题。

在这种情况下,我们无法知道循环的整个行为,这取决于您的BT设备(我们无法访问)的动态行为。设备发送的数据可以说是预测循环功能的最重要因素

正如您在评论中提到的,该设备以一种意外的方式发送数据——即,数据块的长度不断增加,总是以
字节1
(90或-91)开头。因为与BT链路的速度相比,您的循环运行得很快,所以它可能总是先读取字节1。我希望
mmInStream.read()
返回1,然后返回2,然后返回3,以此类推,重复21或24次,直到发送完整的有效数据包。这就解释了你看到的行为


换言之,循环正是按照您告诉它的方式进行的,但设备却做了一些意想不到的事情。一旦你能够解决这个问题,你就发现了问题。

这可能是因为你从来没有增加过
j
,所以你总是得到相同的结果。因此,你用一个名为
firstbyte
的变量在
buffer
上迭代,但是它立即被
firstbyte=buffer[j]覆盖
,其中
j
始终为
0
。我不知道到底是什么
mmInStream.read(缓冲区)
会,但我假设它会将数据从流读取到您当前正在迭代的
缓冲区
对象?是的,但缓冲区是动态的,每1000毫秒从inputstream更新一次。有意在缓冲区位置0检查这些字节值中的任何一个。如果90或-91出现在缓冲区[0]以外的任何位置,则该字节数组无效,不应使用。你看到了为什么每个IF块都通过相应的CopyOfFielt int to参数吗?考虑一下:如果<代码> MMINSTRES.Read()/代码>一次只读取一个字节怎么办?它将始终返回1,
firstbyte
将始终是最近接收到的字节。因此,如果您的BT设备连续发送21“90秒”或24“-91秒”,您将看到您描述的行为。
for
循环永远不会执行第二个循环,b/c它每次都会
中断
。您是正确的,连接的设备上的固件中的错误导致了该问题。它像这样发送数据。。。字节1\n字节1、字节2\n字节1字节2字节3\n等,直到它最终发送整个数据包。这是一个仅影响设备上蓝牙通信的问题,因此当我尝试在pc上使用usb进行调试时,我没有发现问题。感谢大家的投入。