2015-01-23 2 views
2

나는 예제를 살펴 봤는데 안드로이드 어플리케이션의 USB 포트에서 실제로 데이터를 읽는 방법에 대해서는 아직 명확하지 않습니다. 나는 그것을 이벤트/의도 주도로하고 싶습니다만, 저는이 일을하는 방법에 대해 꽤 분실되어 있습니다. BroadcastReceiver가 있지만 Intent.action에서 데이터를 수신하기 위해 필요한 정보가 무엇인지 확신 할 수 없습니다. 통찰력이 인정됩니다!Android to Arduino USB 통신 : 읽기

편집 : 내 Android 기기를 명확히하기 위해 USB 호스트로 실행되는 Nexus 9가 있으며 Arduino Leonardo와 통신하고 싶습니다.

편집 2 :이 시점에서 2 초마다 일련의 메시지를 보내는 Arduino 스케치가 있습니다. 버튼을 눌렀을 때 버퍼를 읽어야하지만 실제로는 아무 것도하지 않는 버튼이 있습니다.

TextView displayMessages = (TextView)findViewById(R.id.textView); 

    try 
    { 
     byte[] msgBytes = new byte[1000]; 
     connection.bulkTransfer(input, msgBytes, msgBytes.length, TIMEOUT); 

     String msgString = new String(msgBytes, "UTF-8");// msgBytes.toString(); 
     displayMessages.setText(msgString); 
    } 
    catch (Exception e) 
    { 
     displayMessages.setText(e.getMessage()); 
    } 

그 결과 textView가 비어 있습니다. 변환을 수행하지 않고 바이트 []. toString()을 삭제하면 각 프레스가 바뀌는 16 진 값을 얻지 만이를 해석하는 방법을 모르겠습니다.

편집 3 : 잠시 시간이 지났기 때문에 더 많은 정보가 있습니다. Arduino being recognized as keyboard by android에 따라 HID 키보드 입력 장치로 표시되는 Arduino Leonardo를 비활성화했습니다. 간단히 "#define HID_ENABLED"를 제거하기 위해 USBDesc.h를 수정했습니다. 이것은 상황을 변화시키지 않았다. 그동안 필로피 형 USB 라이브러리도 구현 했으므로 성공하지 못했습니다. 나는 mik3y의 USB-serial-for-android 라이브러리를 디버깅/변환하는 중이지만 지금까지는 테스트 할 수 없었다.

답변

0

귀하의 안드로이드 기기는 usb host or accessory으로 사용할 수 있습니다. 휴대 전화를 USB 호스트로 사용하는지 여부에 따라 매니페스트에서 다음과 같은 의도와 권한을 사용합니다. 장치의 세부 사항을 제공하는 XML 리소스 파일로

<uses-feature android:name="android.hardware.usb.host" /> 
<activity ... usb host...> 
     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
     </intent-filter> 
      <meta-data 
      android:resource="@xml/device_filter" 
      android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 

.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
//details of a device I own 
<usb-device vendor-id="22b8" product-id="2e76" class="ff" subclass="ff" protocol="00" /> 
</resources> 

그런 다음 방송 수신기를 설정하고 단계 in the API를 따릅니다.

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 

    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 
     if (ACTION_USB_PERMISSION.equals(action)) { 
      synchronized (this) { 
       UsbDevice device = 
         (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

       if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (device != null) { 
         //call method to set up device communication 
        } 
       } else { 
       } 
      } 
     } 
    } 
}; 

수신자를 등록해야합니다.

mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 

    mPermissionIntent = 
      PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    registerReceiver(mUsbReceiver, filter); 

그런 다음 데이터를 읽고 쓰는 함수를 만듭니다.

private Byte[] bytes 
private static int TIMEOUT = 0; 
private boolean forceClaim = true; 

... 

UsbInterface intf = device.getInterface(0); 
UsbEndpoint endpoint = intf.getEndpoint(0); 
UsbDeviceConnection connection = mUsbManager.openDevice(device); 
connection.claimInterface(intf, forceClaim); 
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread 

원하는 위치로 데이터를 가져 오려면이 코드를 수정해야합니다. This link (android.serverbox)은 전송 스레드 처리에 대한 좋은 설명을 제공합니다.

이 코드는 android.com 문서에서 일부 수정되었습니다.

은 마찬가지로이 당신이 찾고 있던 무슨 경우 잘 모르겠어요

+0

a usb accessory.으로 장치를 설정하는 유사한 과정이있다. 희망이 도움이됩니다. –

+0

그래, 이전에이 코드 조각을 보았습니다. 그러나 나는 그 부분이 들어오는 데이터를 읽는 것과 관련이 있는지 이해하지 못합니다. 늘어나는 일이 무엇인지 이해하는 한, 단순히 USB 통신을 사용하지 않고 장치 통신 권한을 설정하는 것입니다. –

+0

의사 소통이 더 아래쪽에서 시작됩니다. 잠깐만 기다려주세요. 내 대답에 좀 더 추가 할 것입니다. 수신자를 등록 했습니까? –