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
相关产品推荐
相关产品推荐

