MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。
MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。
MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。
使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。
总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
MicroPython的内置模块os提供了一些基本的操作系统服务,包括文件系统的访问和管理。其中,os.dupterm(stream_object, index=0, /)是一个用于复制或切换MicroPython终端(即REPL)的函数。它的主要特点、应用场景,以及需注意事项如下:
主要特点:os.dupterm(stream_object, index=0, /)接受两个参数:stream_object是一个类似于流的对象,用于接收和发送终端的输入和输出1;index是一个可选的整数,表示要复制或切换的终端的索引,目前只支持0和1。如果stream_object是None,则取消之前设置的重定向。os.dupterm(stream_object, index=0, /)返回之前设置的流对象,或者None。
应用场景:os.dupterm(stream_object, index=0, /)可以用于在不同的设备或通道上复制或切换MicroPython终端。例如,可以用os.dupterm(stream_object, index=0, /)将终端从串口重定向到网络,或者将终端从网络复制到显示器等。
需注意事项:在使用os.dupterm(stream_object, index=0, /)之前,需要导入该模块,使用import os语句。在使用os.dupterm(stream_object, index=0, /)时,需要注意给定的流对象必须实现readinto()和write()方法。另外,os.dupterm(stream_object, index=0, /)在不同的平台上可能有不同的实现和支持。因此,在使用os.dupterm(stream_object, index=0, /)时,最好先检查平台的特性和限制。
以下是MicroPython的内置模块os.dupterm(stream_object, index=0, /)的三个实际运用程序案例:
案例一:在MicroPython板子上将终端从串口重定向到网络,并使用WebREPL进行交互。代码如下:
import os
import network
import webrepl
# 连接到无线网络(假设SSID为'MyNet',密码为'12345678')
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('MyNet', '12345678')
# 等待连接成功
while not wlan.isconnected():
pass
# 启动WebREPL服务(假设密码为'micropythoN')
webrepl.start(password='micropythoN')
# 获取WebREPL的流对象
webrepl_stream = webrepl.websocket
# 将终端从串口重定向到网络
os.dupterm(webrepl_stream)
案例二:在MicroPython板子上将终端从网络复制到显示器,并使用LCD显示器显示输入和输出。代码如下:
import os
import network
import webrepl
import lcd160cr
# 连接到无线网络(假设SSID为'MyNet',密码为'12345678')
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('MyNet', '12345678')
# 等待连接成功
while not wlan.isconnected():
pass
# 启动WebREPL服务(假设密码为'micropythoN')
webrepl.start(password='micropythoN')
# 获取WebREPL的流对象
webrepl_stream = webrepl.websocket
# 创建一个LCD显示器对象(假设SPI总线为1,片选引脚为15)
lcd = lcd160cr.LCD160CR('X', spi=1, cs=15)
# 创建一个类似于流的对象,用于将数据写入到LCD显示器上
class LCDStream:
# 定义初始化方法
def __init__(self, lcd):
# 保存LCD显示器对象
self.lcd = lcd
# 设置LCD显示器的字体和颜色
self.lcd.set_font(1)
self.lcd.set_text_color(lcd.rgb(255, 255, 255), lcd.rgb(0, 0, 0))
# 初始化LCD显示器的光标位置
self.x = 0
self.y = 0
# 定义写入方法
def write(self, data):
# 遍历数据中的每个字节
for b in data:
# 如果字节是换行符
if b == 10:
# 更新光标的y坐标
self.y += 16
# 如果y坐标超出LCD显示器的高度
if self.y >= self.lcd.h:
# 将LCD显示器的内容向上滚动16像素
self.lcd.scroll(0, -16)
# 将y坐标减去16
self.y -= 16
# 将光标的x坐标重置为0
self.x = 0
# 如果字节是回车符
elif b == 13:
# 忽略该字节
pass
# 其他情况
else:
# 在LCD显示器上显示该字节对应的字符
self.lcd.write(chr(b), self.x, self.y)
# 更新光标的x坐标
self.x += 8
# 如果x坐标超出LCD显示器的宽度
if self.x >= self.lcd.w:
# 将x坐标重置为0,并换行
self.x = 0
self.y += 16
# 创建一个LCD流对象
lcd_stream = LCDStream(lcd)
# 将终端从网络复制到显示器(使用索引1)
os.dupterm(lcd_stream, 1)
案例三:在MicroPython板子上定义一个函数,用于在控制台输入一个命令并执行,如果命令是’dupterm’,则调用os.dupterm(stream_object, index=0, /)复制或切换终端。代码如下:
import os
# 定义一个函数,用于在控制台输入一个命令并执行
def run_command():
# 获取用户输入的命令
cmd = input('Enter a command: ')
# 如果命令是'dupterm'
if cmd.startswith('dupterm'):
# 分割命令和参数
args = cmd.split()
# 如果参数个数为1或2
if len(args) in (1, 2):
# 获取要复制或切换终端的流对象(假设已经定义了一个名为'stream_object'的变量)
stream_object = stream_object
# 获取要复制或切换终端的索引(默认为0)
index = int(args[1]) if len(args) == 2 else 0
# 尝试复制或切换终端,并捕获异常
try:
# 复制或切换终端,并获取之前设置的流对象
old_stream_object = os.dupterm(stream_object, index)
# 打印复制或切换成功信息,以及之前设置的流对象(如果有)
print('Terminal duplicated or switched on', stream_object, 'with index', index)
if old_stream_object is not None:
print('Previous stream object was', old_stream_object)
except OSError as e:
# 打印异常信息
print('Failed to duplicate or switch terminal on', stream_object, 'with index', index, ':', e)
# 如果参数个数为3,并且第二个参数是'None'
elif len(args) == 3 and args[1] == 'None':
# 获取要取消重定向的终端的索引(默认为0)
index = int(args[2]) if len(args) == 2 else 0
# 尝试取消重定向,并捕获异常
try:
# 取消重定向,并获取之前设置的流对象(如果有)
old_stream_object = os.dupterm(None, index)
# 打印取消重定向成功信息,以及之前设置的流对象(如果有)
print('Terminal redirection cancelled on index', index)
if old_stream_object is not None:
print('Previous stream object was', old_stream_object)
except OSError as e:
# 打印异常信息
print('Failed to cancel terminal redirection on index', index, ':', e)
# 如果参数个数大于3
else:
# 打印多余参数信息
print('Too many arguments')
# 如果命令是'exit'
elif cmd == 'exit':
# 退出函数
return
# 其他情况
else:
# 尝试执行命令,并捕获异常
try:
exec(cmd)
except Exception as e:
# 打印异常信息
print(e)
# 递归调用函数
run_command()
案例四:重定向输出到串口:
import machine
import uos
import dupterm
# 初始化串口
uart = machine.UART(0, baudrate=115200)
# 将输出重定向到串口
dupterm.setdupterm(uart)
# 打印一些信息
print("Hello, MicroPython!")
# 恢复原始输出
dupterm.setdupterm(uos.dupterm(None))
在这个例子中,我们使用machine模块的UART类初始化串口,然后使用dupterm模块的setdupterm函数将输出重定向到串口。接下来,我们使用print函数打印一些信息到串口。最后,我们使用uos模块的dupterm函数将输出恢复到原始状态。通过使用dupterm模块,我们可以将输出从默认的终端重定向到其他设备,如串口。
案例五:重定向输出到文件:
import uos
import dupterm
# 打开文件进行写入
file = open("output.txt", "w")
# 将输出重定向到文件
dupterm.setdupterm(file)
# 打印一些信息
print("Hello, MicroPython!")
# 恢复原始输出
dupterm.setdupterm(uos.dupterm(None))
# 关闭文件
file.close()
在这个例子中,我们使用open函数打开一个文件用于写入,然后使用dupterm模块的setdupterm函数将输出重定向到该文件。接下来,我们使用print函数将一些信息打印到文件中。最后,我们使用uos模块的dupterm函数将输出恢复到原始状态,并关闭文件。通过使用dupterm模块,我们可以将输出重定向到文件,方便保存和记录程序的输出信息。
案例六:重定向输入到串口:
import machine
import uos
import dupterm
# 初始化串口
uart = machine.UART(0, baudrate=115200)
# 将输入重定向到串口
dupterm.setdupterm(uart)
# 接收用户输入
user_input = input("Enter your name: ")
# 恢复原始输入
dupterm.setdupterm(uos.dupterm(None))
# 处理用户输入
print("Hello, " + user_input + "!")
在这个例子中,我们使用machine模块的UART类初始化串口,然后使用dupterm模块的setdupterm函数将输入重定向到串口。接下来,我们使用input函数接收用户输入,用户可以在串口输入框中输入自己的名字。然后,我们使用uos模块的dupterm函数将输入恢复到原始状态。最后,我们处理用户输入并打印出相应的问候语。通过使用dupterm模块,我们可以将输入从默认的终端重定向到其他设备,如串口。
案例七:将 REPL 输出重定向到文件
import uos
# 打开文件 "output.txt" 并将其作为 REPL 输出的重定向
with open("output.txt", "w") as file:
uos.dupterm(file)
# 在 REPL 中执行代码,输出将会写入文件 "output.txt"
在这个例子中,我们使用 open 函数打开文件 “output.txt”,然后使用 dupterm 函数将该文件作为 REPL 的输出重定向。当在 REPL 中执行代码时,输出将会被写入到文件 “output.txt” 中,而不是在终端上显示。
案例八:将 REPL 输出重定向到串口
import uos
from machine import UART
# 初始化串口对象
uart = UART(0, 115200)
# 将串口对象作为 REPL 输出的重定向
uos.dupterm(uart)
# 在 REPL 中执行代码,输出将会通过串口发送
在这个例子中,我们通过 machine 模块初始化了一个串口对象 uart,然后使用 dupterm 函数将该串口对象作为 REPL 的输出重定向。这样,在 REPL 中执行代码时,输出将会通过串口发送,而不是在终端上显示。
案例九: 恢复默认的 REPL 输出
import uos
# 恢复默认的 REPL 输出
uos.dupterm(None)
# 在 REPL 中执行代码,输出将会在终端上显示
在这个例子中,我们使用 dupterm 函数将 REPL 的输出重定向设置为 None,即恢复默认的输出。这样,在 REPL 中执行代码时,输出将会在终端上显示,而不会被重定向到其他地方。
这些案例展示了 uos 模块中的 dupterm 函数的实际应用,包括将 REPL 输出重定向到文件、将 REPL 输出重定向到串口以及恢复默认的 REPL 输出。通过使用 dupterm 函数,你可以在 MicroPython 设备上灵活地配置 REPL 的输出重定向,以适应不同的需求和场景。请注意,在使用 dupterm 函数时,请确保提供正确的输出目标,并在需要时恢复默认的输出。