USB-Serial-For-Android
)。libusb
实现底层通信。在AndroidManifest.xml
中声明以下权限:
<uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" />
若使用USB-Serial-For-Android
库:
build.gradle
中添加依赖: implementation 'com.github.mjwright:usb-serial-for-android:2.9.0'
// 获取所有连接的USB设备 UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); // 遍历设备,匹配目标串口设备(如Vendor ID和Product ID) for (UsbDevice device : deviceList.values()) { if (device.getVendorId() == 0x0403 && device.getProductId() == 0x6001) { // 例:FT311D设备 // 请求权限 PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); usbManager.requestPermission(device, permissionIntent); } }
// 通过USB设备构建串口实例 UsbSerialDevice serialPort = UsbSerialDevice.createUsbSerialDevice(device); try { serialPort.open(); // 默认波特率(可配置) serialPort.setParameters(9600, 8, UsbSerialDevice.STOPBITS_1, UsbSerialDevice.PARITY_NONE); } catch (IOException e) { e.printStackTrace(); }
// 发送数据 byte[] writeBuffer = "Hello Serial".getBytes(); serialPort.write(writeBuffer, 1000); // 超时时间1秒 // 接收数据(异步) serialPort.read(new UsbSerialInterface.UsbReadCallback() { @Override public void onReceivedData(byte[] arg0) { String received = new String(arg0); Log.d("Serial", "Received: " + received); } });
serialPort.close();
通信方式 | 硬件要求 | 性能 | 适用场景 |
---|---|---|---|
USB转串口 | OTG线+USB转串口模块 | 高(USB 2.0) | 调试、工业控制 |
蓝牙串口(SPP) | 蓝牙模块(如HC-05) | 中等(约1Mbps) | 移动设备、短距离传输 |
WiFi串口 | ESP8266/ESP32模块 | 高(约10Mbps) | 远程监控、物联网 |
原因:未声明USB_PERMISSION
权限或设备未匹配。
解决:
AndroidManifest.xml
中的权限声明。ACTION_USB_PERMISSION
广播被正确处理。原因:数据分包或缓冲区未及时处理。
解决:
解答:
需根据设备协议解析数据包,HID设备可通过UsbHidDevice
类读取报告描述符,并解析输入/输出报告,推荐使用javax.usb
库或第三方库(如usb4java
)简化开发。
解答: