Pico UART 数据收发实战:硬件配置、MicroPython 编程

在下面实验中,我们需要将通过 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)

在以上代码中,我们进行了如下操作:

  1. 初始化配置:配置 UART0 串口,设置波特率为 115200,GPIO0 为 TX(发送),GPIO1 为 RX(接收),超时时间为 100ms,配置 GPIO25 引脚为 LED 灯控制引脚
  2. 使用 while 循环实现串口数据发送与接收,每次发送 Hello, UART! 字符串并尝试读取数据,接收到数据后解码并打印,同时控制 LED 亮灭以指示接收操作
  3. 当接收数据次数达到 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 会间断性地点亮:

复制代码
相关推荐
for_ever_love__8 分钟前
LangChain Token 计数与成本控制:先知道钱花在哪
开发语言·langchain
m0_547486669 分钟前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构
顽疲10 分钟前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
Sand(ContextGate)12 分钟前
从开发者调试工具到消费级 App:一个 AI 电商导购项目的 C 端改造与 6 个连环踩坑实录
开发语言·人工智能·python·ai·langchain
共饮一杯无16 分钟前
LiveKit本地录制落盘路径排查与修复实践
java·go·livekit
白杨尚青17 分钟前
C++入门篇(十七):priority_queue 完整模拟实现——仿函数、区间建堆与指针特化(附完整代码仓库)
开发语言·c++·stl·仿函数
xunyan623422 分钟前
51 单片机LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
StevenLdh28 分钟前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
逐光者93331 分钟前
滤波器的 R 与 C 如何选择:从截止频率到工程实践
c语言·开发语言·r语言
Eider199836 分钟前
大模型输出格式幻觉解决思路
开发语言·前端·javascript