【雕爷学编程】MicroPython手册之内置模块 dupterm

在这里插入图片描述

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 函数时,请确保提供正确的输出目标,并在需要时恢复默认的输出。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132787301
今日推荐