Логика Java - странные вещи, происходящие в цикле while - PullRequest
0 голосов
/ 13 декабря 2018

В цикле 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 раза.Мне не кажется совпадением, что он повторяет ровно количество раз во втором параметре Arrays.copyOfRange(), но второй параметр должен указывать позицию последнего байта, который я хочу включить в массив?

Кто-нибудь знает, почему это происходит?У меня нет идей для устранения этой проблемы.

1 Ответ

0 голосов
/ 26 декабря 2018

В этом случае мы не можем знать полное поведение цикла, b / c, которое зависит от динамического поведения вашего BT-устройства (к которому у нас нет доступа).Данные, которые отправляет устройство, являются, пожалуй, самым важным фактором в предвидении того, что делает цикл.

Как вы упомянули в комментариях, устройство отправляет данные неожиданным образом, то есть кусками когда-либоувеличение длины, всегда с byte1 (90 или -91) спереди.Поскольку ваш цикл работает быстрее по сравнению со скоростью канала BT, он, вероятно, всегда сначала читает byte1.Я ожидаю, что mmInStream.read() вернет 1, затем 2, затем 3 и т. Д. В течение 21 или 24 итераций, пока не будет отправлен полный действительный пакет.И это объясняет поведение, которое вы видели.

Другими словами, цикл делал именно то, что вы сказали, но устройство делало что-то неожиданное.И, как только вы смогли устранить это, вы нашли свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...