如何使用 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'
翻译:usbConnection
是 null
。
您无法打开某些 USB 设备,尤其是当有其他程序(或内核本身)正在使用它时。
从你的 pastebin 片段来看,它看起来像一个 CDC 设备。您可以使用 usb-serial-for-android 库与此类设备通信
我这里有一个 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'
翻译:usbConnection
是 null
。
您无法打开某些 USB 设备,尤其是当有其他程序(或内核本身)正在使用它时。
从你的 pastebin 片段来看,它看起来像一个 CDC 设备。您可以使用 usb-serial-for-android 库与此类设备通信