Flutter调用serialPort.open()抛出Last Error is 0异常求助
针对你遇到的调用serialPort.open()时抛出Exception: Last error is 0的问题,虽然Win32的GetLastError()返回0表示操作成功,但这通常是库的错误处理逻辑异常,或是存在隐藏的资源/权限问题,以下是具体排查和解决方向:
1. 检查串口是否被其他程序占用
Arduino的串口会被Arduino IDE的串口监视器、其他串口调试工具(如Putty、串口助手)占用,导致Flutter程序无法打开端口。务必关闭所有可能占用COM5的程序,再重新运行Flutter应用。
2. 修正库参数拼写与配置
注意serial_port_win32库的参数命名遵循Dart小驼峰规范,你代码中的BaudRate应该改为baudRate,参数名错误可能导致串口配置异常,进而触发错误处理逻辑抛出异常。同时确保串口参数与Arduino完全匹配:
- 波特率:9600(与Arduino的
Serial.begin(9600)一致) - 数据位:8(默认值,Arduino默认也是8)
- 停止位:1(默认值)
- 奇偶校验:无(默认值)
3. 以管理员权限运行Flutter程序
Windows系统下,访问部分串口设备需要管理员权限。右键点击Flutter生成的可执行文件,选择以管理员身份运行,测试是否能正常打开串口。
4. 添加串口打开延迟
Arduino Nano在USB连接后会自动重启,重启过程中串口处于不可用状态。在打开串口前添加2-3秒的延迟,等待Arduino完成初始化:
Future<void> sendData() async { final List<String> listPorts = SerialPort.getAvailablePorts(); if(listPorts.contains("COM5")) { // 等待Arduino重启完成 await Future.delayed(const Duration(seconds: 2)); final serialPort = SerialPort("COM5", openNow: false, baudRate: 9600); try { serialPort.open(); if(serialPort.isOpened) { serialPort.writeBytesFromString("HELLO"); // 等待数据发送完成再关闭端口 await Future.delayed(const Duration(milliseconds: 100)); serialPort.close(); } } catch (e, stackTrace) { print('打开串口错误: $e'); print('堆栈信息: $stackTrace'); // 确保异常时关闭端口 if(serialPort.isOpened) serialPort.close(); } } }
5. 捕获更详细的异常信息
通过try-catch包裹open()调用,打印完整的异常堆栈,获取更多错误线索,帮助定位问题根源。
6. 检查库版本与已知问题
确认你使用的serial_port_win32库是最新版本,查看库的仓库是否有类似的已解决issue,部分旧版本可能存在错误处理逻辑的bug。
额外优化建议
Arduino端的Serial.readString()默认会等待1秒超时才返回,建议在Flutter发送数据时添加换行符(如"HELLO\n"),让Arduino能更快识别完整的字符串,避免不必要的等待。
内容的提问来源于stack exchange,提问作者YF Software Development

