树莓派串口通信实战:从插针定义到稳定连接的完整指南
你有没有遇到过这样的情况?
刚把树莓派和STM32用杜邦线连上,烧录好代码,满怀期待打开串口助手——结果屏幕一片空白。再一查,发现树莓派的GPIO口居然发热了……
别急,这多半不是硬件坏了,而是UART接错了。
在嵌入式开发中,串口通信(UART)是最基础、也最容易“翻车”的环节之一。尤其对初学者来说,面对树莓派那40个密密麻麻的引脚,稍不注意就会把TX接到TX,或者误将5V信号直连3.3V引脚,轻则通信失败,重则烧毁IO口。
本文将带你彻底搞懂:树莓派上的UART到底怎么用?哪些引脚能用?如何安全连接外部设备?程序又该怎么写?
我们不讲空理论,只聚焦实战细节,一步步拆解从物理接线到代码通信的全过程。
为什么是UART?它凭什么不可替代?
先问一个问题:I²C、SPI、USB、网络都能传数据,为啥还要用UART?
因为——它简单、可靠、调试友好。
想象一下,你的树莓派系统突然无法启动,SSH连不上,显示器也没输出。这时候,如果没接串口,你就像个盲人摸象;但只要接上UART,就能看到完整的Bootloader日志、内核启动信息、登录提示……所有关键线索一目了然。
这就是UART的核心价值:它是系统的“生命线”。
而且,相比其他协议:
- I²C虽然省线,但距离短、易受干扰,且需要上拉电阻;
- SPI速度快,但接线复杂,主从结构固定;
- USB转TTL看似方便,实则引入额外芯片和驱动依赖。
而UART呢?两根数据线 + 一根地线,三点连线,即可实现全双工通信。命令行交互、日志输出、MCU协同——它几乎贯穿了整个嵌入式开发流程。
树莓派上的UART引脚,到底在哪?
树莓派4B、3B+等主流型号都配有40针GPIO排针。虽然外观统一,但很多人栽在了一个致命误区:混淆物理引脚号和BCM编号。
两种编号,千万别搞混!
| 类型 | 特点 | 使用场景 |
|---|---|---|
| 物理引脚号(Pin Number) | 从1开始顺序编号,按位置数就行 | 接线时对照实物 |
| BCM GPIO编号 | SoC内部逻辑编号,编程必须用这个 | 写代码、配置设备树 |
比如:
-物理Pin 8→ 对应BCM GPIO14
-物理Pin 10→ 对应BCM GPIO15
这两个就是我们要找的UART核心引脚。
UART关键引脚一览
| 功能 | BCM编号 | 物理引脚 | 方向说明 |
|---|---|---|---|
| TXD(发送) | GPIO14 | Pin 8 | 树莓派向外发数据 |
| RXD(接收) | GPIO15 | Pin 10 | 树莓派接收外部数据 |
| GND | —— | Pin 6 / 9 / 14 / 20 等 | 必须共地! |
📌 记住一句话:Pin 8 是 TX,Pin 10 是 RX。
你可以把它贴在开发板旁边,避免每次都要查文档。
⚠️ 常见错误:把树莓派的TX接到另一块开发板的TX。这是典型的“同极相连”,等于两个人对着喊话却没人听——自然没法通信。
实际怎么接?三步搞定交叉连接
UART通信的基本规则就一条:发送对接接收,接收对接发送。
具体接法如下:
[树莓派] [目标设备(如STM32/Arduino)] Pin 8 (TX) ─────────────→ RX Pin 10 (RX) ←───────────── TX Pin 6 (GND) ────────────── GND✅ 正确姿势:
- 树莓派发送 → 对方接收
- 树莓派接收 ← 对方发送
- 双方共地
❗ 绝对禁止:
- TX 接 TX
- RX 接 RX
- 不接GND
尤其是最后一点:没有共地,就没有通信。即使两边电源独立,也必须通过GND建立参考电平,否则信号会漂移,导致误码甚至损坏接口。
电平不匹配?小心3.3V遇上5V!
树莓派的GPIO工作电压是3.3V TTL电平,最大耐压约3.6V。而一些老款Arduino(如Uno)、某些传感器模块使用的是5V逻辑。
如果你直接把5V的TX接到树莓派的RX(Pin 10),相当于给一个只能承受3.6V的引脚加了5V电压——轻则通信异常,重则永久性损坏SoC。
怎么办?两个解决方案:
方案一:使用电平转换模块(推荐)
买一块基于TXS0108E或HX711常用双向电平芯片的转换板,成本几块钱,支持多通道自动电平转换,安全又省心。
接法示例:
[5V MCU] TX → LV1 → HV1 → [Level Shifter] → HV2 → RV2 → Pi_RX (GPIO15) ↑ ↓ 3.3V 5V这类模块可以双向通信,完全透明传输,适合长期项目。
方案二:电阻分压法(临时应急)
如果只是单向接收5V信号(例如MCU→Pi),可以用两个电阻做一个简单的分压电路:
MCU_TX ──┬───[4.7kΩ]───→ Pi_RX │ [10kΩ] │ GND计算一下:
分压比 = 10 / (4.7 + 10) ≈ 0.68
5V × 0.68 ≈ 3.4V,在安全范围内。
⚠️ 注意:此方法仅适用于单向通信,且不能反向驱动5V设备。长期使用建议还是用电平转换模块。
软件准备:让UART真正可用
你以为插上线就能通?不一定。默认情况下,树莓派的UART可能被系统占用,用来输出启动日志。
这意味着:你的Python程序根本抢不到串口资源。
必须手动释放!
方法一:用raspi-config(最推荐)
sudo raspi-config进入 →Interface Options→Serial Port
然后选择:
- ❌ 是否启用串口登录 shell? →No
- ✅ 是否启用硬件串口? →Yes
保存退出,重启生效。
这个操作会自动完成两件事:
1. 禁用串口控制台(不再输出Linux启动信息)
2. 启用/dev/serial0设备节点供用户程序使用
方法二:手动修改配置文件
编辑/boot/config.txt
# 释放PL011 UART,禁用蓝牙占用(Raspberry Pi 3/4常见问题) dtoverlay=disable-bt # 强制启用UART enable_uart=1(旧系统)编辑/boot/cmdline.txt
删除类似console=serial0,115200或console=ttyS0,115200的参数。
保存后重启。
Python代码实战:轻松读取串口数据
一切就绪后,就可以用Python收发数据了。
安装依赖
pip install pyserial示例代码:监听串口并打印消息
import serial import time # 打开串口 ser = serial.Serial( port='/dev/serial0', # 主UART设备(符号链接) baudrate=115200, # 波特率必须一致 parity=serial.PARITY_NONE, # 无校验位 stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 读取超时,避免阻塞 ) print("正在监听串口...") try: while True: if ser.in_waiting > 0: # 有数据到达 data = ser.readline().decode('utf-8').strip() print(f"收到: {data}") except KeyboardInterrupt: print("\n用户中断") finally: ser.close()🔍 关键点解析:
-port='/dev/serial0':这是指向当前激活UART的通用路径,兼容性强;
-baudrate=115200:与对方设备严格一致,否则会出现乱码;
-timeout=1:防止readline()永久阻塞;
-.decode('utf-8'):将字节流转为可读字符串。
你可以用这块代码接收来自STM32的传感器数据、GPS坐标,甚至是自定义指令。
典型应用场景:树莓派 + STM32 构建边缘网关
来看一个真实项目案例:
[温湿度传感器] → [STM32] ←UART→ [树莓派] ←WiFi→ [云平台]在这个架构中:
-STM32负责实时采集DHT11、MQ-2等模拟/数字传感器;
- 数据打包成JSON格式,通过UART以115200bps发送给树莓派;
-树莓派接收后解析数据,通过MQTT上传至阿里云IoT或Home Assistant;
- 用户可通过手机App远程查看环境状态。
整个系统分工明确:MCU处理实时任务,树莓派专注网络与存储。而连接它们的纽带,正是UART。
常见问题排查清单
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 完全无输出 | 串口被禁用或控制台占用 | 运行sudo raspi-config启用硬件串口 |
| 收到乱码 | 波特率不一致 | 双方确认均为9600/115200等标准值 |
| 间歇性断连 | 共地不良或电源噪声 | 检查GND连接,增加去耦电容 |
| 接收正常但无法发送 | 发送端未供电或线路断开 | 用万用表测TX线是否有信号跳变 |
| IO口发热甚至烧毁 | 接入5V信号未做电平转换 | 加电平转换模块,或改用3.3V MCU |
💡 小技巧:
使用USB转TTL模块(CH340G/CP2102)连接PC,配合串口助手(如PuTTY、SSCOM)抓包分析,能快速定位通信问题。
提升稳定性:几个工程师才知道的最佳实践
- 加限流电阻:在TX/RX线上串联330Ω电阻,防短路更安心;
- 优先使用标准波特率:如9600、19200、115200,减少时钟误差累积;
- 设计通信协议:加入帧头(如0xAA)、长度字段、CRC校验,提升抗干扰能力;
- 远距离通信考虑隔离:超过1米建议使用光耦或磁耦隔离模块,防止地环路干扰;
- 调试阶段保留串口访问权限:未来升级无显示器设备时,串口将是唯一的调试入口。
写在最后
UART看似古老,却是嵌入式世界中最值得信赖的通信方式之一。
掌握树莓派上的UART连接方法,不只是学会接几根线那么简单。它意味着你能:
- 快速定位系统启动故障;
- 实现树莓派与各类MCU的无缝协作;
- 构建稳定可靠的边缘计算节点;
- 在无网络、无显示的环境下依然掌控全局。
下一次当你拿起杜邦线时,请默念三遍:
TX连RX,RX连TX,务必共地
愿每一次连接,都安全、稳定、成功。
如果你在实践中遇到了特殊问题,欢迎留言讨论,我们一起解决。