大家好,欢迎来到IT知识分享网。
MicroPython交互式解释器的原始模式(原始REPL)并不常用,其本意是用于对设备进行在线更新程序。实质上其与粘贴模式相似,只是关闭了字符的回显(即不像粘贴模式下可以马上直观地看到你所粘贴的代码),并且能够进行代码流控。
REPL下输入Ctrl+A可进入原始模式,之后便可在该模式下向设备发送python代码,发送完毕后再输入Ctrl+D,设备便会首先回复字符串”OK”,然后编译和执行所接收到的python代码。之后,设备会依代码执行情况返回相应输出结果或错误信息。最后,输入Ctrl+B会退出原始模式而返回REPL友好的常规工作模式。
原始粘贴(raw-paste)模式是原始REPL下的另一种工作模式,其包含了流控机制,可以对代码边接收边编译,这对于设备高速下载代码更加可靠,同时也更节省RAM资源(相较于原始模式,其无需在编译之前保留代码的完整副本)。
(注,本篇如下提到的类似b”\x05A\x01″字样为Python中的bytes类对象实例,其中,\x05即十六进制0x05,其在bytes中以\x为开头,A即为ASCII码的字符A。这属于Python中的常规表示方式,类似均可按这种规则理解)
原始粘贴模式使用如下的流控协议:
1. 输入Ctrl+A进入原始REPL模式。
2. 向设备写入如下3字节内容:b”\x05A\x01″ (实际对应Ctrl+E,字符“A”和Ctrl+A)。
3. 从设备读取2字节数据以确定其是否进入了原始粘贴模式:
4. 此时,如果设备已经进入原始粘贴模式则继续下面步骤,否则其会回退到原始REPL模式。
5. 从设备读取两字节数据,该数据为流控协议中的“窗口宽度自增值”(window-size-increment),需将其转换为16位无符号小端整数值来理解。并且应该将下面用到的“剩余窗口宽度值”(remaining-window-size)变量初始化设置为该值。
6. 向设备写入程序代码:
7. 所有代码均写入设备后,接着写入b”\x04″以指示代码传输结束。
8. 从设备读取数据,直到接收到b”\x04″。此时,设备已经接收并编译了所发送的所有代码,正在执行。
9. 设备输出所执行代码的任何结果信息。再之后,b”\x04″会首先被输出,接着为任何未被捕获的异常,再接着为b”\x04″,最后其会返回原始REPL模式然后输出b”>”。
按照该协议,若在REPL常规模式下输入如下代码:
b"\x01\x05A\x01print(123)\x04" # \x01 对应Ctrl+A \x05对应Ctrl+E
则该设备会回应大致如下内容:
b"\r\nraw REPL; CTRL-B to exit\r\n>R\x01\x80\x00\x01\x04123\r\n\x04\x04>"
而REPL的原始粘贴模式正确使用方法大致分解如下:
# Step 1: 进入原始REPL模式 write: b"\x01" read: b"\r\nraw REPL; CTRL-B to exit\r\n>" # Step 2-5: 进入原始粘贴模式 write: b"\x05A\x01" # R\x01表示进入了该模式 # \x80\x00 表示了当前"窗口宽度自增值",十进制表示为128 # \x01表示可以继续传输代码 read: b"R\x01\x80\x00\x01" # Step 6-8: 写入程序代码 write: b"print(123)\x04" read: b"\x04" # Step 9: 代码执行并读取结果 read: b"123\r\n\x04\x04>"
在本例中,“窗口宽度自增值”为128,从开始到现在总共有两个窗口宽度的数据可用,一个为从开始到该”窗口宽度自增值”所示值,一个为从显式发送b”\x01″开始到最后。因此,这意味着在等待或检查更多后续传入的带流控代码数据之前,最多可以写入256字节数据。
MicroPython源码树下tools/pyboard.py程序就使用了原始REPL模式,包括原始粘贴模式,来执行基于MicroPython运行的python代码。
注:获取及时更新,点击关注吧…
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/86550.html