3

나는 매초마다 거리를 출력 할 수 있도록 간단한 수중 음파 탐지기 프로젝트를 가지고 있습니다. 내 arduino와 통신하기 위해 UsbSerial을 사용하는 Android 앱을 구현했습니다. 지금까지는 데이터를 수신 할 수 있었지만 수신 한 데이터는 정확했지만 문제는 값이 제대로 전송되지 않는 경우입니다. 여기 샘플 I 수신 출력 : 생성하는 코드 여기안드로이드 앱이 Arduino와 동기화되지 않았습니다. 시리얼 통신

data: 7 
data: 1  
data: 
data: 71 

하고 출력 :

  • 라인 1 :
    private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { 
    
         @Override 
         public void onReceivedData(byte[] arg0) 
         { 
          try { 
           String data = new String(arg0, "UTF-8"); 
           System.out.println("data: " + data); 
          } catch (UnsupportedEncodingException e) { 
           e.printStackTrace(); 
          } 
         } 
        }; 
    

    그래서 제 생각에 여기에이 문제가 & 2는 단지 한 줄이어야합니다. 71
  • 3 행이 내 앱으로 존재하지 않아야합니다. 열창은 onReceivedData을 듣고 arduino는 항상 무언가를 보냅니다.

도움을 주시면 감사하겠습니다.

답변

1

문제점의 해결책을 발견했습니다. this link을 읽음으로써 나는 onReceivedData 방법으로받은 데이터를 조작해야한다는 것을 알았습니다.

private void clearBytes(){ 
     buffer=new byte[8]; 
     bufferSize = 0; 
    } 

    private void appendBytes(byte[] buf){ 
     System.arraycopy(buf, 0, buffer, bufferSize, buf.length); 
     bufferSize += buf.length; 
    } 

    private void printData() { 
     if (bufferSize == 0) { 
      return; 
     } 
     byte[] buf = new byte[bufferSize]; 
     System.arraycopy(buffer, 0, buf, 0, bufferSize); 

     String data = null; 
     try { 
      data = new String(buf, "UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     if (null != data && !data.isEmpty()) { 
      System.out.println("data: " + data); 
     } 
    } 

    public boolean isStartByte(byte firstChar){ 
     return firstChar=='A'; 
    } 

또한 내가 아두 이노 코드를 수정하고 추가 직렬 출력의 시작 부분에 문자 A : 내가 추가 한 다른 방법 여기

private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { 

     @Override 
     public void onReceivedData(byte[] arg0) 
     { 
      if(arg0!= null && arg0.length > 0){ 
       if (isStartByte(arg0[0])) { 
        printData(); 
        clearBytes(); 
       } 
       appendBytes(arg0); 
      } 
     } 
    }; 

과 : 그래서 나는 다음과 같은 mCallBack 변경 . 이것은 문제를 해결하지만 이것이 최선의 방법은 아니라고 생각합니다. 나는 UsbSerial 라이브러리가 더 나은 출력 처리를 제공해야한다고 생각한다. (아니면 내가 틀렸고 직렬 통신으로 작업하는 것이 자연 스럽다.)

+0

이것은 print 데이터()의 일을하는 방식이 마지막 데이터 조각에 대해 호출되지 않기 때문에 입력을 매칭하기 위해 * \ n *을 구분 기호로 사용해야합니다. 새로운 입력이 도착하면 또한,'bufferSize'가 *'buffer'의 크기를 초과하면 어떻게 될까요? –

+0

@PatrickTrentin 데이터를 직렬 포트에서 전달할 때 버퍼 크기를 초과 할 수있는 방법이 없지만 사용자 의견이 완벽하게 유효하며 해당 상황도 처리해야합니다. 감사 – pms