Pico 串口通信:硬件特性、MicroPython 编程与调试工具全解
1.树莓派 Pico 的 UART 概要信息
树莓派 Pico 有两个串口外设:UART0 和 UART1,二者参数相同,每个串口都支持下列功能:
- 独立的 32×8 Tx 发送 FIFO 存储器 和 32×12 Rx 接收 FIFO 存储器
- 由 clk_peri 时钟产生的可编程波特率发生器
- 在传输时添加和在接收时删除的标准异步通信位(开始位、停止位、奇偶校验位)
- 断线检测
- 有效数据位可以选择 5、6、7 和 8 位,停止位可以选择 1 或 2 位
- 可编程的硬件流控功能
GPIO 的端口复用表如下:

也可以直接查看树莓派 Pico 引脚图:
- UART0 可以映射到 GPIO 0/1、GPIO 16/17、GPIO 21/22
- UART1 可以映射到 GPIO 6/7、GPIO 11/12


UART 具有以下功能引脚:
- TX 端-UARTnTXD:用于发送串口数据
- RX 端-UARTnRXD:用于接收串口数据
- RTS 端-nUARTRTS:输出串口流控
- CTS 端-nUARTCTS:输入串口流控
串口外设的时钟 UARTCLK 由外设时钟 clk_peri 进行驱动,低速 APB 总线时钟 PCLK 由系统时钟 clk_sys 进行驱动:

树莓派 Pico 的串口通信波特率可以在 300 bps 至 1M bps 之间进行调整。
2.machine.UART 类构造方法和初始化方法
machine.UART 类构造方法如下:

machine.UART 类初始化方法如下:

可以对同一个对象多次调用 init() 以便动态重新配置 UART,这个特性可以使得仅有一个 UART 外设的 MCU 芯片可以通过多次初始化方法配置连接到不同引脚上实现串口外设的分时复用,需要注意的是,同一时间 UART 外设只能使用当前指定的两个引脚收发数据;同时也不要调用 deinit(),因为它会阻止再次调用 init()。
3.machine.UART 类的其他方法


这里,UART.irq 在 MicroPython v1.23.0 版本中树莓派 Pico 单片机中不可用,但这并不意味着,我们只能使用阻塞式方法轮询检测串口中是否有数据可以接收(即循环执行 UART.any()方法,根据其返回值判断),我们可以使用协程来实现串口读取的非阻塞式工作。

4.select 模块
考虑一下以下情况:我们正在制作一个无线运动传感器,可以检测运动数据、检测温湿度数据、蓝牙将数据传输到手机上。树莓派 Pico 上一个串口连接了陀螺仪传感器、另一个串口连接了温湿度传感器。
此时,陀螺仪传感器和温湿度传感器会定期给树莓派 Pico 传送数据,我们要在有数据可以读取时读取数据,而在没有数据读取时进行其他操作(例如将接收到的传感器数据发送给蓝牙芯片)。要实现该功能,我们可以在 while 循环中不断使用两个 UART.any()方法不断进行判断,在任意一个串口有可以接收的数据时开启接收,在接收到数据后才进行其他操作。此时,相当于程序一直卡到了等待接收串口数据上,若是一直未接收到数据(例如由于硬件电路故障导致外部温湿度传感器损坏,无法发送数据)则程序会阻塞。这个问题可以通过使用多线程运行数据接收任务、数据发送任务和其他任务、使用协程、使用定时器开启多个定时执行的任务来解决,但是使用 select 模块来完成监测串口状态变化并且在有数据可以接收时进行对应操作无疑是最简洁的方法,select 模块提供了一种有效的方式来同时监控多个 IO 对象的状态,并在有数据可读或可写时进行相应的处理。
同时想象以下更复杂的情况,该设备还要求使用 socket 进行网络通信完成数据收发,此时使用其他方法监测两个串口和 socket 端口实现十分麻烦且不简洁。
select 模块是 Python 标准库中的一个模块,它提供了 I/O 多路复用的基本功能。在 Python 中,I/O 多路复用是指能够同时监控多个文件描述符(例如套接字)的状态变化(如可读、可写等),并在任何一个文件描述符就绪时执行相应的操作。这种技术可以大大提高程序在处理大量并发连接时的性能和效率。使用 select 模块可以避免线程或进程的开销,因为它可以在单个线程中处理多个 I/O 事件。这对于高并发的网络服务器来说非常重要,因为线程或进程的创建和销毁都需要消耗大量的资源。
在 MicroPython 中,select 模块具有以下方法:



简单来说,我们需要先使用 select.poll()创建 Poll 类的实例,即用于监测以字节流方式读写数据设备的轮询对象,然后使用 Poll.register 方法将需要监测的设备注册到轮询对象中。接着,我们使用 Poll.poll 方法来监听事件,Poll.poll 方法会阻塞等待,直到有一个或多个设备准备好进行 I/O 操作(如读或写)。当有事件发生时,Poll.poll 方法会返回一个包含事件对象的列表。每个事件对象都有一个 fd 属性,表示发生事件的设备,以及一个 events 属性,表示该设备的事件类型。我们可以通过读取 fd 属性和 events 属性判断事件的类型和设备,执行对应操作。
5.CH340 芯片驱动介绍
在使用电脑和单片机的串口模块进行通信时,我们需要使用 USB 转 TTL 芯片将 USB 协议的信号转换为串行通信协议(TTL 电平),我们这款开发板使用 CH340K 芯片实现电平转换,CH340K 是南京沁恒微电子有限公司推出的一款 USB 转串口(TTL)芯片,内部集成了晶振电路,无需外部晶振和电容,大幅降低了外围电路复杂度,同时支持多种波特率(从 300bps 到 2Mbps),适合多种通信速率需求。
USB 转 TTL 电平电路如下图所示:

CH340K 作为一款 USB 外设芯片,其功能需要由操作系统识别和支持,我们需要首先安装 CH340K 芯片驱动才能正常使用 CH340K 芯片完成串口通信,驱动程序提供了 USB 协议到串口协议的桥接,让应用程序可以通过标准串口接口(COM 端口)与 CH340K 芯片通信。
这里,CH340K 芯片驱动程序可以在如下地址下载:
https://www.wch.cn/downloads/CH341SER_EXE.html
也可以在我们的文件夹中 elegance-devkit v1\开发软件\CH340驱动 找到:

6.XCOM 软件介绍
XCOM 是一种用于嵌入式系统开发中的数据传输和调试工具,通常用于嵌入式设备与计算机之间进行串口通信,它可以实时显示串口通信的收发数据,支持常见的波特率、数据位、停止位和校验位配置,并且可以将通信数据保存为日志文件。

正点原子 XCOM 软件下载地址如下:
https://gitcode.com/open-source-toolkit/faa3c/overview
也可以在我们的文件夹 elegance-devkit v1\开发软件\XCOM软件 下找到:

详细使用说明可以查看如下文章:http://47.111.11.73/docs/tool/ruanjian/ATK-XCOM.html
7.SerialPlot 调试软件
SerialPlot 是一个用于实时绘制串口数据的调试工具,非常适合用来监测嵌入式设备或微控制器通过串口传输的实时数据。它可以将从串口接收到的数值数据绘制成图表,使得调试过程更加直观。

其基本功能包括:
- 实时绘图:SerialPlot 可以实时接收串口数据并将其绘制成曲线图
- 数据保存:可以将接收到的数据保存为 CSV 文件,方便后续分析
- 多通道支持:可以解析多种数据格式,包括 ASCII、二进制格式,支持同时绘制多个通道的数据
下载安装可以查看链接:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97520
软件也可以在我们文件夹 elegance-devkit v1\开发软件\SerialPlot 中找到:

使用说明可以查看:https://blog.csdn.net/weixin_39623082/article/details/112666494

树莓派 Pico 有两个串口外设:UART0 和 UART1,二者参数相同,每个串口都支持下列功能:
浙公网安备 33010602011771号