当前位置:首页 > 行业动态 > 正文

安卓开发串口通信

安卓串口通信基础

安卓设备实现串口通信需依赖硬件支持(如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();

异步通信处理

建议使用AsyncTaskHandlerThread处理串口读写,避免阻塞主线程:

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:需执行以下步骤:

安卓开发串口通信

  1. 调用manager.requestPermission(device, pendingIntent)后,会弹出系统授权窗口
  2. 若用户误拒,需引导至「设置->应用->特殊权限->USB调试」手动授权
  3. 确保manifest声明android:exported="true"且包名与签名一致

Q2:如何验证串口参数配置正确性?
A2:可通过以下方法排查:

  1. 使用串口调试工具(如SecureCRT)测试相同参数能否通信
  2. 打印设备发送的原始数据(如ETX字符)判断编码格式
  3. 尝试标准参数组合(如9600-8-N-1)进行基准