树莓派串口通信实战指南:从接线到收发,零基础也能一次成功
你有没有遇到过这种情况——兴冲冲地把树莓派和Arduino连上,写好代码、通上电,结果串口死活没数据?或者更糟,树莓派直接重启了?
别急,这几乎是每个嵌入式新手都会踩的坑。而问题的根源,往往就出在最基础的硬件连接上。
今天我们就来彻底讲清楚:如何正确完成树莓派与外部设备的串口通信连接。不绕弯子,不堆术语,从一根线怎么接到每一伏电压都不能错,手把手带你打通第一道关卡。
一、先搞明白:串口到底是什么?
很多人一上来就想接线,但其实连“串口”是啥都没搞清。
简单说,串口就是两个设备之间“说话”的通道。它不像USB那样复杂,也不像网络需要IP地址,它是赤裸裸的电气信号对话。
树莓派用的是UART(通用异步收发器),关键词是“异步”——没有时钟线同步节奏,双方只能靠事先约定好的速度(波特率)来对拍子。就像两个人打电话,必须都说普通话、语速一致,才能听懂。
最常见的配置是115200, 8N1:
- 115200:每秒传11.5万比特
- 8位数据位
- N(No Parity):无校验
- 1个停止位
只要两边都设成这个,基本不会出错。
✅ 小贴士:如果你不确定该用什么波特率,优先选115200—— 快且稳定,调试神器。
二、树莓派上的串口引脚在哪?别插错了!
所有40针的树莓派(3B/4B/Zero等),串口硬件引脚位置都一样。我们重点关注三个:
| 物理引脚 | 功能 | GPIO编号 | 作用说明 |
|---|---|---|---|
| Pin 6 | GND | — | 接地!必须接! |
| Pin 8 | TXD | GPIO14 | 我发,你收 → 连对方RX |
| Pin 10 | RXD | GPIO15 | 我收,你发 ← 连对方TX |
记住一句话:你的TX接它的RX,它的TX接你的RX,GND共用。
千万别犯低级错误——把TX接TX,RX接RX,那等于两个人面对面喊“我听你说”,谁也听不见。
📌重点提醒:
树莓派的GPIO是3.3V逻辑电平,最大耐压约3.6V。如果直接接5V设备(比如经典Arduino Uno),轻则读数不准,重则烧毁IO口甚至整个主板!
所以接下来这一节,关乎“生死”。
三、电平匹配:3.3V vs 5V,怎么安全对接?
这是最容易翻车的地方。
情况1:对方也是3.3V设备(如ESP32、STM32)
✅ 直接连!
TX → RX
RX ← TX
GND ↔ GND
干净利落,无需转换。
情况2:对方是5V设备(如Arduino Uno)
⚠️ 危险!不能直连!
尤其是Arduino的TX脚输出5V,接到树莓派RX(GPIO15)会超压!
解决方案①:分压电阻法(低成本推荐)
只改从5V到3.3V的方向(即Arduino TX → Pi RX),另一方向可以直连(因为Pi TX输出3.3V,Arduino能识别)。
电路如下:
Arduino TX (5V) │ ┌┴┐ │ │ R1 = 4.7kΩ └┬┘ ├────→ Raspberry Pi RX (GPIO15) ┌┴┐ │ │ R2 = 10kΩ └┬┘ │ GND计算一下:
$$ V_{out} = 5V × \frac{10k}{4.7k + 10k} ≈ 3.39V $$
接近3.3V,安全!
📝 实测建议:R1可用4.7k或5.1k,R2用10k,误差范围内都能稳定工作。
解决方案②:专用电平转换模块(推荐用于双向高速通信)
比如TXS0108E、HX711模块(带电平转换功能)、MAX3232(RS232转TTL)等。
优点:
- 支持多路信号
- 双向自动转换
- 更可靠,适合长期运行项目
缺点:贵一点,多占点空间。
💡 建议:初学者先用电阻分压练手;正式项目上,直接焊个电平转换芯片省心又安全。
四、软件准备:让硬件真正“活”起来
硬件接好了,还得告诉系统:“别把串口拿去当登录终端用了。”
否则你会发现/dev/ttyAMA0根本不存在,或者被占用。
步骤1:关闭串口控制台登录
运行:
sudo raspi-config进入菜单:
Interface Options → Serial Port
弹出两个问题:
1.Would you like a login shell to be accessible over serial?
→ 选No(禁用shell登录)
- Do you want the serial port hardware to be enabled?
→ 选Yes(启用UART硬件)
保存退出,重启。
步骤2:验证设备是否就绪
重启后执行:
ls /dev/ttyAMA*正常应看到:
/dev/ttyAMA0如果没有,检查是否启用了蓝牙(在Pi 3/Zero W中,蓝牙默认占用了主UART)。解决办法是在/boot/config.txt中添加:
dtoverlay=disable-bt然后禁用蓝牙服务:
sudo systemctl disable hciuart再重启即可释放/dev/ttyAMA0。
五、动手测试:用Python接收第一行数据
现在轮到最关键的一步:收数据。
确保安装了pyserial:
pip install pyserial创建一个监听脚本:
import serial import time # 配置串口 ser = serial.Serial( port='/dev/ttyAMA0', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) print("等待串口数据...") try: while True: if ser.in_waiting: line = ser.readline().decode('utf-8', errors='ignore').strip() if line: print(f"收到: {line}") except KeyboardInterrupt: print("\n退出") finally: ser.close()保存为serial_read.py,运行:
python serial_read.py然后在Arduino端发送点东西,比如:
void setup() { Serial.begin(115200); } void loop() { Serial.println("Hello from Arduino!"); delay(1000); }如果一切顺利,你会在树莓派终端看到:
收到: Hello from Arduino! 收到: Hello from Arduino! ...🎉 成功了!你已经完成了第一次完整的串口通信。
六、常见问题 & 调试秘籍
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 完全没数据 | 接线反了 | 检查TX/RX是否交叉连接 |
| 数据乱码 | 波特率不一致 | 双方统一为115200 |
| 树莓派重启 | 接入5V信号 | 加分压电路或换电平转换模块 |
| 有时断连 | 没共地 | 补接GND线!非常重要! |
/dev/ttyAMA0不存在 | UART被禁用或蓝牙抢占 | 用raspi-config启用 + 关闭蓝牙 |
🔧 调试技巧:
- 用万用表测GND是否导通
- 用示波器或逻辑分析仪看TX波形(进阶)
- 先用echo "test" > /dev/ttyAMA0测试发送能力
- 权限问题?把你加入dialout组:bash sudo usermod -aG dialout $USER
七、最佳实践:老司机的经验总结
永远先接GND
再接信号线。避免热插拔导致电压冲击。标记清楚每根线
用不同颜色杜邦线:绿色=TX,蓝色=RX,黑色=GND,养成习惯。不要用树莓派给大电流设备供电
如电机、继电器。外设尽量独立供电,只共享地线。高频干扰环境加保护
在信号线上串联100Ω电阻,并加TVS二极管防静电。PCB设计预留调试接口
引出UART到排针或CH340模块插座,方便后期升级维护。
结尾:这只是开始
当你第一次看到那句“Hello from Arduino!”出现在屏幕上时,你就已经跨过了嵌入式开发的第一道门槛。
串口不只是通信手段,它是你与硬件“对话”的起点。后续的I²C、SPI、Modbus,甚至是自定义协议解析,都建立在这份最基本的连接之上。
所以别小看这几根线、几个电阻、一段Python脚本。它们是你通往机器人、物联网、工业自动化世界的钥匙。
下次,我们可以聊聊:如何通过串口远程控制树莓派、传输传感器数据并绘图显示,甚至做一个属于自己的监控面板。
如果你正在尝试连接某个具体模块(GPS、LoRa、RFID……),欢迎留言,我可以为你定制接线方案。
一起玩转硬件,不见不散。