[Diaoye가 프로그래밍을 배운다] MicroPython 매뉴얼의 내장 모듈 dupterm

여기에 이미지 설명을 삽입하세요.

MicroPython은 임베디드 시스템에서 Python 3 프로그래밍 언어를 실행하도록 설계된 경량 버전의 인터프리터입니다. 일반 Python에 비해 MicroPython 인터프리터는 크기가 작고(100KB 정도) 바이너리 실행 파일로 컴파일되어 실행되므로 실행 효율성이 더 높습니다. 이는 경량 가비지 수집 메커니즘을 사용하고 리소스가 제한된 마이크로 컨트롤러를 수용하기 위해 대부분의 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. 프로그래밍 가능한 작은 하드웨어 프로젝트를 만드십시오.
3. 교육 도구로서 초보자가 Python 및 IoT 프로그래밍을 배울 수 있도록 도와줍니다.
4. 고급 제어 및 클라우드 연결을 달성하기 위해 스마트 장치 펌웨어를 구축합니다.
5. 사물 인터넷, 임베디드 인텔리전스, 로봇 등과 같은 다양한 마이크로 컨트롤러 애플리케이션

MicroPython을 사용할 때 다음 사항에 주의하세요.
1. 메모리와 플래시 공간이 제한되어 있습니다.
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, /)의 세 가지 실제 적용 사례입니다.

사례 1: 터미널을 직렬 포트에서 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)

사례 2: 네트워크의 터미널을 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)

사례 3: 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()

사례 4: 출력을 직렬 포트로 리디렉션:

import machine
import uos
import dupterm

# 初始化串口
uart = machine.UART(0, baudrate=115200)

# 将输出重定向到串口
dupterm.setdupterm(uart)

# 打印一些信息
print("Hello, MicroPython!")

# 恢复原始输出
dupterm.setdupterm(uos.dupterm(None))

이 예에서는 기계 모듈의 UART 클래스를 사용하여 직렬 포트를 초기화한 다음 dupterm 모듈의 setdupterm 함수를 사용하여 출력을 직렬 포트로 리디렉션합니다. 다음으로 인쇄 기능을 사용하여 일부 정보를 직렬 포트에 인쇄합니다. 마지막으로 uos 모듈의 dupterm 함수를 사용하여 출력을 원래 상태로 복원합니다. dupterm 모듈을 사용하면 기본 터미널에서 직렬 포트와 같은 다른 장치로 출력을 리디렉션할 수 있습니다.

사례 5: 출력을 파일로 리디렉션:

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 함수를 사용하여 출력을 파일로 리디렉션합니다. 다음으로 인쇄 기능을 사용하여 일부 정보를 파일로 인쇄합니다. 마지막으로 uos 모듈의 dupterm 함수를 사용하여 출력을 원래 상태로 복원하고 파일을 닫습니다. dupterm 모듈을 사용하면 출력을 파일로 리디렉션하여 프로그램의 출력 정보를 쉽게 저장하고 기록할 수 있습니다.

사례 6: 입력을 직렬 포트로 리디렉션:

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 + "!")

이 예에서는 기계 모듈의 UART 클래스를 사용하여 직렬 포트를 초기화한 다음 dupterm 모듈의 setdupterm 함수를 사용하여 입력을 직렬 포트로 리디렉션합니다. 다음으로 입력 함수를 사용하여 사용자 입력을 받으며, 사용자는 직렬 포트 입력 상자에 자신의 이름을 입력할 수 있습니다. 그런 다음 uos 모듈의 dupterm 기능을 사용하여 입력을 원래 상태로 복원합니다. 마지막으로 사용자 입력을 처리하고 해당 인사말을 인쇄합니다. dupterm 모듈을 사용하면 기본 터미널에서 직렬 포트와 같은 다른 장치로 입력을 리디렉션할 수 있습니다.

사례 7: 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" 파일에 기록됩니다.

사례 8: REPL 출력을 직렬 포트로 리디렉션

import uos
from machine import UART

# 初始化串口对象
uart = UART(0, 115200)

# 将串口对象作为 REPL 输出的重定向
uos.dupterm(uart)

# 在 REPL 中执行代码,输出将会通过串口发送

이 예에서는 기계 모듈을 통해 직렬 포트 개체 uart를 초기화한 다음 dupterm 함수를 사용하여 직렬 포트 개체를 REPL의 출력으로 리디렉션합니다. 이렇게 하면 REPL에서 코드가 실행될 때 출력이 터미널에 표시되는 대신 직렬 포트를 통해 전송됩니다.

사례 9: 기본 REPL 출력 복원

import uos

# 恢复默认的 REPL 输出
uos.dupterm(None)

# 在 REPL 中执行代码,输出将会在终端上显示

이 예에서는 dupterm 함수를 사용하여 REPL의 출력 리디렉션을 None으로 설정하여 기본 출력을 복원합니다. 이렇게 하면 REPL에서 코드가 실행될 때 출력이 터미널에 표시되고 다른 곳으로 리디렉션되지 않습니다.

이러한 사례에서는 REPL 출력을 파일로 리디렉션하고, REPL 출력을 직렬 포트로 리디렉션하고, 기본 REPL 출력을 복원하는 등 uos 모듈에서 dupterm 기능을 실제로 적용하는 방법을 보여줍니다. dupterm 기능을 사용하면 MicroPython 장치에서 REPL의 출력 리디렉션을 유연하게 구성하여 다양한 요구 사항과 시나리오에 적응할 수 있습니다. dupterm 함수를 사용할 때는 올바른 출력 대상을 제공하고 필요한 경우 기본 출력을 복원해야 합니다.

여기에 이미지 설명을 삽입하세요.

Supongo que te gusta

Origin blog.csdn.net/weixin_41659040/article/details/132787301
Recomendado
Clasificación