上一篇
安卓开发串口通信
- 行业动态
- 2025-04-22
- 4
安卓串口通信基础
安卓设备实现串口通信需依赖硬件支持(如OTG接口)及驱动适配,常见场景包括:
- 连接USB转串口设备(如CH340/PL2303芯片)
- 通过RS232/RS485接口与工业设备通信
- 调试嵌入式开发板(如树莓派、STM32等)
实现步骤与关键技术点
权限配置
<uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" />
注:Android 6.0+需动态申请USB权限,Android 11+需引导用户手动授权
USB设备枚举
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系列设备 |
核心代码示例(基于USB-Serial-For-Android)
// 初始化驱动 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)
后,会弹出系统授权窗口 - 若用户误拒,需引导至「设置->应用->特殊权限->USB调试」手动授权
- 确保manifest声明
android:exported="true"
且包名与签名一致
Q2:如何验证串口参数配置正确性?
A2:可通过以下方法排查:
- 使用串口调试工具(如SecureCRT)测试相同参数能否通信
- 打印设备发送的原始数据(如ETX字符)判断编码格式
- 尝试标准参数组合(如9600-8-N-1)进行基准