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的内置模块uerrno是一个提供对OSError异常的符号错误代码的访问的模块。它的主要特点是:
1、它基于ANSI C/POSIX标准,所有的错误代码都以“E”开头,如EEXIST, EAGAIN等。
2、它的错误代码的清单取决于MicroPython的端口,不同的端口可能支持不同的错误代码。
3、它提供了一个errorcode字典,用于将数值错误代码映射到符号错误代码的字符串。
uerrno模块的应用场景是:
1、当需要处理OSError异常时,可以使用uerrno模块来获取和判断错误代码,从而采取相应的措施。
2、当需要显示或记录OSError异常时,可以使用uerrno模块来获取和转换错误代码,从而提高可读性和便利性。
uerrno模块的注意事项是:
1、在使用uerrno模块之前,需要导入它,如import uerrno。
2、在访问OSError异常的错误代码时,需要使用exc.args[0]而不是exc.errno,因为MicroPython中OSError异常只有一个参数。
3、在比较或转换错误代码时,需要使用uerrno模块中定义的常量或字典,而不是直接使用数值或字符串,以避免不一致或错误。
uerrno模块的三个实际运用程序案例是:
案例一:创建一个目录,如果目录已存在,则打印提示信息,否则打印成功信息。
import uos
import uerrno
try:
uos.mkdir("my_dir")
print("Directory created successfully")
except OSError as exc:
if exc.args[0] == uerrno.EEXIST:
print("Directory already exists")
else:
print("Error:", uerrno.errorcode[exc.args[0]])
案例二:打开一个文件,如果文件不存在,则创建一个新文件并写入一些内容,否则打印提示信息。
import uio
import uerrno
try:
f = uio.open("my_file.txt", "r")
print("File already exists")
f.close()
except OSError as exc:
if exc.args[0] == uerrno.ENOENT:
print("File not found, creating a new one")
f = uio.open("my_file.txt", "w")
f.write("Hello, MicroPython!")
f.close()
else:
print("Error:", uerrno.errorcode[exc.args[0]])
案例三:连接一个网络套接字,如果连接超时,则重试一次,否则打印错误信息。
import usocket
import uerrno
s = usocket.socket()
address = ("example.com", 80)
retry = False
try:
s.connect(address)
print("Connection established")
except OSError as exc:
if exc.args[0] == uerrno.ETIMEDOUT:
print("Connection timed out")
if not retry:
print("Retrying...")
retry = True
s.connect(address)
else:
print("Retry failed")
else:
print("Error:", uerrno.errorcode[exc.args[0]])
案例四:检查文件是否存在:
import uerrno
import os
# 检查文件是否存在
filename = 'myfile.txt'
if not os.path.exists(filename):
print("File does not exist")
errno = uerrno.errorcode.get(uerrno.ENOENT, "Unknown error")
print("Error:", errno)
在这个示例中,我们使用os模块的exists()函数检查指定的文件是否存在。如果文件不存在,我们打印出相应的错误消息,并使用uerrno模块的errorcode字典获取ENOENT错误码对应的错误信息。
案例五:打开文件并处理错误:
import uerrno
# 打开文件并处理错误
try:
file = open('myfile.txt', 'r')
except OSError as e:
errno = e.args[0]
error_message = uerrno.errorcode.get(errno, "Unknown error")
print("Error:", error_message)
在这个示例中,我们尝试打开一个文件 ‘myfile.txt’,并使用try-except结构来捕捉OSError异常。如果打开文件时发生错误,我们获取错误码并使用uerrno模块的errorcode字典获取对应的错误信息。
案例六:处理传输错误:
import uerrno
# 处理传输错误
try:
# Perform network data transfer
# ...
# Simulating a connection error
raise OSError(uerrno.ECONNRESET, "Connection reset by peer")
except OSError as e:
errno = e.args[0]
if errno == uerrno.ECONNRESET:
print("Connection reset by peer")
else:
error_message = uerrno.errorcode.get(errno, "Unknown error")
print("Error:", error_message)
在这个示例中,我们使用try-except结构来捕捉OSError异常,在网络数据传输过程中,通过模拟连接错误来触发异常。我们检查错误码是否为ECONNRESET,如果是,则打印出相应的错误消息。否则,我们使用uerrno模块的errorcode字典获取对应的错误信息。
案例七:检查文件是否存在2
import uos
import uerrno
# 检查文件是否存在
try:
uos.stat("myfile.txt")
except OSError as e:
if e.args[0] == uerrno.ENOENT:
print("文件不存在")
在这个例子中,我们使用 uos.stat() 函数检查文件 “myfile.txt” 是否存在。如果文件不存在,会引发 OSError 异常,并且可以通过 uerrno.ENOENT 错误码来判断文件是否存在。
案例八:处理文件读写错误
import uos
import uerrno
# 打开文件并进行读取操作
try:
file = open("myfile.txt", "r")
data = file.read()
file.close()
except OSError as e:
if e.args[0] == uerrno.EACCES:
print("文件访问被拒绝")
elif e.args[0] == uerrno.ENOENT:
print("文件不存在")
else:
print("其他文件读写错误")
在这个例子中,我们打开文件 “myfile.txt” 并进行读取操作。如果在打开或读取文件时发生错误,会引发 OSError 异常,并根据不同的错误码进行相应的处理,如 uerrno.EACCES 表示文件访问被拒绝,uerrno.ENOENT 表示文件不存在。
案例九: 获取最近一次错误码
import uos
import uerrno
# 进行一些操作...
# ...
# 获取最近一次错误码
error_code = uos.errno()
if error_code == uerrno.ENOMEM:
print("内存不足")
elif error_code == uerrno.EINVAL:
print("无效的参数")
else:
print("其他错误")
在这个例子中,我们进行一些操作后,通过 uos.errno() 函数获取最近一次的错误码,并根据错误码进行相应的处理。这样,我们可以根据错误码来确定发生了哪种类型的错误。
这些案例展示了 uerrno 模块的实际应用,包括检查文件是否存在、处理文件读写错误以及获取最近一次的错误码。通过使用 uerrno 模块,你可以在 MicroPython 设备上处理和识别不同类型的错误,以便进行相应的错误处理和调试。请注意,在使用 uerrno 模块时,请参考 MicroPython 的文档以了解特定错误码的含义和用法。