
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种通用的串行通信协议,用于在两个设备之间进行异步数据传输。它不需要时钟信号同步,而是通过预先约定的波特率(数据传输速率)来保证数据正确传输。
在嵌入式系统中,UART 常用于:
与传感器、GPS 模块等外设通信
与电脑进行数据交互
两个微控制器之间的通信
UART 通信使用两根线实现双向通信:
TX(Transmit):发送数据
RX(Receive):接收数据
通信过程中,每个数据帧通常包含:
起始位:表示数据传输开始
数据位:实际传输的数据(通常 8 位)
校验位(可选):用于简单的错误检测
停止位:表示数据传输结束
一般在单片机/开发板上,UART引脚是可以灵活配置,默认常用的引脚标识为:UART0,TX,RX
要在树莓派pico上测试 UART 通信,你可以:
方法 1:与电脑通信
使用 USB 转 TTL 模块(如 CH340)
连接方式:
Pico 的 GP0(TX)→ USB 转 TTL 的 RX
Pico 的 GP1(RX)→ USB 转 TTL 的 TX
Pico 的 GND → USB 转 TTL 的 GND
将 USB 转 TTL 模块连接到电脑,使用串口调试工具(如 Putty、TeraTerm)打开对应串口,波特率 9600
方法 2:两个 Pico 之间通信
Pico A 的 GP0(TX)→ Pico B 的 GP1(RX)
Pico A 的 GP1(RX)→ Pico B 的 GP0(TX)
两个 Pico 的 GND 相连
运行下面代码后,你将看到 Pico 定期发送消息,同时可以通过串口工具或另一个 Pico 向它发送消息并查看接收结果。
下面是一个使用树莓派 Pico 进行 UART 通信的示例,包括发送和接收数据的功能。
from machine import Pin, UART
import time
# 初始化UART0,波特率9600
# TX = GP0, RX = GP1
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
# 发送数据函数
def send_data(message):
uart.write(message + '\n') # 添加换行符作为结束标志
print(f"发送: {message}")
# 接收数据函数
def receive_data():
if uart.any(): # 检查是否有数据可接收
data = uart.readline() # 读取一行数据
if data:
try:
# 解码字节数据为字符串并去除首尾空白
message = data.decode('utf-8').strip()
print(f"接收: {message}")
return message
except UnicodeError:
print("接收的数据不是有效的UTF-8编码")
return None
# 主循环
while True:
# 发送测试消息
send_data("Hello from Pico!")
# 尝试接收数据
receive_data()
# 延时1秒
time.sleep(1)
代码说明:
导入必要的模块:Pin用于引脚配置,UART用于 UART 通信,time用于延时
初始化 UART0,设置波特率为 9600,TX 引脚为 GP0,RX 引脚为 GP1
send_data()函数:发送字符串数据,并添加换行符作为结束标志
receive_data()函数:检查并接收数据,将字节数据解码为字符串
主循环:每秒发送一条消息,并检查是否有接收的数据
这是一个使用 Arduino IDE 开发环境的 ESP32 UART(串口)通信基础示例。代码中同时包含了 UART0(默认用于打印日志和上传程序)以及硬件串口 UART2 的数据发送与接收演示。
// ESP32 拥有 3 个硬件串口:UART0, UART1, UART2
// UART0 默认绑定在 GPIO1 (TX) 和 GPIO3 (RX),通常用于串口监视器打印日志
// 定义 UART2 的引脚
#define RX2_PIN 16
#define TX2_PIN 17
void setup() {
// 1. 初始化 UART0(与电脑串口监视器通信)
Serial.begin(115200);
while (!Serial) {
; // 等待串口连接
}
Serial.println("================================");
Serial.println("ESP32 UART 通信测试启动");
Serial.println("================================");
// 2. 初始化 UART2(自定义硬件串口,用于与其他设备通信)
// 参数依次为:波特率、数据格式、RX引脚、TX引脚
Serial2.begin(115200, SERIAL_8N1, RX2_PIN, TX2_PIN);
Serial.println("UART2 (Hardware Serial 2) 初始化完成!");
}
void loop() {
// --- 示例 1: 定时通过 UART2 发送数据 ---
static unsigned long lastSendTime = 0;
if (millis() - lastSendTime > 2000) { // 每 2 秒发送一次
lastSendTime = millis();
String message = "Hello from ESP32 UART2! Time: " + String(millis());
Serial2.println(message); // 从 UART2 发送数据
Serial.println("[UART0 输出] 已向 UART2 发送数据: " + message);
}
// --- 示例 2: 检查并读取 UART2 接收到的数据 ---
if (Serial2.available() > 0) {
String incomingData = Serial2.readStringUntil('\n'); // 读取直到换行符
// 将 UART2 接收到的内容打印到 Serial0(串口监视器)
Serial.print("[UART0 输出] UART2 收到新消息: ");
Serial.println(incomingData);
}
}如需测试 UART2自发自收测试(Loopback): 可以直接用跳线将 GPIO16 (RX2) 和 GPIO17 (TX2) 短接。这样代码中从 Serial2 发送出去的数据会被自己接收到,并直接打印在串口监视器上。
与外部设备通信(如 TTL 模块 / 单片机):
ESP32 TX2 (GPIO17) ——外部设备 RX
ESP32 RX2 (GPIO16) ——外部设备 TX
ESP32 GND ——外部设备 GND(必须共地)
波特率一致: 通信双方的波特率(如 115200)必须保持相同,否则会收到乱码。
引脚重映射: ESP32 的硬件串口非常灵活,可以通过 Serial2.begin(baud, config, rxPin, txPin) 将串口重映射到绝大多数通用的 GPIO 引脚上。
电平注意: ESP32 的逻辑电平为 3.3V。如果连接 5V 设备(如传统的 5V 串口模块),建议加装电平转换模块,避免损坏引脚。