mpremote是microPython的一个命令行工具,可以通过串口与microPython设备进行交互并且能对设备上的文件进行管理。
mpremote的安装
mpremote的安装有下面几种方式:
- 用pip进行安装
$ pip install --user mpremote
- 通过pipx安装
$ pipx install mpremote
mpremote的使用
最简单的用法,不带任何参数直接运行:
$ mpremote
mpremote会自动检测并连接到第一个可用的USB串口设备,并提供一个交互式终端(命令行窗口)来访问REPL和程序的输出。
注意:
串口会以独占模式打开,运行多个mpremote实例的时候,将依次连接到后续可用的串行设备。
另外,没有安装的情况下,使用pipx也可以直接mpremote:
$ pipx run mpremote ...args
举例:
命令 | 含义 |
---|---|
mpremote | 连接到第一个可用设备并隐式运行该repl命令。 |
mpremote a1 | 连接到 (Linux) 上的设备/dev/ttyACM1并运行repl命令 |
mpremote c1 | 连接到 (Windows) 上的设备COM1并运行repl命令 |
mpremote connect /dev/ttyUSB0 | 连接到/dev/ttyUSB0 ,并运行repl命令。 |
mpremote a1 ls | 连接到设备/dev/ttyACM0 ,然后运行ls命令。相当于mpremote connect /dev/ttyACM1 fs ls |
常用命令参考
命令形式
mpremote支持在命令行中给出一系列命令,这些命令会在MicroPython设备上按顺序执行。
命令的的形式:
<command name> [--options] [args...]
对于支持多个参数的命令(例如文件列表),参数列表可以+结尾。
如果不指定命令,则默认命令为repl。如果之前没有connect,则会添加隐式命令connect auto
。
为了连接后保证设备在确定的状态,连接后mpremote将停止之前运行的程序并软重启设备(repl除外)。可以使用resume和soft-reset命令控制此行为。
connect 连接到指定的设备
$ mpremote connect <device>
<device>
可以是:
list
:列出可用设备auto
:连接到第一个可用的USB串口id:<serial>
:连接带有USB序列号的设备<serial>
(connect list命令输出的第二列 )port:<path>
:使用给定路径连接到设备(connect list命令输出的第一列)rfc2217://<host>:<port>
:使用 TCP 串行连接到设备(例如基于 RFC2217 的网络串行端口)- 使用其他有效的设备名称/路径连接设备
注意:
- 除了使用connect命令之外,还有一些 针对常见设备路径的预定义快捷方式。例如,a0快捷命令相当于 (Linux),或( Windows)。
connect /dev/ttyACM0c0COM0
- auto选项仅检测USB VID/PID 的串行端口(即CDC/ACM 或FTDI 类型设备)。其他类型的串口将不会被自动检测。
disconnect 断开当前设备
$ mpremote disconnect
断开连接后,自动软重置。
resume 维护后续命令的现有解释器状态
$ mpremote resume
将禁用自动软重置。如果想运行后续命令而不进行软重置可以使用resume
命令。
举例:
mpremote resume exec "print_state_info()" soft-reset
连接到设备而不触发软重置并执行 print_state_info()功能(例如,查找有关当前程序状态的信息),然后触发软重置。
soft-reset 执行设备的软重置
$ mpremote soft-reset
清除Python堆并重启解释器。并且防止后续命令触发auto-soft-reset。
repl 进入REPL
$ mpremote repl [--options]
options的值有:
escape-non-printable
,将不可打印的字节/字符输出为其十六进制代码capture <file>
,将REPL的会话输出到指定的文件inject-code <string>
,指定当按下Ctrl-J
时要在REPL注入的字符。通常用于自动执行常用命令。inject-file <file>
,指定按下Ctrl-K
时要在REPL注入的文件。可以运行一些设置代码或处理的程序。- 命令运行时repl,可以使用
Ctrl-]
或Ctrl-x
退出。
注意:
此处的名称“REPL”反映了该命令访问 MicroPython 设备上运行的 Read Eval Print Loop 的常见用法。严格来说,该repl命令只是充当访问设备的终端(或“串行监视器”)。因为此命令不会触发自动重置行为,这意味着如果程序当前正在运行,首先需要中断它以 Ctrl-C
进入 REPL,然后允许访问程序状态。可以使用mpremote soft-reset repl
来清除所有程序状态,从而获取的“干净”REPL。
eval 计算并打印表达式的结果:
$ mpremote eval <string>
举例:
mpremote eval 1/2 eval 3/4
依次计算每个表达式并打印结果。
mpremote a0 eval 1/2 a1 eval 3/4
1/2
在设备/dev/ttyACM0执行,然后3/4
在设备/dev/ttyACM1执行,并打印结果。
exec 执行给定的代码
$ mpremote exec <string>
默认情况下,mpremote exec
将显示表达式的输出直到结束。也可以通过指定--no-follow
标志立即返回并使设备在后台运行表达式。
举例:
mpremote exec "import micropython; micropython.mem_info()"
运行指定的 Python 命令并显示输出。相当于在 REPL 提示符下键入命令。
run 从本地文件系统运行脚本
$ mpremote run <file.py>
直接从设备的RAM执行文件,而不需要把它复制到文件系统。这个方法对于单段代码的迭代开发非常有用,不用考虑部署到文件系统。
默认情况下mpremote run
显示脚本的所有输出直到其终止。如果希望命令在后台运行并立即返回,可以使用--no-follow
参数。
fs 在设备上执行文件系统命令
这个命令有点类似linux或unix常用的文件操作命令,具体如下:
$ mpremote fs <sub-command>
<sub-command>
可以是:
cat <file..>
显示设备上一个或多个文件的内容ls
列出当前目录ls <dirs...>
列出指定的目录cp [-r] <src...> <dest>
复制文件rm <src...>
删除设备上的文件mkdir <dirs...>
在设备上创建目录rmdir <dirs...>
删除设备上的目录touch <file..>
创建文件(如果它们尚不存在)
注意:
cp命令遵循安全复制协议客户端( Secure Copy Protocol client)的约定,路径前面加:
代表远程路径,路径前面没有:
则是本地路径。所有其他命令都默认路径为远程路径,但为了清楚起见,可以选择使用:
。
例如,mpremote fs cp main.py :main.py
表示把main.py
从本地当前目录复制到远程文件系统,而mpremote fs cp :main.py main.py
则表示把main.py
从设备复制到当前目录。
所有文件系统子命令都采用多个路径参数,因此如果序列中有另一个命令,则必须需要使用+
表示终止,例如:
$ mpremote fs cp main.py :main.py + repl
表示把文件复制到设备,然后进入REPL。+
防止"repl"
被解释为路径。
为了方便起见,所有文件系统的子命令可以省略fs
,如:mpremote fs cp ...
可以省略为mpremote cp ...
举例:
mpremote cp utils/driver.py :utils/driver.py + run test.py
更新设备上的utils/driver.py文件,然后在设备上执行test.py。test.py会从RAM运行,不会复制到设备的文件系统。
mpremote cp utils/driver.py :utils/driver.py + exec "import app"
更新设备上的utils/driver.py文件,然后在设备上执行 app.py。
这是一种常见的开发工作流程,更新一个文件,然后重新启动程序。设备上的 main.py 文件也会import app。
mpremote cp utils/driver.py :utils/driver.py + soft-reset repl
更新设备上的utils/driver.py文件后触发软重置,然后通过 repl 命令监控输出。
mpremote cp -r utils/ :utils/ + soft-reset repl
与上面的类似,但会先更新整个utils目录。
mpremote cat boot.py
显示设备上boot.py的内容。
mpremote cp :main.py .
将main.py从设备复制到本地目录。
mpremote cp main.py :
将本地目录的main.py复制到设备。
mpremote cp :a.py :b.py
把设备上的a.py复制到b.py。
mpremote cp -r dir/ :
将本地dir下的所有文件和文件夹复制到远程设备。
mpremote cp a.py b.py : + repl
将本地目录下的a.py和b.py复制到设备,然后运行repl。
df 查询设备可用/已用空间
$ mpremote df
df
命令打印设备文件系统的大小、已用、空闲统计信息,类似Linux的df命令。
edit 编辑设备上的文件
$ mpremote edit <files...>
edit
命令会把文件从设备复制到本地临时目录,然后启动每个文件的编辑器(由环境变量定义$EDITOR
)。如果编辑器成功退出,更新的文件将被复制回设备。
举例:
mpremote edit utils/driver.py
使用本地$EDITOR系统变量指定的编辑器编辑utils/driver.py。
mip 从micropython-lib(或 GitHub)安装软件包
$ mpremote mip install <packages...>
举例:
mpremote mip install aioble
将aioble
包从micropython-lib安装到设备。
mpremote mip install github:org/repo@branch
将GitHub上org/repo指定分支中的包安装到设备。
mpremote mip install --target /flash/third-party functools
将micropython-lib中functools包安装到设备的/flash/third-party目录。
mount 将本地目录挂载到远程设备
$ mpremote mount [options] <local-dir>
挂载后远程设备可以查看本地主机目录,就像用自己的文件系统一样。这对开发很有用,避免了在处理文件时将文件复制到设备。
设备首先安装文件系统驱动,将目录挂载在到其VFS/remote,然后使用串行连接作为mpremote侧通道来访问文件。设备将其当前工作目录(通过os.chdir)设置为 /remote,以便在挂载处于活动状态时,导入和文件访问将在此处进行,而不是默认文件系统路径。
注意:
如果mount序列中命令后面没有其他操作,则repl命令将隐式添加到序列末尾。
在使用过程中,Ctrl-D 将触发软重置,但挂载会自动重新连接。如果设备在启动时运行main.py,则无法重新挂载。在这种情况下,可以使用原始模式软重启:按 Ctrl-A Ctrl-D
重新启动,然后按Ctrl-B
返回到正常 repl,此时挂载已准备就绪。
options
选项可以是:
-l, --unsafe-links
:默认情况下,如果设备访问位于已挂载的本地目录之外(上一层或多层目录)的文件或目录,则会引发错误。此选项禁用对符号链接的检查,允许设备跟踪本地目录之外的符号链接。
举例:
mpremote mount .
将当前目录挂载到设备的/remote上,启动一个repl会话并将/remote作为当前工作目录。
mpremote mount . exec "import demo"
挂载本地当前目录并执行目录下的demo.py。
mpremote mount app run test.py
把本地的app目录挂载到设备后,运行挂载目录下的test.py,但不复制到文件系统。
mpremote mount . repl --inject-code "import demo"
挂载当前本地目录后,每次Ctrl-J按都从挂载的目录执行demo.py。
需要先按Ctrl-D重置解释器状态(保持挂载),然后再按Ctrl-J重新导入demo.py。
mpremote mount app repl --inject-file demo.py
与上面类似,每次按下Ctrl-K都会在REPL执行本地文件demo.py。同样的,需要先按Ctrl-D重置解释器。
unmount 从远程设备卸载本地目录
$ mpremote umount
虽然在mpremote终止时会自动执行卸载,但可以使用它在执行后续命令之前卸载较早的挂载。
rtc 设置/获取设备时钟 (RTC)
$ mpremote rtc
查询设备RTC的当前时间并打印日期时间元组。
$ mpremote rtc --set
将设备 RTC 设置为主机 PC 的当前时间。
sleep 睡眠(延迟)
$ mpremote sleep 0.5
暂停命令执行0.5秒,比如:可以用于等待设备执行某些操作。
reset 硬重置设备(冷启动)
$ mpremote reset
注意: 硬重置相当于machine.reset()
。
举例:
mpremote reset sleep 0.5 bootloader
硬重置设备,休眠500毫秒,然后进入引导加载程序。
bootloader 进入引导程序
$ mpremote bootloader
使设备进入其引导程序。引导程序与端口和板卡相关(例如 stm32 上的 DFU、rp2040/Pico 上的 UF2)。
自动连接和软重置
默认情况下(没指定命令),mpremote在运行时会自动连接第一个可用的USB串口设备,并且在结束时自动断开。一旦连接到设备,mpremote会自动软重置设备,清除 Python 堆并重新启动解释器,确保后续 Python 代码在新环境中执行。第一次执行以下命令时也会自动执行软重置:mount, eval, exec, run, fs
。第一次执行软重置后,就不会再自动执行,直到 disconnect
为止。自动软重置可以通过resume
命令控制。这对于使用eval
命令检查设备的状态可能会很有用。而soft-reset
命令可用于在命令序列中间执行显式软重置。
快捷方式
mpremote提供了一些命令的快捷方式,如文件系统操作命令fs
相关的操作就可以省略fs
,系统内置的命令快捷方式有:
参数 | 别名 |
---|---|
devs | connect list |
a0, a1, a2, a3 | connect /dev/ttyACMn |
u0, u1, u2, u3 | connect /dev/ttyUSBn |
c0, c1, c2, c3 | connect COMn |
cat, edit, ls, cp, rm, mkdir, rmdir, touch | fs <sub-command> |
另外,用户也可以通过配置文件自定义快捷方式,文件位于:config/mpremote/config.py
,文件中定义了一个commands
字典。字典的键是快捷方式,值是命令字符串或列表,如:
"c33": "connect id:334D335C3138"
,
执行时,命令c33
会被替换为connect id:334D335C3138
又如:
"test": ["mount", ".", "exec", "import test"]
,
执行时,命令test
会被替换为mount exec "import test"
。
快捷方式也可以接受参数。例如:
"multiply x=4 y=7": "eval x*y"
,
运行会将和设置为设备上的变量,然后计算表达式。mpremote times 3 7xyx*y
。
config.py例子:
commands = {
"c33": "connect id:334D335C3138", # 连接到指定ID的设备
"bl": "bootloader", # bootloader的短命令
"double x=4": "eval x*2", # x为参数,缺省值为 4
"wl_scan": ["exec", """
import network
wl = network.WLAN()
wl.active(1)
for ap in wl.scan():
print(ap)
""",], # 打印附近的WiFi热点
"wl_ifconfig": [
"exec",
"import network; sta_if = network.WLAN(network.STA_IF); print(sta_if.ifconfig())",
""], #打印站点接口IP地址
"test": ["mount", ".", "exec", "import test"], #挂载当前目录并执行test.py.
"demo": ["run", "path/to/demo.py"], # 在设备上执行demo.py
}