You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查原因与解决方法

核心原因分析

  1. HC-05误进入AT指令模式:两灯常亮是HC-05的AT模式特征,说明模块未处于正常通信状态,大概率是KEY引脚被接高电平或按键触发。
  2. 波特率不匹配:Arduino设置的38400波特率与HC-05默认的9600波特率不一致,导致通信握手失败。
  3. Flutter连接逻辑重复触发:在build()中调用连接方法,会因UI重绘多次发起连接,造成连接冲突。
  4. 权限不足:Android 12+需要额外的蓝牙扫描/连接权限,仅位置权限无法满足需求。
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:32:34