React Native安卓端访问SerialPort串口对接硬件板问题求助
React Native安卓串口通信问题解决方案
前置配置修正
缺少安卓原生侧配置是无法识别设备的核心原因,需先完成以下配置:
- 给
AndroidManifest.xml添加对应权限和意图过滤器:
<uses-permission android:name="android.permission.USB_PERMISSION" /> <uses-feature android:name="android.hardware.usb.host" android:required="true" /> <activity ...> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity>
- 在
res/xml目录下新建device_filter.xml,添加你硬件板对应的USB厂商ID(VID)和产品ID(PID),示例:
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1234" product-id="5678" /> <!-- 可添加多个需要适配的设备ID --> </resources>
代码逻辑修正
原有代码存在API调用、数据格式两个核心错误,修正后的可运行示例如下:
import SerialPortAPI from 'react-native-serial-port-api'; import { Buffer } from 'buffer'; // 1. 正确获取设备路径 const getDeviceList = async () => { // 该方法支持直接await返回结果,不需要同时传回调 const paths = await SerialPortAPI.devicePaths(); console.log("已连接串口设备路径:", paths); return paths; } // 2. 正确连接、读写串口 let serialPort = null; const connectDevice = async (cfg) => { try { const { baudRate, serialPortName, stopBits = 1, parity = 0, dataBits = 8 } = cfg; // 打开串口前先确认设备路径存在、已经获取USB权限 serialPort = await SerialPortAPI.open(serialPortName, { baudRate, stopBits, parity, dataBits }); // 监听数据接收 serialPort.onReceived(buff => { const hexStr = buff.toString('hex').toUpperCase(); console.log("收到串口数据:", hexStr); }); // 发送十六进制数据要先转成Buffer,不能直接发字符串 const sendData = Buffer.from('A7B7', 'hex'); await serialPort.send(sendData); console.log("数据发送成功"); } catch (e) { console.error("串口操作失败:", e); } } // 3. 用完要关闭串口释放资源 const closeSerialPort = async () => { if (serialPort) { await serialPort.close(); serialPort = null; } }
其他排查思路
- 如果还是无法识别设备,先确认你的安卓设备支持OTG功能,且已经开启OTG开关
- 确认你的USB转串口芯片属于常见的FTDI、CH34x、CP210x系列,部分冷门芯片开源包默认没有适配
- 如果上述包都无法满足需求,可以选择针对安卓高版本适配的专用串口包,适配Android 10+的权限规则
内容的提问来源于stack exchange,提问作者Raghu Vallikkat
相关产品推荐
相关产品推荐

