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

在下面实验中,我们需要将通过 MiniUSB 数据线将 风雅一号板-通用兼容扩展板UART0USB 接口与电脑上的 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 会间断性地点亮:

复制代码
相关推荐
Casual21 分钟前
【网络基础进阶】:看懂子网划分与 VLAN
开发语言·网络·php
devilnumber1 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle
cfm_29141 小时前
线程池阻塞队列
java·开发语言
xxwxx__1 小时前
C++ list 深度解析:从使用原理到模拟实现
开发语言·c++·list
坐吃山猪2 小时前
【多线程】ThreadPool线程池参数说明
java·网络
Freak嵌入式2 小时前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
Chester_19992 小时前
CSP202303C.LDAP
开发语言·c++·蓝桥杯·stl
奋斗吧程序媛2 小时前
CSV文件导入功能
开发语言·javascript·ecmascript
evans在进步2 小时前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式