系列导读:第 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 里带死循环的杀手锏:
- 按
Ctrl + A进入 RAW 模式(此时 REPL 不再解析 Python,直接透传) - 按
Ctrl + D重启 QuecPython 虚拟机 - 按
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 重启。
预防针:往
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 上留备份。
系列完结 · 回顾
七篇走完,你已经完成了从零到跑通第一个脚本的完整闭环:
- 软硬件准备与首次上电
- 驱动安装
- 开发工具选型(QPYcom + VSCode)
- 固件烧录
- REPL 调试与 Hello World 验证
- 开发第一个脚本与文件传输
- 程序停止与救援(本篇)
下一步建议:从 REPL 走向真实项目——试着用 machine 模块点一个 LED、读一次 ADC,或者用 net 模块建一次 TCP 连接。硬件抽象层用起来和 PC 上的 Python 差别不大。
有卡住的地方欢迎在楼下跟帖,附上模组型号 + 固件版本 + 报错原文,方便快速定位。