安卓设备实现串口通信需依赖硬件支持(如OTG接口)及驱动适配,常见场景包括:
<uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" />
注:Android 6.0+需动态申请USB权限,Android 11+需引导用户手动授权
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> devices = manager.getDeviceList(); // 遍历查找指定VID/PID的设备 for (UsbDevice device : devices.values()) { if (device.getVendorId() == 0x1A86 && device.getProductId() == 0x7523) { // 请求权限 PendingIntent intent = ...; manager.requestPermission(device, intent); } }
库名 | 特点 | 适用场景 |
---|---|---|
USB-Serial-For-Android | MIT协议/支持多厂商芯片 | 通用USB转串口设备 |
PL2303_Driver | 专用于Prolific PL2303芯片 | PL2303设备 |
CH34X_UART_Driver | 支持WCH CH340/CH341芯片 | CH34X系列设备 |
// 初始化驱动 UsbSerialInterface usbSerial = UsbSerial.createUsbSerialInterface(device, connection); // 配置串口参数 usbSerial.setBaudRate(9600); usbSerial.setDataBits(UsbSerialInterface.DATA_BITS_8); usbSerial.setStopBits(UsbSerialInterface.STOP_BITS_1); usbSerial.setParity(UsbSerialInterface.PARITY_NONE); usbSerial.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); // 打开串口 usbSerial.open(); // 读写数据 byte[] buffer = new byte[64]; int readLen = usbSerial.syncRead(buffer, timeout); // 同步读取 usbSerial.write(data, timeout); // 写入数据 // 关闭资源 usbSerial.close();
建议使用AsyncTask
或HandlerThread
处理串口读写,避免阻塞主线程:
new Thread(() -> { while (isRunning) { int len = usbSerial.read(buffer, 1000); if (len > 0) { handler.post(() -> processData(buffer)); // 切换到主线程处理UI } } }).start();
现象 | 原因分析 | 解决方案 |
---|---|---|
无法获取设备列表 | USB权限未授予/OTG线质量问题 | 检查 |
读写数据出现乱码 | 波特率/校验位配置不匹配 | 核对设备串口参数 |
连接后立即断开 | 设备供电不足/驱动不兼容 | 外接独立供电,更换驱动库 |
Android 11+权限申请失败 | 新权限模型限制 | 引导用户手动授权(设置->USB设置) |
特性 | USB转串口 | 蓝牙串口(BluetoothSPP) |
---|---|---|
传输速率 | 可达数Mbps(视USB版本) | lt;3Mbps |
连接稳定性 | 高(有线连接) | 易受干扰 |
功耗 | 较高(USB设备供电) | 较低 |
适配难度 | 需处理驱动兼容性 | 需处理配对/重连机制 |
典型应用场景 | 工业控制/调试开发板 | 移动设备远程通信 |
Q1:Android 11+系统USB权限申请失败如何处理?
A1:需执行以下步骤:
manager.requestPermission(device, pendingIntent)
后,会弹出系统授权窗口android:exported="true"
且包名与签名一致Q2:如何验证串口参数配置正确性?
A2:可通过以下方法排查: