1. 树莓派4串口资源全景解读
树莓派4相比前代产品最大的硬件升级之一就是新增了4个PL011串口控制器,加上原有的2个串口,总共提供了6个独立的UART通道。这个改进让树莓派4在工业控制、物联网网关等需要多设备通信的场景中展现出独特优势。
具体来看,树莓派4的串口资源分布如下:
- UART0(ttyAMA0):默认分配给蓝牙模块
- UART1(ttyS0):mini UART,性能较低
- UART2-UART5(ttyAMA1-ttyAMA4):新增的4个全功能PL011串口
这里有个重要认知需要纠正:很多教程一上来就教大家禁用蓝牙释放串口,这在树莓派0-3时代是必要操作,因为当时只有两个串口资源。但在树莓派4上完全没必要这么做——新增的4个串口已经足够应对大多数场景,保留蓝牙功能反而能扩展更多可能性。
2. 多串口硬件连接指南
2.1 GPIO引脚对应关系
树莓派的40针GPIO接口中,新增串口的引脚分配如下表所示:
| 串口 | TXD引脚 | RXD引脚 | 对应设备文件 |
|---|---|---|---|
| UART2 | GPIO0 | GPIO1 | /dev/ttyAMA1 |
| UART3 | GPIO4 | GPIO5 | /dev/ttyAMA2 |
| UART4 | GPIO8 | GPIO9 | /dev/ttyAMA3 |
| UART5 | GPIO12 | GPIO13 | /dev/ttyAMA4 |
实际接线时需要注意:
- 使用3.3V电平的USB-TTL转换器
- 务必交叉连接TX和RX(设备A的TX接设备B的RX)
- 共地连接是必须的,否则会出现通信异常
2.2 硬件准备清单
- 树莓派4开发板
- USB-TTL转换器(推荐CH340G或CP2102)
- 杜邦线若干
- 万用表(用于检查线路通断)
- 逻辑分析仪(可选,用于调试)
3. 系统配置全流程
3.1 检查可用串口
首先通过以下命令查看系统支持的串口资源:
dtoverlay -a | grep uart正常应该显示包括uart0-uart5在内的所有串口选项。
3.2 启用新增串口
编辑/boot/config.txt文件:
sudo nano /boot/config.txt在文件末尾添加以下内容(根据实际需要启用):
dtoverlay=uart2 dtoverlay=uart3 dtoverlay=uart4 dtoverlay=uart5保存后重启系统,使用以下命令验证:
ls /dev/ttyAMA*应该能看到ttyAMA0到ttyAMA4共5个设备文件(UART1使用ttyS0)。
4. Python串口通信实战
4.1 环境准备
安装Python串口库:
pip install pyserial4.2 自发自收测试
以UART2为例,将GPIO0(TXD)和GPIO1(RXD)用杜邦线短接,然后运行以下Python代码:
import serial ser = serial.Serial( port='/dev/ttyAMA1', baudrate=115200, timeout=1 ) test_msg = "Hello UART2" ser.write(test_msg.encode('utf-8')) response = ser.read(len(test_msg)) print(f"Sent: {test_msg}") print(f"Received: {response.decode('utf-8')}")4.3 多设备通信案例
假设需要连接三个设备:
- 温湿度传感器(UART2)
- PLC控制器(UART3)
- 显示屏(UART4)
Python多线程处理示例:
import serial import threading def uart_listener(port, callback): with serial.Serial(port, 115200) as ser: while True: data = ser.readline() callback(data) def temp_handler(data): print(f"[TEMP] {data.decode().strip()}") def plc_handler(data): print(f"[PLC] {data.decode().strip()}") threading.Thread( target=uart_listener, args=('/dev/ttyAMA1', temp_handler), daemon=True ).start() threading.Thread( target=uart_listener, args=('/dev/ttyAMA2', plc_handler), daemon=True ).start()5. 常见问题排查
5.1 权限问题
普通用户访问串口设备可能提示权限不足,解决方法:
sudo usermod -a -G dialout pi然后重新登录生效。
5.2 波特率不匹配
如果出现乱码,检查:
- 通信双方的波特率设置是否一致
- 硬件时钟是否稳定(mini UART有此问题)
- 线路是否存在干扰
5.3 数据丢失处理
建议采取的可靠性措施:
- 增加数据校验(如CRC)
- 实现重传机制
- 使用硬件流控(CTS/RTS)
- 降低波特率(长距离传输时)
实际项目中,我在一个智能农业系统中同时连接了环境传感器、灌溉控制器和LoRa网关,最初遇到数据错乱问题。后来发现是电源干扰导致,给每个串口设备单独增加0.1uF的去耦电容后通信变得非常稳定。