MicroPython
#Python for microcontrollers
# ... #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 的 REPL 原始模式是一种类似于粘贴模式的模式,但是关闭了回显,并具有可选的流量控制。用户可以使用 Ctrl-A 键进入原始模式。然后发送 Python 代码,然后是 Ctrl-D 键。Ctrl-D 键将识别为“确定”,然后编译并执行 Python 代码。所有输出(或故障)都会发送回去。
REPL 原始模式的主要特点有:
原始模式可以用于编程用途,例如使用脚本或其他工具来与 MicroPython 交互。这样可以避免终端的回显或其他干扰,提高传输效率和准确性。
原始模式可以支持流量控制,即使用 XON/XOFF 协议来暂停或恢复数据的发送。这可以防止数据丢失或溢出,特别是在低速或不稳定的连接中。
原始模式可以在任何时候通过按 Ctrl-B 键退出,并返回到普通模式。
REPL 原始模式的应用场景有:
测试和调试:REPL 原始模式可以让用户快速地测试一些 Python 语句或函数,查看它们的运行结果和效果。用户可以从其他地方复制一些代码,并通过原始模式发送到 MicroPython 中运行,而不需要每次都保存和运行整个程序文件。
学习和探索:REPL 原始模式可以让用户实时地学习和探索 Python 语言和 MicroPython 库的特性和功能。用户可以从教程或示例中复制一些代码,并通过原始模式发送到 MicroPython 中运行,以便理解和掌握。
实验和创造:REPL 原始模式可以让用户尝试一些新的想法和创意,实现一些有趣的功能和效果。用户可以从自己或他人的代码中复制一些代码,并通过原始模式发送到 MicroPython 中运行,以便修改和优化。
REPL 原始模式需要注意的事项有:
区分模式:REPL 原始模式只在普通模式下有效,而在粘贴模式下无效。用户需要根据不同的目的和需求,选择合适的模式,并注意切换和退出的方式。不同的模式有不同的提示符和行为,用户需要注意区分和理解。
格式正确:REPL 原始模式需要用户发送正确格式的 Python 代码,才能正确地编译和执行。如果发送的代码有缩进错误或语法错误,MicroPython 会提示异常信息,并返回到普通模式。
结果及时:REPL 原始模式只会显示当前发送并执行的代码的结果,不会保存到文件或其他地方。如果用户想要保留结果,可以使用变量或函数来存储,或者将结果复制到其他地方。
以下是 MicroPython 的 REPL 原始模式的几个实际运用程序参考代码案例:
案例一:使用 math 模块计算圆周率
# 导入 math 模块
import math
# 定义一个函数,用于计算圆的周长和面积
def circle(radius):
# 计算周长,公式为 2 * pi * r
circumference = 2 * math.pi * radius
# 计算面积,公式为 pi * r * r
area = math.pi * radius * radius
# 返回周长和面积
return circumference, area
# 输入半径
r = float(input('请输入圆的半径: '))
# 调用函数,传入半径
c, a = circle(r)
# 打印结果
print('圆的周长为:', c)
print('圆的面积为:', a)
案例二:使用 machine 模块控制 LED 灯
# 导入 machine 模块
import machine
# 创建一个 Pin 对象,连接到 GPIO2 引脚,设置为输出模式
led = machine.Pin(2, machine.Pin.OUT)
# 定义一个函数,用于切换 LED 灯的状态
def toggle_led():
# 设置 Pin 对象的值为其反值
led.value(not led.value())
# 创建一个 Timer 对象,设置为周期性模式
timer = machine.Timer(-1)
# 初始化 Timer 对象,每隔 1 秒执行一次 toggle_led 函数
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=lambda t: toggle_led())
# 程序运行后,LED 灯会每隔 1 秒闪烁一次
案例三:使用 urequests 模块获取网页内容
# 导入 urequests 模块
import urequests
# 定义一个函数,用于获取网页内容
def get_web_content(url):
# 发送 GET 请求到指定的网址,返回一个 Response 对象
response = urequests.get(url)
# 检查响应的状态码是否为 200,表示成功
if response.status_code == 200:
# 打印响应的文本内容
print(response.text)
else:
# 打印响应的状态码和原因
print('Error:', response.status_code, response.reason)
# 关闭 Response 对象
response.close()
# 调用 get_web_content 函数,获取 MicroPython 官网的内容 [^1^][1]
get_web_content('http://micropython.org')
# 程序运行后,会显示类似如下的输出:
#
#
#
#
# MicroPython - Python for microcontrollers
#
#
#
#
# MicroPython
# Python for microcontrollers
# ...
#
#
#
案例四:读取二进制文件:
import sys
# 进入 raw mode
sys.stdin.raw(True)
# 读取二进制文件内容
data = sys.stdin.buffer.read()
print(data)
# 退出 raw mode
sys.stdin.raw(False)
在这个示例中,我们使用 sys.stdin.raw() 函数将 REPL 进入 raw mode。然后,我们使用 sys.stdin.buffer.read() 读取标准输入的二进制数据,并将其赋给变量 data。最后,我们打印出读取的二进制数据。在完成后,我们使用 sys.stdin.raw(False) 退出 raw mode。
案例五:发送二进制数据:
import sys
# 进入 raw mode
sys.stdout.raw(True)
# 发送二进制数据
data = b'\x01\x02\x03\x04'
sys.stdout.buffer.write(data)
sys.stdout.flush()
# 退出 raw mode
sys.stdout.raw(False)
在这个示例中,我们使用 sys.stdout.raw() 函数将 REPL 进入 raw mode。然后,我们使用 sys.stdout.buffer.write() 将二进制数据 data 发送到标准输出。为确保数据立即发送,我们调用 sys.stdout.flush()。在完成后,我们使用 sys.stdout.raw(False) 退出 raw mode。
案例六:与底层设备进行交互:
import machine
uart = machine.UART(0, 115200)
# 进入 raw mode
uart.init(115200, bits=8, parity=None, stop=1, raw=True)
# 从 UART 读取原始字节
data = uart.read(10)
print(data)
# 向 UART 发送原始字节
uart.write(b'Hello, MicroPython!')
# 退出 raw mode
uart.deinit()
在这个示例中,我们使用 MicroPython 的 machine.UART() 创建一个 UART 对象。然后,我们使用 uart.init() 方法将 UART 配置为 raw mode,指定波特率、数据位、校验位、停止位等参数。接着,我们使用 uart.read() 从 UART 读取 10 个字节的原始数据,并将其赋给变量 data。然后,我们使用 uart.write() 向 UART 发送原始字节数据。最后,我们使用 uart.deinit() 退出 raw mode。这些示例展示了 MicroPython REPL 的 raw mode 的用法。通过进入 raw mode,您可以以原始字节的形式读取和发送数据,与二进制文件、底层设备或其他需要原始数据交互的场景进行交互。请注意,raw mode 需要谨慎使用,确保您了解和处理好数据的格式和意义。
案例七:发送原始字节数据到串口:
>>> import uos
>>> fd = uos.open('/dev/uart', uos.O_RDWR)
>>> data = b'\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64' # 原始字节数据
>>> uos.write(fd, data)
在上述示例中,我们使用 uos 模块打开了串口设备文件,并将原始字节数据 b’\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64’ 发送到串口。这样可以发送任意的字节数据,而不会对其进行转义或解释。
案例八:接收和处理原始字节数据:
>>> import uos
>>> fd = uos.open('/dev/uart', uos.O_RDWR)
>>> buf = bytearray(10) # 创建一个字节缓冲区
>>> size = uos.read(fd, buf) # 从串口接收原始字节数据
>>> data = buf[:size] # 提取实际接收到的字节数据
>>> print(data)
在上述示例中,我们使用 uos 模块打开了串口设备文件,并创建了一个字节缓冲区 buf。然后,我们使用 uos.read() 函数从串口接收原始字节数据,并将实际接收到的字节数据存储在 data 变量中。最后,我们打印出接收到的字节数据。
案例九:读取二进制文件并发送原始字节数据:
>>> import uos
>>> fd_in = uos.open('input.bin', uos.O_BINARY) # 打开二进制文件进行读取
>>> fd_out = uos.open('/dev/uart', uos.O_RDWR)
>>> buf = bytearray(1024) # 创建一个字节缓冲区
>>> size = uos.read(fd_in, buf) # 从文件中读取原始字节数据
>>> uos.write(fd_out, buf[:size]) # 发送读取到的字节数据到串口
在上述示例中,我们使用 uos 模块打开了一个二进制文件 input.bin 进行读取,并打开了串口设备文件进行写入。然后,我们创建了一个字节缓冲区 buf,并使用 uos.read() 函数从文件中读取原始字节数据。最后,我们使用 uos.write() 函数将读取到的字节数据发送到串口。请注意,上述示例中使用的串口设备文件路径 /dev/uart 和二进制文件路径 input.bin 可能需要根据您的实际设备和文件路径进行调整。这些示例仅用于演示 MicroPython REPL 原始模式的用法,具体的设备和文件路径可能因设备和操作系统而异。
请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。