【雕爷学编程】MicroPython手册之 ESP32-S3 UART (serial bus)

在这里插入图片描述
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、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述

MicroPython的ESP32-S3芯片提供了UART(串行总线)功能,以下是关于其主要特点、应用场景和需要注意的事项的详细解释:

主要特点:

高速串行通信:ESP32-S3的UART模块支持高速串行通信,可实现可靠的数据传输。它可以配置为不同的波特率,以满足不同应用的需求。

多个UART通道:ESP32-S3芯片具有多个UART通道,可以同时处理多个串行通信任务。每个UART通道都有独立的寄存器和缓冲区,可以实现并行通信。

可编程性:UART模块具有丰富的配置选项,包括数据位数、校验位、停止位、流控制等。这使得开发人员可以根据特定应用的要求进行灵活配置。

应用场景:

与外部设备通信:UART常用于与外部设备进行串行通信,如传感器模块、无线模块、GPS模块等。通过配置合适的波特率和串口参数,可以实现可靠的数据传输。

调试和控制台输出:UART通常用于调试应用程序和输出控制台信息。开发人员可以将调试信息通过UART发送到计算机或终端窗口,以便分析和调试代码。

与其他微控制器通信:UART通信是微控制器之间常用的通信方式。通过UART接口,ESP32-S3可以与其他微控制器或外部设备进行数据交换和协作。

需要注意的事项:

电平匹配:在进行UART通信时,需要确保ESP32-S3的UART引脚和外部设备之间的电平匹配。通常需要使用适当的电平转换电路或电平转换器。

波特率配置:在使用UART时,需确保ESP32-S3和外部设备之间的波特率配置一致。如果波特率不匹配,可能会导致通信错误或数据丢失。

缓冲区管理:UART通信涉及到数据的发送和接收,需要正确管理发送和接收缓冲区。确保缓冲区足够大,以避免数据溢出或丢失。

流控制:在需要进行流控制的情况下,可以配置UART模块的硬件流控制功能,以确保数据传输的稳定性和可靠性。

中断处理:ESP32-S3的UART模块支持中断机制,可以在接收数据或发送完成时触发中断。编写正确的中断处理程序,并避免在中断处理程序中执行耗时操作,以保证系统的响应性能。

综上所述,MicroPython的ESP32-S3的UART功能具有高速通信、多通道支持和可编程性等特点。它适用于与外部设备通信、调试和控制台输出,以及与其他微控制器进行通信。在使用UART时,需注意电平匹配、波特率配置、缓冲区管理、流控制和中断处理等事项,以确保通信的稳定和可靠性。

案例一:使用ESP32-S3的UART接收数据

from machine import UART
import time

# 定义UART引脚为GPIO1和GPIO3,波特率为9600
uart = UART(1, baudrate=9600)

while True:
    if uart.any():
        data = uart.read()
        print("接收到的数据:", data)
    time.sleep(1)

要点解读:在这个程序中,我们使用了MicroPython的machine模块中的UART类来控制ESP32-S3的UART。首先,我们将UART的TX引脚设置为GPIO1,RX引脚设置为GPIO3,并设置波特率为9600。然后,我们使用一个无限循环来不断检查是否有数据可读。如果有数据可读,我们就读取数据并打印出来。最后,我们使用time.sleep()函数让程序暂停1秒,以避免过度占用CPU资源。

案例二:使用ESP32-S3的UART发送数据

from machine import UART
import time

# 定义UART引脚为GPIO1和GPIO3,波特率为9600
uart = UART(1, baudrate=9600)

while True:
    # 向串口发送数据
    uart.write("Hello, UART!")
    time.sleep(1)

要点解读:在这个程序中,我们同样使用了MicroPython的machine模块中的UART类来控制ESP32-S3的UART。与上一个程序不同的是,我们在循环中不断地向串口发送数据。每次发送完数据后,我们都会暂停1秒,以避免过度占用CPU资源。

案例三:使用ESP32-S3的UART进行通信

from machine import UART
import time

# 定义UART引脚为GPIO1和GPIO3,波特率为9600
uart = UART(1, baudrate=9600)

while True:
    # 向串口发送数据
    uart.write("Hello, UART!")
    time.sleep(1)

    # 检查是否有数据可读
    if uart.any():
        data = uart.read()
        print("接收到的数据:", data)
    time.sleep(1)

要点解读:在这个程序中,我们同时实现了向串口发送数据和从串口接收数据的功能。在主循环中,我们先向串口发送数据,然后检查是否有数据可读。如果有数据可读,我们就读取数据并打印出来。这样,我们就可以实现一个简单的串口通信功能。

案例四:读取串口数据
在这个程序中,我们将使用ESP32-S3的UART模块读取串口数据。具体来说,我们将使用uart.read()函数从串口读取数据,并将其存储在一个变量中。然后,我们使用print()函数将读取到的数据打印出来。需要注意的是,在读取串口数据之前,我们需要先使用uart.begin()函数设置串口的波特率和数据位等参数。

import machine  
import time  
  
# 设置串口参数  
uart.begin(115200, 8, 1, 0, None)  
  
while True:  
    # 读取串口数据  
    data = uart.read(10) # 读取10个字节的数据  
    if data: # 如果读取到了数据  
        print(data) # 打印数据  
    time.sleep(0.1) # 等待0.1秒钟

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用uart.begin()函数设置串口的波特率为115200,数据位为8,停止位为1,校验位为0,并使用None作为串口的参数。接下来,我们使用一个无限循环来读取串口数据。在每次循环中,我们先使用uart.read()函数读取10个字节的数据,并将其存储在变量data中。如果读取到了数据(即data不为空),我们就使用print()函数将数据打印出来。最后,我们使用time.sleep()函数等待0.1秒钟,以避免过于频繁地读取串口数据。

案例五:发送串口数据
在这个程序中,我们将使用ESP32-S3的UART模块发送串口数据。具体来说,我们将使用uart.write()函数将一个字符串发送到串口。需要注意的是,在发送串口数据之前,我们需要先使用uart.begin()函数设置串口的波特率和数据位等参数。

import machine  
import time  
  
# 设置串口参数  
uart.begin(115200, 8, 1, 0, None)  
  
# 发送字符串数据到串口  
message = "Hello, UART!"  
uart.write(message.encode('utf-8'))

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用uart.begin()函数设置串口的波特率为115200,数据位为8,停止位为1,校验位为0,并使用None作为串口的参数。接下来,我们定义了一个字符串变量message,并使用uart.write()函数将字符串发送到串口。需要注意的是,uart.write()函数需要接收一个字节对象作为参数,因此我们需要使用encode()函数将字符串转换为字节对象。在本例中,我们使用了UTF-8编码将字符串转换为字节对象。

案例六:实现串口通信协议
在这个程序中,我们将使用ESP32-S3的UART模块实现一个简单的串口通信协议。具体来说,我们将使用uart.read()函数读取串口接收缓冲区中的数据,并根据协议规范解析这些数据。然后,我们将使用uart.write()函数将响应数据发送回串口发送缓冲区。需要注意的是,在实现串口通信协议时,我们需要先定义好协议规范,包括数据的起始符、结束符、校验位等信息。

import machine  
import time  
  
# 设置串口参数  
uart.begin(115200, 8, 1, 0, None)  
  
# 定义协议规范  
START_BYTE = b'\x01' # 起始符  
END_BYTE = b'\x02' # 结束符  
CHECKSUM_BYTE = b'\x03' # 校验位  
  
# 发送数据函数  
def send_data(data):  
    # 将数据加上校验位后发送  
    uart.write(data + CHECKSUM_BYTE)  
  
# 接收数据函数  
def receive_data():  
    # 读取串口数据,直到接收到结束符  
    while True:  
        data = uart.read(100) # 读取100个字节的数据  
        if data and data[-1] == END_BYTE: # 如果读取到了数据且以结束符结尾  
            return data[:-1] # 返回除结束符之外的数据  
    return None  
  
# 主程序循环  
while True:  
    # 发送数据  
    send_data(b'Hello, UART!')  
    time.sleep(1) # 等待1秒钟  
  
    # 接收数据  
    response = receive_data()  
    if response: # 如果接收到了响应数据  
        print(response) # 打印响应数据

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用uart.begin()函数设置串口的波特率为115200,数据位为8,停止位为1,校验位为0,并使用None作为串口的参数。接下来,我们定义了三个字节的协议规范:起始符为\x01,结束符为\x02,校验位为\x03。然后,我们定义了两个函数:send_data()和receive_data()。send_data()函数将数据加上校验位后发送到串口,receive_data()函数则从串口读取数据,直到接收到结束符为止。最后,在主程序循环中,我们使用send_data()函数发送一个字符串数据,并使用receive_data()函数接收响应数据。如果接到了响应数据,我们就使用print()函数将其打印出来。需要注意的是,在实际应用中,我们需要根据具体的协议规范来实现数据的解析和校验等功能。

案例七:串口通信:

import machine

uart = machine.UART(1, baudrate=9600, tx=machine.Pin(4), rx=machine.Pin(5))

def send_data(data):
    uart.write(data)

def receive_data():
    if uart.any():
        data = uart.read()
        print("Received data:", data)

send_data("Hello UART")
receive_data()

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上进行串口通信。
使用machine.UART()函数创建一个UART对象,指定UART编号、波特率和引脚连接。
在这个示例中,UART1被配置为9600波特率,并使用引脚4作为发送引脚(TX),引脚5作为接收引脚(RX)。
send_data()函数用于发送数据到UART总线。
receive_data()函数用于接收来自UART总线的数据。
在示例中,先发送数据"Hello UART"到UART总线,然后接收并打印接收到的数据。

案例八:通过UART控制LED灯:

import machine

uart = machine.UART(1, baudrate=9600, tx=machine.Pin(4), rx=machine.Pin(5))
led_pin = machine.Pin(2, machine.Pin.OUT)

def process_command(command):
    if command == b'ON':
        led_pin.on()
    elif command == b'OFF':
        led_pin.off()

while True:
    if uart.any():
        command = uart.read()
        process_command(command)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过UART控制LED灯。
使用machine.UART()函数创建一个UART对象,指定UART编号、波特率和引脚连接。
在这个示例中,UART1被配置为9600波特率,并使用引脚4作为发送引脚(TX),引脚5作为接收引脚(RX)。
process_command()函数用于处理接收到的命令。
在一个无限循环中,检查UART总线上是否有数据可读。如果有数据,读取并处理接收到的命令。
根据接收到的命令,控制LED灯的开关状态。

案例九:UART与外部设备通信:

import machine

uart = machine.UART(1, baudrate=9600, tx=machine.Pin(4), rx=machine.Pin(5))

def send_command(command):
    uart.write(command)
    response = uart.read()
    print("Response:", response)

send_command(b"AT\r\n")

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上通过UART与外部设备进行通信。
使用machine.UART()函数创建一个UART对象,指定UART编号、波特率和引脚连接。
在这个示例中,UART1被配置为9600波特率,并使用引脚4作为发送引脚(TX),引脚5作为接收引脚(RX)。
send_command()函数用于发送命令到外部设备,并接收并打印响应。
在示例中,发送命令"AT\r\n"到外部设备,并等待并打印响应。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值