2013-01-18 4 views
0

Я подключаюсь к эмулятору терминала, используя библиотеку в android, это подключается к последовательному устройству (коммутатору) и показывает мне отправленные/полученные данные. Я отправляю данные по последовательному, используя другую библиотеку. Я отправляю данные по соединению через текстовое поле под терминалом или, введя сам терминал и нажав кнопку ввода на клавиатуре в обоих случаях. Я также могу отправлять команды, нажимая кнопки.получение бесконечного цикла?

В моей деятельности у меня есть метод под названием sendOverSerial, который просто вызывает библиотечный метод для передачи данных через usb на устройство, подключенное через последовательный порт.

public static void sendOverSerial(byte[] data) { 

     if(mSelectedAdapter !=null && data !=null){ 
     mSelectedAdapter.sendData(data); 

     }} 

Это действие открывает экземпляр класса, этот класс используется для записи данных на экран терминала. Обычно, когда я хочу отправлять данные через последовательный порт, через editText и buttons я вызываю метод sendOverSerial в этом действии. Но когда я пишу персонажей в сам терминал, их собирают в этом новом экземпляре метод write. Поэтому я должен вызвать метод sendOverSerial из этого экземпляра. Моя проблема заключается в том, что если я назову его написать «TEST» ниже, тогда TEST будет записываться на терминал в бесконечном цикле, он просто продолжает писать его. Любая идея почему? Если я отправлю его дальше, как я прокомментировал, он просто отправляет его как можно раньше.

public void write(byte[] bytes, int offset, int count) { 

      int numCRs = 0; 
      for (int i = offset; i < offset + count; ++i) { 
       if (bytes[i] == '\r') { 
        ++numCRs; 
       } 
      } 

      if (numCRs == 0) { 
       // No CRs -- just send data as-is 

       //infinite loop if I send from here 
       GraphicsTerminalActivity.sendOverSerial("TEST".getBytes()); 

       super.write(bytes, offset, count); 

       if (isRunning()) { 
        doLocalEcho(bytes); 
       } 
       return; 
      } 

      Log.d(TAG, "CRs=== " + numCRs); 
      // Convert CRs into CRLFs 
      byte[] translated = new byte[count + numCRs]; 
      int j = 0; 
      for (int i = offset; i < offset + count; ++i) { 
       if (bytes[i] == '\r') { 
        translated[j++] = '\r'; 
        translated[j++] = '\n'; 
       } else { 
        translated[j++] = bytes[i]; 
       } 
      } 
      //fine if I send from here, sends once 
      GraphicsTerminalActivity.sendOverSerial("SECOND TEST".getBytes()); 
      super.write(translated, 0, translated.length); 

      // If server echo is off, echo the entered characters locally 
      if (isRunning()) { 
       doLocalEcho(translated); 
      }        
     } 

Super.write из библиотеки:

public void write(byte[] data, int offset, int count) { 
     try { 
      mWriteQueue.write(data, offset, count); 
     } catch (InterruptedException e) { 
     } 
     notifyNewOutput(); 
    } 

, который затем вызывает запись в другой класс в библиотеке, класс bytequeue

public void write(byte[] buffer, int offset, int length) 
    throws InterruptedException { 
     if (length + offset > buffer.length) { 
      throw 
       new IllegalArgumentException("length + offset > buffer.length"); 
     } 
     if (length < 0) { 
      throw 
      new IllegalArgumentException("length < 0"); 

     } 
     if (length == 0) { 
      return; 
     } 
     synchronized(this) { 
      int bufferLength = mBuffer.length; 
      boolean wasEmpty = mStoredBytes == 0; 
      while (length > 0) { 
       while(bufferLength == mStoredBytes) { 
        wait(); 
       } 
       int tail = mHead + mStoredBytes; 
       int oneRun; 
       if (tail >= bufferLength) { 
        tail = tail - bufferLength; 
        oneRun = mHead - tail; 
       } else { 
        oneRun = bufferLength - tail; 
       } 
       int bytesToCopy = Math.min(oneRun, length); 
       System.arraycopy(buffer, offset, mBuffer, tail, bytesToCopy); 
       offset += bytesToCopy; 
       mStoredBytes += bytesToCopy; 
       length -= bytesToCopy; 
      } 
      if (wasEmpty) { 
       notify(); 
      } 
     } 
    } 
+0

Нет такой вещи, как «бесконечный цикл». Рано или поздно батарея разрядится, какой-то ресурс будет исчерпан, или какой-то компонент потерпит неудачу. Или ты просто устаешь ждать. –

+3

Да, это имя определенного типа цикла. И даже если это не так, это не совсем конструктивный комментарий. http://en.wikipedia.org/wiki/Infinite_loop – Paul

+0

можете ли вы опубликовать или обобщить код, который вызывает запись? Вы уверены, что он будет отображать «TEST» бесконечное количество раз для одного вызова для записи? –

ответ

0

метод получал вызывается автоматически, когда данные был отправлен, этот метод также имел призыв написать в нем, et viola, бесконечный цикл.

Смежные вопросы