做 QuecPython 项目的日常循环是:改代码 → 传到板子 → 执行 → 看日志 → 再改。用图形工具点来点去,一天要重复几百次。后来我把整个循环做成了命令行脚本(pyserial 直连 REPL 口),效率提升非常明显,分享给大家。核心是三个脚本:上传、执行、日志。
上传:REPL 逐行写文件 + base64 分块
原理很简单:通过 REPL 口把设备端当成一个“文件写入服务”,PC 端逐行发送:
打开文件:f = open('/usr/xxx.py', 'wb')
分块写入:f.write(base64.b64decode('xxxx...')) ← 每块 180 字节
关闭并校验:f.close(),然后设备端对文件算 md5
PC 端对本地文件算同样的 md5,两边一致才算上传成功——不信任“接口返回成功”,只信任哈希。速度参考:115200 波特率下,60KB 大约 1 分钟;大文件靠这个传太慢,日常只传单文件改动,整包升级走 OTA。
脚本要点:
- 开头先发 Ctrl-C,打断板上正在运行的脚本,否则 REPL 不读输入,后续全部指令石沉大海;
- 目标子目录不存在会
ENOENT,先uos.mkdir; - Git Bash 下路径以
/开头会被转换,需要加MSYS_NO_PATHCONV=1。
执行:单行直发、多行 exec 包装
单行代码(如 import uos; uos.listdir('/usr'))直接发 REPL 就行。多行逻辑需要包一层:
exec("""
你的多行代码
""")
外设探针、API 行为验证用这个方式最快——比如验证某个接口的返回值形态,从打开 QPYcom 到敲完命令,命令行只要几秒。
日志:后台线程读串口
调试期板子会不停打印日志,开一个后台脚本持续读串口、落盘、断线自动重连,比反复开图形串口工具省心。配合设备端的关键路径打点(版本号、心跳、RAM 水位),问题复现时日志是连续的。
四条硬规矩(都是踩出来的)
- 设备上脚本在跑时,REPL 不读输入。上传/执行前必须先 Ctrl-C;万一 REPL 已经卡死,走 AT 口发
AT+CFUN=1,1重启模组,约 20 秒后 REPL 恢复——这条救砖命令值得贴在显示器上。 - 同一个 REPL 会话有 sys.modules 缓存。改完
.py不复位就 import,拿到的还是旧模块。改完代码要么复位,要么先del sys.modules['xxx']。 - 成功标准是 md5 一致,不是工具不报错。
- 量产前
_main.py改名main.py——固件上电自动执行的入口是后者(调试期用下划线开头的_main.py是 QuecPython 社区惯例,避免上电抢 REPL)。
小结
这套工具链没有黑科技,就是把“打断 → 写文件 → 校验 → 执行 → 看日志”五个动作脚本化。它最大的价值不是快,而是每一次上传都有 md5 凭证、每一次执行都有连续日志——排查问题时,你需要的恰恰是这种确定性。欢迎交流各自的 QuecPython 工作流。
