上一篇
安卓实现串口通信
- 行业动态
- 2025-04-21
- 4249
环境准备
- 硬件要求:
- 安卓设备需支持USB Host模式(如OTG线连接)或具备串口扩展模块。
- USB转串口设备(如FT311D、CP2102等芯片)。
- 软件依赖:
- 引入第三方库(如
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
库:
- 在
build.gradle
中添加依赖:implementation 'com.github.mjwright:usb-serial-for-android:2.9.0'
- 同步项目后,库会自动处理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:如何优化大数据传输的稳定性?
解答:
- 分块传输:将大数据拆分为固定长度的数据包(如512字节),逐包发送。
- 流量控制:接收方通过ACK机制告知发送方已接收的数据量,避免缓冲区溢出。
- 错误重传:对关键数据包添加CRC校验,若校验失败则请求重