Flutter连接HC-05模块报PlatformException错误求助
HC-05与Flutter/Arduino蓝牙连接故障排查与解决
问题描述
使用Flutter开发的移动应用尝试通过HC-05蓝牙模块与Arduino建立连接时出现以下问题:
- HC-05通电后红蓝指示灯先正常闪烁,2-3秒后蓝灯熄灭,两灯常亮不再闪烁
- Flutter应用抛出连接错误,提示
socket might closed or timeout
Flutter代码
class HomeLayout extends StatefulWidget { const HomeLayout({super.key}); @override State<HomeLayout> createState() => _HomeLayout(); } class _HomeLayout extends State<HomeLayout> { BluetoothConnection? connection; void _scanDevices() async { List<BluetoothDevice> devices = <BluetoothDevice>[]; print('scan started'); try { devices = await FlutterBluetoothSerial.instance.getBondedDevices(); } catch (ex) { print("Error: $ex"); } print('scan ended'); print(devices); for (BluetoothDevice device in devices) { print(device.address); // 打印已配对设备的MAC地址 } } Future<bool> _connectToBluetooth() async { print('\n\nConnecting to the device'); String address='my hc05 mac address'; try { connection = await BluetoothConnection.toAddress(address); } catch(ex){ print("Error : $ex"); return false; } print('Connected to the device'); return true; } void receiveData() async{ bool check = await _connectToBluetooth(); print("\n\nReceiving Data"); if(check) { List<int> _dataBuffer = <int>[]; connection!.input!.listen((Uint8List data) { setState(() { _dataBuffer.addAll(data); print("Data : " + data.toString()); }); }); } print("Received Data"); } @override Widget build(BuildContext context) { receiveData(); // ... 其余UI代码 return Container(); } }
Arduino代码
SoftwareSerial mySerial(10, 11); void setup(){ mySerial.begin(38400); } void loop(){ int sound_sensor = analogRead(A1); light_sensor = analogRead(A0); mySerial.write("light sensor : "); mySerial.write(light_sensor); mySerial.write("sound sensor : "); mySerial.write(sound_sensor); }
错误日志
PlatformException(connect_error, read failed, socket might closed or timeout, read ret: -1, java.io.IOException: read failed, socket might closed or timeout, read ret: -1 I/flutter (25783): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:845) I/flutter (25783): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:859) I/flutter (25783): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:436) I/flutter (25783): at io.github.edufolly.flutterbluetoothserial.BluetoothConnection.connect(BluetoothConnection.java:57) I/flutter (25783): at io.github.edufolly.flutterbluetoothserial.BluetoothConnection.connect(BluetoothConnection.java:64) I/flutter (25783): at io.github.edufolly.flutterbluetoothserial.FlutterBluetoothSerialPlugin$FlutterBluetoothSerialMethodCallHandler.lambda$onMethodCall$4$io-github-edufolly-flutterbluetoothserial-FlutterBluetoothSerialPlugin$FlutterBluetoothSerialMethodCallHandler(FlutterBluetoothSerialPlugin.java:1007) I/flutter (25783): at io.github.edufolly.flutterbluetoothserial.FlutterBluetoothSerialPlugin$FlutterBluetoothSerialMethodCallHandler$$ExternalSyntheticL
排查原因与解决方法
核心原因分析
- HC-05误进入AT指令模式:两灯常亮是HC-05的AT模式特征,说明模块未处于正常通信状态,大概率是KEY引脚被接高电平或按键触发。
- 波特率不匹配:Arduino设置的38400波特率与HC-05默认的9600波特率不一致,导致通信握手失败。
- Flutter连接逻辑重复触发:在
build()中调用连接方法,会因UI重绘多次发起连接,造成连接冲突。 - 权限不足:Android 12+需要额外的蓝牙扫描/连接权限,仅位置权限无法满足需求。
- Arduino数据发送错误:未声明
light_sensor变量,且用write()发送整数会传递ASCII码而非可读数字字符串。
分步解决
1. 恢复HC-05正常通信模式
- 检查HC-05的KEY引脚:正常模式下KEY引脚需接GND或悬空,避免接高电平;若使用按键触发AT模式,确保按键未卡住。
- 重新上电模块:断开电源,确认KEY引脚无高电平输入后重新通电,观察指示灯是否恢复慢闪(可配对状态)或快闪(已连接状态)。
2. 统一波特率
修改Arduino代码中的波特率为HC-05默认值9600:
mySerial.begin(9600);
若之前修改过HC-05波特率,需确保Arduino端波特率与之完全一致。
3. 修正Flutter连接逻辑
将连接逻辑移至initState(),避免重复触发:
@override void initState() { super.initState(); receiveData(); // 仅在页面初始化时执行一次连接 } @override Widget build(BuildContext context) { // 仅构建UI,不要在build中调用连接方法 return Scaffold( // ... 你的UI代码 ); }
4. 补充蓝牙权限
在android/app/src/main/AndroidManifest.xml中添加所需权限:
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12+ 新增权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
可使用permission_handler包在Flutter中动态请求这些权限。
5. 修复Arduino数据发送问题
修正变量声明与数据发送方式,确保Flutter端能接收可读数据:
SoftwareSerial mySerial(10, 11); void setup(){ mySerial.begin(9600); // 匹配HC-05波特率 } void loop(){ int sound_sensor = analogRead(A1); int light_sensor = analogRead(A0); // 声明变量 mySerial.print("light sensor : "); mySerial.println(light_sensor); // 发送数字字符串并换行 mySerial.print("sound sensor : "); mySerial.println(sound_sensor); delay(500); // 添加延迟,避免数据发送过快 }
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

