首页 动态 版块 商城 我的
 退出
游客  
等级:
金币:
经验值:

UART串口 异步收发传输原理 树莓派Pico与ESP32单片机Python和C++例程【入门教程】

  11996 
 0
 2
RASPI   ydxhuo.com 

Image


一:UART串口通讯介绍

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种通用的串行通信协议,用于在两个设备之间进行异步数据传输。它不需要时钟信号同步,而是通过预先约定的波特率(数据传输速率)来保证数据正确传输。


在嵌入式系统中,UART 常用于:

与传感器、GPS 模块等外设通信

与电脑进行数据交互

两个微控制器之间的通信


1.UART 的工作原理

UART 通信使用两根线实现双向通信:

TX(Transmit):发送数据

RX(Receive):接收数据

通信过程中,每个数据帧通常包含:

起始位:表示数据传输开始

数据位:实际传输的数据(通常 8 位)

校验位(可选):用于简单的错误检测

停止位:表示数据传输结束


2.UART的引脚

一般在单片机/开发板上,UART引脚是可以灵活配置,默认常用的引脚标识为:UART0,TX,RX


二:Pico示

1.硬件连接

要在树莓派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 向它发送消息并查看接收结果。

2.示例代码

下面是一个使用树莓派 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()函数:检查并接收数据,将字节数据解码为字符串

主循环:每秒发送一条消息,并检查是否有接收的数据

三:ESP32示例

这是一个使用 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);
  }
}


1.接线说明

如需测试 UART2自发自收测试(Loopback): 可以直接用跳线将 GPIO16 (RX2) 和 GPIO17 (TX2) 短接。这样代码中从 Serial2 发送出去的数据会被自己接收到,并直接打印在串口监视器上。


与外部设备通信(如 TTL 模块 / 单片机):

ESP32 TX2 (GPIO17) ——外部设备 RX

ESP32 RX2 (GPIO16) ——外部设备 TX

ESP32 GND ——外部设备 GND(必须共地)


2.核心要点

波特率一致: 通信双方的波特率(如 115200)必须保持相同,否则会收到乱码。

引脚重映射: ESP32 的硬件串口非常灵活,可以通过 Serial2.begin(baud, config, rxPin, txPin) 将串口重映射到绝大多数通用的 GPIO 引脚上。

电平注意: ESP32 的逻辑电平为 3.3V。如果连接 5V 设备(如传统的 5V 串口模块),建议加装电平转换模块,避免损坏引脚。



作者签名: www.ydxhuo.com   楼主  2025-08-25 15:34:38
回复列表
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
您的IP: 216.73.216.115 , 2026-08-21 23:25:24
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
(2) 分享
分享

请保存二维码或复制链接进行分享

取消
免责声明
1、本站资源,均来自网络与个人作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !

侵权删除请致信 E-Mail:ydxho@qq.com
已有0次打赏