2015-01-23 3 views
2

Я изучал примеры, и я до сих пор не понимаю, как реально читать данные с порта USB в приложении для Android. Я бы хотел, чтобы это было событие/намерение, но я довольно потерял, как это сделать. У меня есть BroadcastReceiver, но я не уверен, что Intent.action мне нужно искать для сбора данных. Любое понимание очень ценится!Android для Arduino USB Communication: Чтение

Редактировать: Чтобы уточнить, что мое устройство Android - это Nexus 9, работающий как USB-хост, и я хочу общаться с Arduino Leonardo.

Edit2: На данный момент у меня есть эскиз Arduino, который отправляет сообщение через серийный каждые 2 секунды. У меня есть кнопка, которая, исходя из моего понимания, должна читать буфер при нажатии, но на самом деле ничего не делает.

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(), я получаю шестнадцатеричные значения, которые меняют каждое нажатие, но я не уверен, как это интерпретировать.

Редактировать 3: Еще какая-то информация по прошествии некоторого времени, я отключил Arduino Leonardo, показанный как устройство ввода клавиатуры HID в соответствии с Arduino being recognized as keyboard by android. Я просто изменил USBDesc.h, чтобы удалить «#define HID_ENABLED». Это не изменило ситуацию. Тем временем я также реализовал библиотеку Physicaloid USB, и это оказалось неудачным. Я в процессе отладки/конвертирования библиотеки USB-serial-for-android mik3y, но до сих пор не смог протестировать ее.

ответ

0

Ваше устройство для Android может использоваться как usb host or accessory. Так что, в зависимости от того, используете ли вы свой телефон в качестве USB-узла, вы используете следующие намерения и разрешения в своем манифесте.

<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 ресурсов, давая подробную информацию о вашем устройстве.

<?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.

Аналогично есть подобный процесс, чтобы настроить устройство в качестве a usb accessory.

+0

Я не уверен, если это то, что вы искали. Надеюсь, поможет. –

+0

Да, я видел этот фрагмент кода раньше, но я до сих пор не понимаю, какая часть этого имеет отношение к чтению входящих данных. Насколько я понимаю, что происходит, это просто настройка разрешений на коммуникацию устройства, а не чтение чего-либо с USB. –

+0

Сообщение начинается дальше в туте .. Встаньте, я добавлю еще немного к моему ответу. Вы зарегистрировали свой ресивер? –