【雕爷学编程】MicroPython手册之 REPL 中断程序

在这里插入图片描述

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-C 键来触发。REPL 的全称是 Read-Evaluate-Print-Loop,即读取-求值-打印-循环的过程。

REPL 中断程序的主要特点有:

当程序正在运行时,无论是在 REPL 中输入的还是从文件中加载的,用户可以按 Ctrl-C 键来中断程序。这会引发一个 KeyboardInterrupt 异常,将用户带回到 REPL。这样可以在程序出现死循环或其他问题时及时停止运行。
如果程序没有处理 KeyboardInterrupt 异常,或者没有使用 try-except 语句来捕获它,那么中断程序会导致程序终止,并显示异常的堆栈跟踪。用户可以查看异常的信息和位置,以便进行调试和修改。
如果程序处理了 KeyboardInterrupt 异常,或者使用 try-except 语句来捕获它,那么中断程序可能不会导致程序终止,而是继续执行异常处理部分的代码。用户可以在异常处理部分中添加一些逻辑或操作,以便在中断程序时做一些清理或恢复工作。

REPL 中断程序的应用场景有:

测试和调试:REPL 中断程序可以让用户快速地测试一些 Python 语句或函数,查看它们的运行结果和效果。如果发现结果不符合预期或出现错误,用户可以使用中断程序来停止运行,并查看异常的信息和位置。
学习和探索:REPL 中断程序可以让用户实时地学习和探索 Python 语言和 MicroPython 库的特性和功能。如果遇到一些不熟悉或不理解的语法或用法,用户可以使用中断程序来暂停运行,并查看相关的帮助命令或文档字符串。
实验和创造:REPL 中断程序可以让用户尝试一些新的想法和创意,实现一些有趣的功能和效果。如果发现效果不满意或有改进的空间,用户可以使用中断程序来终止运行,并进行修改和优化。

REPL 中断程序需要注意的事项有:

区分模式:REPL 中断程序只在普通模式下有效,而在粘贴模式或原始模式下无效。用户需要根据不同的目的和需求,选择合适的模式,并注意切换和退出的方式。不同的模式有不同的提示符和行为,用户需要注意区分和理解。
处理异常:REPL 中断程序会引发一个 KeyboardInterrupt 异常,用户需要根据自己的需求来决定是否处理或捕获这个异常。如果不处理或捕获这个异常,那么中断程序会导致程序终止,并显示异常的堆栈跟踪。如果处理或捕获这个异常,那么中断程序可能不会导致程序终止,而是继续执行异常处理部分的代码。

分配缓冲区:如果 ISR 中发生错误,MicroPython 无法生成错误报告,除非为此目的创建特殊缓冲区。如果以下代码包含在使用中断的任何程序中,调试将得到简化。

import micropython
micropython.alloc_emergency_exception_buf(100)

以下是 MicroPython 的 REPL 中断程序的几个实际运用程序参考代码案例:

案例一:使用 while 循环打印数字

>>> i = 0 # 定义一个变量 i
>>> while True: # 使用 while 循环
...     print(i) # 打印 i 的值
...     i += 1 # 将 i 的值加一
... 
0 # 输出结果
1
2
3
...
6466
6467
6468
Traceback (most recent call last): # 异常堆栈跟踪
  File "<stdin>", line 2, in <module>
KeyboardInterrupt: # 中断程序引发的异常
>>> 

案例二:使用 try-except 语句捕获中断程序引发的异常

>>> import time # 导入 time 模块
>>> try: # 使用 try 语句
...     while True: # 使用 while 循环
...         print('Hello') # 打印 Hello
...         time.sleep(1) # 睡眠一秒
... except KeyboardInterrupt: # 使用 except 语句捕获 KeyboardInterrupt 异常
...     print('Bye') # 打印 Bye
... 
Hello # 输出结果
Hello
Hello
Bye # 中断程序后的输出结果
>>> 

案例三:使用 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 秒闪烁一次

案例四:使用 KeyboardInterrupt 中断循环:

import time

while True:
    try:
        # 执行一些操作
        time.sleep(1)
    except KeyboardInterrupt:
        print("Program interrupted by user")
        break

在这个示例中,我们使用一个无限循环来执行一些操作(在这里是延迟一秒钟)。如果用户在程序执行期间按下 Ctrl+C,会引发 KeyboardInterrupt 异常。我们使用 try…except 块来捕获该异常,并在捕获到异常时打印一条消息,并使用 break 语句中断循环。

案例五:使用特定条件中断循环:

import machine

button_pin = machine.Pin(2, machine.Pin.IN)

while True:
    # 读取按钮状态
    button_state = button_pin.value()
    
    # 如果按钮被按下,中断循环
    if button_state == 1:
        print("Button pressed")
        break

在这个示例中,我们使用一个无限循环来读取按钮的状态。如果按钮被按下(按钮引脚的状态为 1),我们打印一条消息,并使用 break 语句中断循环。

案例六:使用特定条件中断函数执行:

import machine

button_pin = machine.Pin(2, machine.Pin.IN)

def process_data(data):
    # 执行一些操作
    
    # 如果满足某个条件,中断函数执行
    if data == "stop":
        print("Function execution stopped")
        return

# 读取数据并处理
data = input("Enter data: ")
process_data(data)

在这个示例中,我们定义了一个函数 process_data(),用于处理数据。在函数中,我们执行一些操作,然后检查数据是否满足某个条件。如果数据等于 “stop”,我们打印一条消息,并使用 return 语句中断函数的执行。这些示例展示了如何在 MicroPython REPL 中断程序的执行。您可以根据具体的应用场景和需求选择合适的方式来中断程序,无论是捕获异常、检查特定条件还是使用返回语句。通过中断程序,您可以在需要时停止代码的执行,并进行相应的处理。

案例七:使用 Ctrl+C 中断程序:
在 MicroPython REPL 中按下 Ctrl+C 组合键可以中断正在运行的程序。例如,如果您在 REPL 中输入一个无限循环的程序,您可以使用 Ctrl+C 来中断它。下面是一个示例:

# 在 MicroPython REPL 中输入以下代码
>>> while True:
...     pass

按下 Ctrl+C 组合键后,上述无限循环的程序将被中断,您将回到 REPL 提示符下。

案例八:使用异常处理中断程序:
您可以在程序中使用异常处理来捕获特定的异常,并在需要中断程序时引发该异常。例如,以下示例演示了如何在程序中使用 KeyboardInterrupt 异常来中断程序:

try:
    while True:
        pass
except KeyboardInterrupt:
    print("程序被中断!")

在上述示例中,我们使用 try 和 except 块来捕获 KeyboardInterrupt 异常,当用户按下 Ctrl+C 组合键时,该异常将被引发。在 except 块中,我们打印出一条提示消息,表示程序被中断。

案例九:使用特定条件中断程序:
您还可以在程序中设置特定条件,在符合条件时中断程序执行。以下示例演示了如何在程序中检查一个条件,并在条件满足时中断程序:

while True:
    if some_condition:
        print("程序被中断!")
        break
    # 继续执行其他操作

在上述示例中,我们使用一个无限循环,然后在循环内部检查 some_condition 条件。如果条件满足,即可使用 break 语句中断程序执行,并打印出一条提示消息。请注意,以上示例中的代码是在 MicroPython REPL 中直接输入和执行的。在实际应用中,您可以将这些代码存储在 Python 脚本文件中,并通过连接到 MicroPython 设备的串行终端或使用 MicroPython 开发工具(如 Thonny、uPyCraft)来执行这些脚本。使用中断可以方便地停止正在执行的程序,并返回到 REPL 提示符下。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值