在下面实验中,我们需要将通过 MiniUSB 数据线将 风雅一号板-通用兼容扩展板 上 UART0 的 USB 接口与电脑上的 USB 接口连接:


在下列代码中,我们设计了一个用于实现串口(UART)数据收发的程序。
示例代码如下,在配套资料的文件夹:elegance-devkit v1\Demo\07 UART_ReadWrite 中:
Python
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2024/6/23 下午9:16
# @Author : 李清水
# @File : main.py
# @Description : UART类实验,实现简单的串口数据收发
# ======================================== 导入相关模块 =========================================
# 硬件相关的模块
from machine import UART, Pin
# 时间相关的模块
import time
# ======================================== 全局变量 ============================================
# 串口接收计数变量
recv_count: int = 0
# ======================================== 功能函数 ============================================
def LED_Blink(led_obj: Pin, delay_time: int) -> None:
"""
控制LED灯闪烁。
进行LED灯的子系统闪烁控制,指示程序停止运行。
Args:
led_obj (Pin): LED对象,用于控制LED灯的GPIO控制器
delay_time (int): 延时时间,单位为毫秒
Returns:
None
"""
while True:
# 点亮LED
led_obj.on()
# 延时 delay_time ms
time.sleep_ms(delay_time)
# 熄灭LED灯
led_obj.off()
# 再次延时 delay_time ms
time.sleep_ms(delay_time)
# ======================================== 自定义类 ============================================
# ======================================== 初始化配置 ==========================================
# 上电延时3s
time.sleep(3)
# 打印调试信息
print("FreakStudio : UART Read and Write Experiment")
# 创建串口对象,设置波特率为115200
uart: UART = UART(0, 115200)
# 初始化uart对象,波特率为115200,数据位为8,无校验位,停止位为1
# 设置串口超时时间为100ms
uart.init(baudrate = 115200,
bits = 8,
parity = None,
stop = 1,
tx = 0,
rx = 1,
timeout = 100)
# 设置GPIO 25为LED输出引脚,下拉电阻使能
LED: Pin = Pin(25, Pin.OUT, Pin.PULL_DOWN)
# ======================================== 主程序 ===========================================
# 循环执行
while True:
# 打印调试信息,输出串口收发次数
print("UART0 RECV COUNT: ", recv_count)
# 延时100ms
time.sleep_ms(100)
# 判断串口接收计数变量是否大于等于10
if recv_count >= 10:
# 串口接收计数变量归零
recv_count = 0
break
# 向串口发送数据
uart.write("Hello, UART!")
# 发送调试信息
print("UART0 SEND DATA")
# 检查是否有数据可读
if uart.any():
# 打印可读取的字符数
print("number of characters that can be read:", uart.any())
# 点亮LED灯,做指示作用
LED.on()
# 读取一行数据
data = uart.readline()
# 接收到数据为 b'Hello, UART!\r\n',字符串是bytes类型
print("UART0 RECV DATA: ", data)
# 对接收到数据data进行解码
print("DECODE UART0 RECV DATA: ", data.decode('utf-8'))
# 延时300ms
time.sleep_ms(300)
# 关闭LED灯
LED.off()
# 延时300ms
time.sleep_ms(300)
# 串口接收计数变量递增
recv_count = recv_count + 1
# 收发10次后,跳出循环,LED灯闪烁
print("Stop Program Running")
LED_Blink(LED, 100)
在以上代码中,我们进行了如下操作:
- 初始化配置:配置 UART0 串口,设置波特率为 115200,GPIO0 为 TX(发送),GPIO1 为 RX(接收),超时时间为 100ms,配置 GPIO25 引脚为 LED 灯控制引脚
- 使用
while循环实现串口数据发送与接收,每次发送Hello, UART!字符串并尝试读取数据,接收到数据后解码并打印,同时控制 LED 亮灭以指示接收操作 - 当接收数据次数达到 10 次时,跳出循环并调用
LED_Blink函数,使 LED 灯持续闪烁
这里,串口接收到的数据为 bytes 类型(不可变二进制字节序列),bytes 是一种不可变的数据类型,用于表示字节序列。它存储了以字节为单位的数据,范围为 0-255。bytes 类型与字符串类型 (str)类似,但是字符编码为字节(原始的二进制数据表示形式)而不是 Unicode 字符。bytes 类型在处理网络通信、文件读写、加密解密等要用到二进制数据的场景中非常有用。在 Python 中,字符串前面加上 b 的前缀可表示 bytes 类型。
我们在上述程序中,使用如下代码对接收到的不可变二进制字节序列进行解码,将其转换为字符串类型:
Python
# 对接收到数据data进行解码
print("DECODE UART0 RECV DATA: ", data.decode('utf-8'))
打开 XCOM 软件,选择 CH340K 芯片对应 COM 口:

串口通信参数和程序中一致:

其余发送和接收参数默认即可:


点击打开串口:

烧录程序,打开终端,显示如下:

可以看到,当我们没有进行任何操作时,XCOM 软件上可以正常接收到树莓派 Pico 发送的数据。
我们尝试通过 XCOM 软件从电脑上发送字符串 Hello,Pico! 到树莓派 Pico 上:

可以看到终端输出了树莓派 Pico 串口接收到的字符数量以及解码前后的数据:

同时,每次通过 XCOM 软件从电脑上发送字符串时,树莓派 Pico 的板载 LED 灯都会闪烁一次,在连续发送十次后,树莓派 Pico 停止了串口数据接收,并且板载 LED 灯持续闪烁:

并且,在树莓派 Pico 通过串口收发数据时,风雅一号板-通用兼容扩展板 上串口收发指示灯 LED3 会间断性地点亮:
