Arduino连接Flask API报错:无法打开COM3端口权限问题求助
解决Flask API启动时COM3端口权限错误的方案
启动Flask API时出现如下权限错误:
could not open port 'COM3': PermissionError(13, 'Odmowa dostępu.', None, 5)
(注:错误信息中“Odmowa dostępu”为波兰语,意为“拒绝访问”)
结合你提供的设备管理器信息(Arduino Uno占用COM3)、已关闭Arduino IDE的操作,可尝试以下解决方案:
1. 排查其他占用COM3的程序
- 除Arduino IDE外,串口调试助手、Putty、VS Code串口插件等工具也可能占用COM3。打开任务管理器,结束所有疑似访问串口的进程。
- 若不确定哪个进程占用,可通过命令行排查:打开CMD执行
wmic path Win32_SerialPort get DeviceID, Description确认端口关联设备,再用Process Explorer工具查找占用该端口的进程并结束。
2. 以管理员身份运行脚本
普通用户权限可能不足以访问系统串口资源,右键点击Python脚本或运行脚本的终端,选择「以管理员身份运行」后重试。
3. 检查串口设备权限与驱动
- 打开设备管理器,找到「Arduino Uno (COM3)」,右键选择「属性」→「安全」选项卡,确认当前用户拥有「读取/写入」权限,若无则添加权限并应用。
- 尝试卸载现有Arduino驱动,重新安装最新版Arduino IDE自带的驱动,确保设备被正确识别。
4. 优化代码中的串口初始化逻辑
当前代码在模块加载阶段就初始化串口,结合Flask的debug=True模式(会自动重启进程),容易导致旧进程未释放串口、新进程无法打开的问题:
- 方案一:关闭调试模式,将
app.run(debug=True)改为app.run(debug=False)测试。 - 方案二:将串口初始化移至线程内部,并添加异常处理与资源释放逻辑,示例代码如下:
from flask import Flask, render_template, jsonify import serial import threading import time app = Flask(__name__) motion_status = "Brak ruchu" arduino = None # 先初始化变量 def read_from_arduino(): global motion_status, arduino try: arduino = serial.Serial(port='COM3', baudrate=9600, timeout=.1) while True: data = arduino.readline().decode('utf-8').strip() if data: motion_status = data time.sleep(0.1) except Exception as e: print(f"串口操作错误: {e}") finally: if arduino and arduino.is_open: arduino.close() @app.route('/') def index(): return render_template('index.html') @app.route('/status') def status(): return jsonify(status=motion_status) if __name__ == '__main__': thread = threading.Thread(target=read_from_arduino) thread.daemon = True thread.start() app.run(debug=True)
5. 更换COM端口
若上述方法无效,可尝试修改Arduino的COM端口号:
- 设备管理器中右键「Arduino Uno (COM3)」→「属性」→「端口设置」→「高级」→「更改COM端口号」,选择一个未被占用的端口(如COM4)。
- 修改Python代码中
serial.Serial的port参数为新端口号,重新运行脚本。
内容的提问来源于stack exchange,提问作者Jakub Lesisz
相关产品推荐
相关产品推荐

