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

Windows下使用flutter_libserialport读取ESP32串口返回空值如何解决?

Flutter桌面应用使用flutter_libserialport读取ESP32串口全为0的解决方法

问题描述

开发Flutter桌面应用时,使用flutter_libserialport包读取ESP32开发板串口输入,出现读取结果异常:使用SerialPortReader流仅返回[0],调用port.read(buffer)则得到一串[0,0,0,...]。目前仅有的可行方案是先通过Arduino IDE串口监视器或pyserial脚本读取端口,关闭连接后再在应用中读取。

代码示例

void startListening() {
  if(_selected?.isOpen == true){
    print("selection was open. Closed successful = ${_selected?.close()}");
  }
  _selected?.config = SerialPortConfig()..baudRate = 9600;

  if(_selected?.open(mode: 3) != true){

    print("=============> Something went wrong");
    print(_selected == null ? "selected is null": SerialPort.lastError);

  } else {

    // final data = await _selected?.read(128, timeout: 200);
    // print("=======> data");
    // print(String.fromCharCodes(data!));
    // _selected?.close();

    final reader = SerialPortReader(_selected!);
    reader.stream.listen((event) {

      print("============> onData: ${_selected?.name}");
      print("$event => ${String.fromCharCodes(event)}");

    }, onError: (error, stackTrace){

      print("error: $error");
      print("stackTrace: $stackTrace");

    }, onDone: (){
      _selected!.close();
    },);
  }
}

示例输出

示例输出截图

问题根源与解决方案

问题根源

ESP32的串口在建立连接时需要DTR/RTS信号触发复位,flutter_libserialport默认未正确配置这类流控制信号,导致ESP32无法进入正常的串口发送状态。而Arduino IDE或pyserial在连接时会自动发送DTR信号复位ESP32,因此后续应用能正常读取数据。

解决步骤

  • 完善串口基础配置
    确保串口参数与ESP32默认设置一致(8数据位、1停止位、无校验),补充配置代码:

    _selected?.config = SerialPortConfig()
      ..baudRate = 9600
      ..bits = 8
      ..stopBits = 1
      ..parity = SerialPortParity.none
      ..setFlowControl(SerialPortFlowControl.none);
    
  • 手动触发DTR复位信号
    打开串口后,模拟Arduino IDE的复位流程,手动切换DTR信号:

    // 打开串口成功后添加以下代码
    _selected?.setDtr(false);
    await Future.delayed(Duration(milliseconds: 100));
    _selected?.setDtr(true);
    

    这段代码会触发ESP32复位,使其重新启动并开始发送串口数据。

  • 明确串口打开模式
    将代码中的mode: 3替换为枚举值,提高可读性并避免歧义:

    if(_selected?.open(mode: SerialPortMode.readWrite) != true) {
      // 错误处理逻辑
    }
    
  • 检查串口权限
    桌面平台(Linux/macOS)需确保应用拥有访问目标串口设备的权限,可通过修改设备权限或使用sudo运行应用测试。

内容的提问来源于stack exchange,提问作者Abdul-Mateen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:10:31