QuecPython 快速上手 ⑦:程序停不下来怎么办?中断、软复位与"救板"指南

系列导读:第 7 篇 / 共 7 篇,收官。这一篇解决的是每个 QuecPython 开发者迟早会遇到的问题——脚本把板子"锁死"了。

本篇关键词:Ctrl+C / Ctrl+D / RAW 模式 / 死循环 / main.py 自动运行


一、为什么会"停不下来"

在 PC 上跑脚本,关掉终端就结束了。在模组上不一样——脚本占用的是 REPL 这个唯一的交互通道。

一旦程序进入 while True 且没有 sleep,或者多线程把 CPU 吃满,REPL 就没有机会处理你的按键输入,于是出现:

  • 敲什么都能显示,但没反应
  • 按 Ctrl + C 也没用
  • 想看报错,结果刷屏停不下来

这时候就需要分层处理。从最轻的手段开始试,不要一上来就重烧固件。


二、官方停止方案速查表

先给完整对照表(保留官方判定逻辑)。三个条件决定用哪套方案:

main.py 含死循环 用多线程 停止步骤
✓ ✓ ✓ ① Ctrl+A 进 RAW ② Ctrl+D 重启 VM ③ Ctrl+B 回普通交互 ④ 无效则重新烧录固件
✓ ✓ ✗ ① Ctrl+C 打断 ② 无效则重新烧录固件
✓ ✗ ✓ ① Ctrl+A 进 RAW ② Ctrl+D 重启 VM ③ Ctrl+B 回普通交互 ④ 无效则耐心等待程序运行结束
✓ ✗ ✗ ① Ctrl+C 打断 ② 无效则重新烧录固件
✗ ✓ ✓ ① Ctrl+D 重启 VM ② 无效则直接重启模块
✗ ✓ ✗ ① Ctrl+D 重启 VM ② 无效则直接重启模块
✗ ✗ ✓ ① Ctrl+C 打断 ② 无效则重新烧录固件或直接重启模块
✗ ✗ ✗ ① Ctrl+C 打断 ② 无效则重新烧录固件或直接重启模块

三、把表格翻译成"人话":三步递进法

表格看着复杂,其实规律很清晰,实操时按这个顺序试就行:

第 1 招:Ctrl + C —— 打断程序

适用大多数情况。先按一下,等两秒,看 REPL 是否回到 >>> 提示符。

多线程 + 没有死循环的场景,程序本身会自己结束,Ctrl+C 之后耐心等一会儿即可。

第 2 招:Ctrl + D —— 重启 Python 虚拟机

Ctrl+C 无效时用。它会重启 QuecPython VM,把跑飞的程序强制清掉,但不重启整个模组(网络注册状态通常保留)。

非 main.py 的脚本,通常 Ctrl+C 或 Ctrl+D 二选一就能解决,不必动到固件。

第 3 招:Ctrl + A → Ctrl + D → Ctrl + B —— RAW 模式

这是对付 main.py 里带死循环的杀手锏:

  1. 按 Ctrl + A 进入 RAW 模式(此时 REPL 不再解析 Python,直接透传)
  2. 按 Ctrl + D 重启 QuecPython 虚拟机
  3. 按 Ctrl + B 回到普通交互模式

为什么必须先进 RAW?因为普通模式下 REPL 被死循环占着,Ctrl+D 的按键根本传不进 VM。RAW 模式绕过了 Python 解释器,直接和底层打交道。

第 4 招:重启模块 / 重新烧录固件

前三招都无效,说明状态已经比较异常:

  • 重启模块:断电重新上电,或按 PWRKEY 重启
  • 重新烧录固件:回到第 4 篇的流程重烧

四、main.py 为什么特别麻烦

main.py 放在 /usr/ 目录下时,模组每次启动都会自动执行它。

于是形成死循环:

写了个 while True 的 main.py → 重启 → 又自动跑起来 → 又进不去 REPL → 又得重启……

这就是俗称的"变砖"(其实没砖,只是进不去)。

破解办法:Ctrl+A 进 RAW 模式后,模组不再自动执行用户脚本,此时就能连上,把有问题的 main.py 删掉或改名,再 Ctrl+D 重启。

:warning: 预防针:往 main.py 里写循环时,一定加 utime.sleep(),并且在开发阶段先不要命名为 main.py——调试通了再改名,能省下大量救板时间。


五、写代码时就该防住的三个坑

坑 后果 正确做法
while True 里没有 sleep CPU 被打满,REPL 完全无响应,只能 RAW 救 每轮至少 utime.sleep_ms(10)
死循环里 print 刷屏 日志淹没你的按键回显,误以为卡死 打印加节流,或用变量控制
多线程没留退出条件 线程杀不掉,程序无法正常结束 用标志位控制线程生命周期,别用 while True 裸跑

六、常见问题

Q1:Ctrl + C 按了没反应,是不是板子坏了?
A:大概率是死循环占住了 REPL。直接上第 3 招:Ctrl+A → Ctrl+D → Ctrl+B。

Q2:RAW 模式是什么?会不会搞坏东西?
A:RAW 模式下 REPL 不做 Python 解析,按键直接透传底层。它是官方提供的救援通道,正常使用不会损坏设备。

Q3:Ctrl + D 和断电重启有什么区别?
A:Ctrl+D 只重启 Python 虚拟机,模组本身不断电,网络注册状态大多保留;断电重启是整机重启,更彻底但更慢。

Q4:进了 RAW 模式后敲什么都没反应?
A:正常,RAW 模式下不解析 Python。按 Ctrl + B 回到普通交互模式即可。

Q5:删不掉 main.py 怎么办?
A:在 RAW 模式下用 QPYcom 的文件页面删除;或重新烧录固件(会清空用户文件)。所以重要脚本务必在 PC 上留备份。


系列完结 · 回顾

七篇走完,你已经完成了从零到跑通第一个脚本的完整闭环:

  1. 软硬件准备与首次上电
  2. 驱动安装
  3. 开发工具选型(QPYcom + VSCode)
  4. 固件烧录
  5. REPL 调试与 Hello World 验证
  6. 开发第一个脚本与文件传输
  7. 程序停止与救援(本篇)

下一步建议:从 REPL 走向真实项目——试着用 machine 模块点一个 LED、读一次 ADC,或者用 net 模块建一次 TCP 连接。硬件抽象层用起来和 PC 上的 Python 差别不大。

有卡住的地方欢迎在楼下跟帖,附上模组型号 + 固件版本 + 报错原文,方便快速定位。