如何使用 Android 硬件 USB API 将数据 send/receive 数据连接到 USB 设备?

How to send/receive data to USB device connection using Android Hardware USB API?

我这里有一个 Bluefruit LE Feather 32u4 开发板连接到我的 Android 设备,我正在尝试向其发送和接收数据。它目前被编程为回显发送的内容,所以我试图找出 Android API 来写入和读取它。

这里有一些关于我试图与之通信的硬件的详细信息: https://pastebin.com/ktyBhzE8

在测试应用中,有一个运行以下代码的按钮。

   private void DoTheThing() {
      String textMessage = "";

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

      HashMap<String, UsbDevice> deviceList = m_usbManager.getDeviceList();
      Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
      while (deviceIterator.hasNext()) {
         m_usbDevice = deviceIterator.next();
         // I know I'm expecting just one device.
      }

      textMessage += "Devices: " + deviceList.size() + "\n";

      textMessage += "Interfaces: " + m_usbDevice.getInterfaceCount() + "\n";
      for ( int i = 0; i < m_usbDevice.getInterfaceCount(); i++) {
         textMessage += "Interface " + i + ":\n";
         textMessage += "   ID: " + m_usbDevice.getInterface(i).getId() + "\n";
         textMessage += "   EP: " + m_usbDevice.getInterface(i).getEndpointCount() + "\n";

      }


      UsbEndpoint int0_ep0_out = m_usbDevice.getInterface(0).getEndpoint(0);
      UsbEndpoint int1_ep0_in  = m_usbDevice.getInterface(1).getEndpoint(0);
      UsbEndpoint int1_ep1_out = m_usbDevice.getInterface(1).getEndpoint(1);
      // I know I'm expecting two interfaces and three endpoints.

      UsbDeviceConnection usbConnection = m_usbManager.openDevice(m_usbDevice);

      byte[] message = new byte[1];
      message[0] = (byte) 0;

      int success = 0;

      try {
         success = usbConnection.bulkTransfer(int1_ep0_in, message, message.length, 0);
         textMessage += success + "\n";
      } catch (Exception e) {
         textMessage += e + "\n";
      }


      m_textView.setText(textMessage);
   }

在我尝试批量传输之前一切似乎都正常。我收到以下异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.hardware.usb.UsbDeviceConnection.bulkTransfer(android.hardware.usb.UsbEndpoint, byte[], int, int)' on a null object reference.

我对 IN 端点的引用是否无效?
UsbEndpoint int1_ep0_in = m_usbDevice.getInterface(1).getEndpoint(0);
我如何确定是否是?

我也在想办法从 USB 设备接收数据,因为我的 Feather 板应该回显它接收到的数据。我知道应该使用 bulkTransfer 之类的东西,但是如何使用?什么调用它?是否需要设置一些事件侦听器来等待特定端点上的数据?

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.hardware.usb.UsbDeviceConnection.bulkTransfer'

翻译:usbConnectionnull

您无法打开某些 USB 设备,尤其是当有其他程序(或内核本身)正在使用它时。

从你的 pastebin 片段来看,它看起来像一个 CDC 设备。您可以使用 usb-serial-for-android 库与此类设备通信