Flutter usb_serial包open()函数始终返回false问题求助
解决usb_serial: ^0.4.0 open()返回false及PS4控制器输入问题
一、open()返回false的排查与解决
从你提供的日志Control Transfer Response: -1来看,核心问题出在FTDI设备初始化阶段的控制传输失败,结合实际调试经验给出以下排查修复点:
1. 显式指定串口参数打开连接
默认调用port?.open()未传入波特率等关键参数,部分FTDI设备需要明确初始化参数才能完成握手。修改代码为:
UsbPort? port = await device.create(UsbSerial.FTDI); // 替换为你的设备实际波特率,常见值为9600/115200 bool isOpened = await port?.open(baudRate: 9600) ?? false; print(isOpened);
2. 验证USB权限与设备过滤配置
- 确认
AndroidManifest.xml中已添加必要权限:<uses-permission android:name="android.permission.USB_PERMISSION" /> <uses-feature android:name="android.hardware.usb.host" android:required="false" /> - 在
res/xml/device_filter.xml中添加FTDI设备的VID和PID(可通过Android开发者选项的USB设备信息查看):<usb-device vendor-id="1027" product-id="24577" /> <!-- 示例FTDI VID/PID,替换为你的设备实际值 --> - 打开连接前确保已获取USB权限:
bool hasPermission = await requestPermission(device); if (!hasPermission) { print("未获取USB权限"); return; } // 再执行create和open操作
3. 排查设备接口与驱动匹配
部分FTDI设备可能包含多个USB接口,尝试指定接口索引创建端口:
// 可通过device.interfaces查看接口列表,假设串口接口索引为0 UsbPort? port = await device.create(UsbSerial.FTDI, interfaceIndex: 0);
如果更换设备后问题依旧,尝试切换驱动类型(比如针对非FTDI设备用UsbSerial.CH34x等),确认是否为驱动兼容性问题。
二、PS4控制器输入无法接收的问题
PS4控制器属于HID(人机接口设备),而非串口设备,usb_serial包仅支持串口协议的USB设备,因此无法通过inputStream接收其输入。需要使用HID专用的Flutter方案处理:比如直接调用Android原生HID API,或使用适配HID的第三方插件,通过解析HID报告描述符来读取控制器的输入数据。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

