2013-01-18 4 views
0

안드로이드의 라이브러리를 사용하여 터미널 에뮬레이터에 연결 중이며,이 장치는 직렬 장치 (스위치)에 연결되어 전송/수신 데이터를 보여줍니다. 다른 라이브러리를 사용하여 직렬로 데이터를 보냅니다. 연결을 통해 데이터를 터미널 아래의 텍스트 상자를 통해 보내거나 터미널 자체에서 입력하고 두 경우 모두 키보드에서 Enter 키를 눌러 데이터를 보냅니다. 버튼을 눌러 명령을 보낼 수도 있습니다.무한 루프가 발생합니까?

제 활동에는 시리얼을 통해 연결된 장치로 USB를 통해 데이터를 보내기 위해 라이브러리 메소드를 호출하는 sendOverSerial이라는 메소드가 있습니다.

public static void sendOverSerial(byte[] data) { 

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

     }} 

이 활동은 클래스 인스턴스를 열고,이 클래스는 터미널 화면에 데이터를 쓰는 데 사용됩니다. 일반적으로 editTextbuttons을 통해 일련 번호로 데이터를 보내려는 경우 해당 활동에서 sendOverSerial 메서드를 호출합니다. 그러나 터미널 자체에 문자를 쓸 때이 새로운 인스턴스 write 메서드에서 선택됩니다. 그래서 그 인스턴스에서 sendOverSerial 메서드를 호출해야합니다. 내 문제는 내가 "TEST"를 작성하면 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

작성하는 코드를 게시하거나 요약 할 수 있습니까? 한 번의 전화가 쓸 수있는 시간이 무한정 "테스트"로 표시됩니까? –

답변

0

보내지고 있었는데,이 방법은 또한 비올라, 무한 루프를 작성하는 전화를했다.

관련 문제