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

安卓实现串口通信

环境准备

  1. 硬件要求
    • 安卓设备需支持USB Host模式(如OTG线连接)或具备串口扩展模块。
    • USB转串口设备(如FT311D、CP2102等芯片)。
  2. 软件依赖
    • 引入第三方库(如USB-Serial-For-Android)。
    • 或通过JNI调用libusb实现底层通信。

权限配置

AndroidManifest.xml中声明以下权限:

<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION" />

依赖引入

若使用USB-Serial-For-Android库:

安卓实现串口通信

  1. build.gradle中添加依赖:
    implementation 'com.github.mjwright:usb-serial-for-android:2.9.0'
  2. 同步项目后,库会自动处理USB设备枚举和串口操作。

代码实现

检测USB设备

// 获取所有连接的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) 远程监控、物联网

常见问题与解决

问题1:USB权限被拒绝

原因:未声明USB_PERMISSION权限或设备未匹配。
解决

  • 检查AndroidManifest.xml中的权限声明。
  • 确保ACTION_USB_PERMISSION广播被正确处理。

问题2:数据接收不完整

原因:数据分包或缓冲区未及时处理。
解决

安卓实现串口通信

  • 设置合适的读超时时间。
  • 在回调中拼接多次接收的数据,或添加校验(如CRC)。

相关问题与解答

问题1:如何支持其他类型的USB设备(如HID设备)?

解答
需根据设备协议解析数据包,HID设备可通过UsbHidDevice类读取报告描述符,并解析输入/输出报告,推荐使用javax.usb库或第三方库(如usb4java)简化开发。

问题2:如何优化大数据传输的稳定性?

解答

安卓实现串口通信

  1. 分块传输:将大数据拆分为固定长度的数据包(如512字节),逐包发送。
  2. 流量控制:接收方通过ACK机制告知发送方已接收的数据量,避免缓冲区溢出。
  3. 错误重传:对关键数据包添加CRC校验,若校验失败则请求重