【雕爷学编程】MicroPython手册之 ESP32-C3 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-C3是一款由乐鑫科技开发的物联网芯片,它具有以下主要特性:

搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。
内置 400 KB SRAM,384 KB ROM,支持最大 16 MB 的外置 Flash。
集成了天线开关、射频巴伦、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能,仅需要 20 余个外围元件。
具有 22 个可编程 GPIO 管脚,支持 ADC、SPI、UART、I2C、I2S、RMT、TWAI 和 PWM。
具有完善的安全机制,包括安全启动、Flash 加密、数字签名和 HMAC 外设、世界控制器模块等。
沿用乐鑫成熟的物联网开发框架 ESP-IDF,支持 Arduino 和 MicroPython 等开源平台。

在这里插入图片描述
MicroPython的ESP32-C3支持UART(串行总线),下面是对ESP32-C3 UART的主要特点、应用场景以及需要注意的事项的详细解释:

主要特点:

异步通信:UART是一种异步串行通信协议,它使用一个引脚对数据进行传输。ESP32-C3通过内置的UART硬件支持异步通信,可以实现可靠的数据传输。

通信速率:ESP32-C3的UART支持多种通信速率(波特率),可以根据需要选择合适的速率。常见的波特率包括9600、115200等,较高的波特率可实现更快的数据传输。

数据格式:ESP32-C3的UART支持不同的数据格式配置,包括数据位数、校验位和停止位。通过配置这些参数,可以适应不同的通信需求。

双向通信:UART支持全双工通信,即可以同时进行发送和接收操作。这使得ESP32-C3能够与其他串行设备进行双向数据交换。

应用场景:

与外部设备通信:UART在嵌入式系统中广泛应用于与外部设备的通信,例如传感器、显示器、无线模块等。通过UART接口,ESP32-C3可以与这些外部设备进行数据交换和控制。

调试和日志记录:UART通常用于在调试阶段输出调试信息和日志记录。ESP32-C3可以通过UART接口将调试信息发送到计算机或其他终端设备,方便开发者进行调试和分析。

与其他嵌入式系统连接:UART是一种常见的通信协议,许多嵌入式系统和微控制器都支持UART接口。通过UART,ESP32-C3可以与其他嵌入式系统进行数据交换,实现系统之间的通信和协作。

需要注意的事项:

电平匹配:在使用UART时,需要确保ESP32-C3和外部设备之间的电平匹配。通常情况下,UART使用TTL电平,因此需要确保外部设备的逻辑电平与ESP32-C3兼容。

波特率设置:在进行UART通信时,需要确保ESP32-C3和通信对端的波特率设置一致。如果波特率不匹配,会导致通信错误或数据丢失。

数据格式配置:根据通信需求,需要正确配置ESP32-C3的UART数据格式,包括数据位数、校验位和停止位。配置错误可能导致通信错误或数据解析问题。

缓冲区管理:在进行UART通信时,需要适当管理接收和发送缓冲区。如果数据发送速度过快,而接收端处理速度跟不上,可能会导致数据丢失。因此,需要合理设置缓冲区大小,并确保及时处理接收和发送的数据。

异常处理:在UART通信中,可能会遇到各种异常情况,如数据错误、通信中断等。在使用ESP32-C3的UART时,需要适时处理这些异常情况,保证通信的稳定性和可靠性。

总结:
ESP32-C3的UART提供了一种可靠的异步串行通信方式,适用于与外部设备的数据交换和控制。通过正确配置波特率和数据格式,可以实现与其他嵌入式系统的通信。在使用UART时,需要注意电平匹配、波特率设置、数据格式配置、缓冲区管理和异常处理等事项,以确保通信的稳定性和可靠性。

案例一:UART通信发送数据

from machine import UART
import time

# 定义引脚
uart = UART(1, baudrate=9600)

while True:
    uart.write("Hello, World!")  # 通过UART发送数据
    time.sleep(1)  # 延时1秒

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO1的UART。程序会不断地向串口发送"Hello, World!"字符串,每次发送后等待1秒。

案例二:UART接收数据

from machine import UART
import time

# 定义引脚
uart = UART(1, baudrate=9600)

while True:
    data = uart.read()  # 从串口读取数据
    if data:
        print("Received data:", data)  # 打印接收到的数据
    time.sleep(1)  # 延时1秒

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO1的UART。程序会不断地从串口读取数据,并将接收到的数据打印出来,每次读取后等待1秒。

案例三:UART通信发送和接收数据

from machine import UART
import time

# 定义引脚
uart = UART(1, baudrate=9600)

while True:
    uart.write("Hello, World!")  # 通过UART发送数据
    time.sleep(1)  # 延时1秒
    data = uart.read()  # 从串口读取数据
    if data:
        print("Received data:", data)  # 打印接收到的数据
    time.sleep(1)  # 延时1秒

要点解读:这个程序使用MicroPython的ESP32-C3控制了一个连接到GPIO1的UART。程序会不断地向串口发送"Hello, World!"字符串,同时也会从串口读取数据并打印出来。每次发送和接收数据后都会等待1秒。

案例四:通过 UART 发送和接收数据
在此示例中,我们将配置 UART1 并使用它来发送和接收数据。

from machine import UART  
import time  
  
# 初始化 UART1,设置波特率为 115200,数据位为 8,无校验位,无停止位  
uart = UART(1, baudrate=115200, bits=8, parity=0, stop=0)  
  
# 发送数据  
uart.write(b'Hello, UART!')  
  
# 延时一段时间,等待接收数据  
time.sleep(1)  
  
# 读取接收到的数据  
data = uart.read(10)  # 读取 10 个字节的数据  
print('Received:', data)

解读:在此程序中,我们首先导入了 UART 类和 time 模块。然后,我们使用 UART 类初始化 UART1,设置波特率为 115200,数据位为 8,无校验位,无停止位。然后,我们使用 write 方法向 UART1 发送数据。接着,我们使用 time.sleep 方法延时一段时间,等待接收数据。最后,我们使用 read 方法读取接收到的数据,并打印出来。

案例五:通过 UART 实现两设备间的通信
在此示例中,我们将配置 UART1 和 UART2,并使用它们在两设备之间发送和接收数据。

设备 A 的代码:

python
from machine import UART, time_pulse_us  
import time  
  
# 初始化 UART1,设置波特率为 115200,数据位为 8,无校验位,无停止位  
uart1 = UART(1, baudrate=115200, bits=8, parity=0, stop=0)  
  
# 发送数据  
data = b'Hello from device A!'  
uart1.write(data)  
  
# 延时一段时间,等待接收数据  
time.sleep(1)  
  
# 读取接收到的数据  
data = uart1.read(10)  # 读取 10 个字节的数据  
print('Received from device B:', data)

设备 B 的代码:

from machine import UART, time_pulse_us  
import time  
  
# 初始化 UART2,设置波特率为 115200,数据位为 8,无校验位,无停止位  
uart2 = UART(2, baudrate=115200, bits=8, parity=0, stop=0)  
  
# 开启接收中断  
uart2.irq(trigger=UART.IRQ_RX_DONE, handler=lambda x: x)  
  
# 循环接收数据  
while True:  
    # 如果接收到数据,打印出来并发送回去  
    if uart2.any():  
        data = uart2.read(10)  # 读取 10 个字节的数据  
        print('Received from device A:', data)  
        uart2.write(data)  # 将接收到的数据发送回去

案例六:通过 UART 实现与 PC 的串口通信
在此示例中,我们将使用 UART 与个人电脑进行串口通信,例如通过 Arduino 与电脑串口通信来进行数据交换。

from machine import UART  
import time  
  
# 初始化 UART1,设置波特率为 9600,数据位为 8,无校验位,1个停止位  
uart = UART(1, baudrate=9600, bits=8, parity=0, stop=1)  
  
# 循环发送数据  
while True:  
    data = input("Enter data to send: ")  
    uart.write(data.encode())  # 将字符串转换为字节流后发送  
    time.sleep(1)  # 延时一段时间,等待接收数据  
  
    # 读取接收到的数据  
    while uart.any():  
        data = uart.readline().decode().strip()  # 读取一行数据并解码  
        print("Received:", data)

解读:在此程序中,我们首先导入了 UART 类和 time 模块。然后,我们使用 UART 类初始化 UART1,设置波特率为 9600,数据位为 8,无校验位,1个停止位。然后,我们进入一个无限循环,在这个循环中,我们首先等待用户输入要发送的数据,然后将这个字符串转换为字节流后发送。接着,我们延时一段时间,等待接收数据。在接收数据的过程中,我们使用 any 方法检查是否有接收到的数据,如果有,我们就使用 readline 方法读取一行数据并解码,然后打印出来。这样就可以通过 UART 与个人电脑进行串口通信了。

案例七:串口接收数据并输出

import machine
import utime

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

while True:
    if uart.any():
        data = uart.read()
        print("Received data:", data.decode("utf-8"))
    utime.sleep(0.1)

要点解读:
代码使用machine.UART创建一个UART对象,这里使用UART0。
baudrate参数设置串口的波特率,这里设置为9600。
tx参数和rx参数分别指定UART的发送引脚和接收引脚,这里使用引脚0和引脚1。
在循环中,通过uart.any()检查是否有数据可用。
如果有数据可用,使用uart.read()读取数据,并使用decode(“utf-8”)将字节数据解码为字符串数据。
最后,将接收到的数据打印输出。

案例八:串口发送数据

import machine
import utime

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

while True:
    uart.write("Hello, UART!")
    utime.sleep(1)

要点解读:
代码与前一个示例类似,使用machine.UART创建一个UART对象。
在循环中,使用uart.write()发送字符串数据到串口。
在本示例中,每隔1秒钟向串口发送一条消息"Hello, UART!"。

案例九:串口回环测试

import machine
import utime

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

while True:
    if uart.any():
        data = uart.read()
        uart.write(data)
    utime.sleep(0.1)

要点解读:
代码与第一个示例类似,使用machine.UART创建一个UART对象。
在循环中,通过uart.any()检查是否有数据可用。
如果有数据可用,使用uart.read()读取数据,并通过uart.write()将数据发送回串口。
这样就实现了一个简单的串口回环测试,将接收到的数据原样发送回去。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值