1. 树莓派5串口通信入门指南刚拿到树莓派5想做硬件开发串口通信绝对是你要掌握的第一个技能。简单来说串口就像两个设备之间的悄悄话通道不需要复杂的网络协议直接用几根线就能让设备互相传递数据。我在智能家居项目里经常用这个功能连接传感器比如让温湿度传感器把数据传给树莓派或者控制电机转动。树莓派5的串口配置和之前版本有些不同新手最容易踩三个坑第一是忘记启用硬件串口第二是搞错GPIO引脚映射第三是Python环境配置出错。上周我就遇到个学员折腾一整天才发现是虚拟环境没激活导致pyserial包找不到。别担心跟着我的步骤走20分钟就能搞定全套流程。2. 环境搭建与依赖安装2.1 Python环境配置树莓派5预装的Python可能不完整建议先执行这两个命令sudo apt update sudo apt install python3-full python3-venv我强烈推荐使用虚拟环境特别是当你同时做多个项目时。昨天就遇到个案例A项目需要pyserial 3.5版本B项目需要3.0版本不用虚拟环境绝对会冲突。创建虚拟环境的正确姿势是cd ~ mkdir uart_project cd uart_project python3 -m venv venv source venv/bin/activate看到命令行前面出现(venv)字样才算成功。这时候安装的包只会存在当前项目里。安装pyserial记得用这个命令pip install pyserial --upgrade2.2 硬件准备清单你需要准备这些硬件树莓派5主板必须杜邦线母对母3根USB转TTL模块推荐CH340芯片的万用表非必须但建议备着特别注意树莓派5的UART0引脚位置和树莓派4不同TXD是GPIO14物理引脚8RXD是GPIO15物理引脚10。上周我学生把线接错到GPIO0和GPIO1上结果数据死活传不过去。3. 系统配置关键步骤3.1 启用硬件串口运行配置命令sudo raspi-config按这个顺序选择Interface Options → Serial Port第一个问题选No禁用登录shell第二个问题选Yes启用硬件串口重启后重点检查两个地方ls -l /dev/serial0 cat /boot/firmware/config.txt | grep uart应该看到serial0 - ttyAMA0的软链接以及config.txt里有enable_uart1。如果没有手动添加这两行到config.txtenable_uart1 dtoverlayuart03.2 验证串口映射树莓派5有个特殊点默认情况下miniUART和PL011可能会抢串口设备名。用这个命令查看详细情况dtoverlay -a | grep uart正常应该看到uart0和uart1都启用。如果发现serial0映射到了ttyS0这是miniUART性能会差很多。解决方法是在config.txt加上dtoverlayuart0,txd0_pin14,rxd0_pin15 dtoverlayuart1,txd1_pin0,rxd1_pin14. Python脚本开发实战4.1 基础通信代码解析先看完整代码框架#!/usr/bin/env python3 import serial import time def main(): ser serial.Serial( port/dev/serial0, baudrate115200, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) try: while True: ser.write(bHello Raspberry Pi 5!\n) data ser.readline() print(fReceived: {data.decode().strip()}) time.sleep(1) except KeyboardInterrupt: print(程序终止) finally: ser.close() if __name__ __main__: main()几个关键参数说明baudrate常见值有9600、19200、38400、57600、115200。越高传输越快但容易出错timeout单位是秒设置太大会卡住程序太小会漏数据write()必须传bytes类型字符串要用encode()转换4.2 高级调试技巧遇到乱码怎么办按这个顺序排查先用minicom测试基础通信sudo apt install minicom minicom -D /dev/serial0 -b 115200检查两边波特率是否一致尝试在write()后加flush()ser.write(bdata) ser.flush()换用不同校验方式测试parityserial.PARITY_EVEN # 或者PARITY_ODD我常用的性能优化方法设置input_buffer_size参数增大缓冲区使用read_until()替代readline()处理特定结束符多线程处理收发逻辑5. 常见问题解决方案5.1 权限问题处理普通用户运行时报错Permission denied用这招sudo usermod -a -G dialout $USER然后注销重新登录。还是不行的话检查udev规则ls -l /dev/ttyAMA0应该显示crw-rw----权限。如果不对就用sudo chmod 666 /dev/ttyAMA05.2 数据丢失排查上周有个典型案例每20条数据就丢1条。最后发现是硬件问题用万用表测量GPIO电压正常应该是3.3V检查杜邦线接触不良轻轻晃动看数据是否中断降低波特率到9600测试稳定性在收发端之间加100欧姆电阻5.3 多设备连接方案需要接多个串口设备时推荐这两种方案使用USB Hub接多个USB转TTL模块启用树莓派5的第二个串口uart1dtoverlayuart1对应设备文件是/dev/ttyS06. 项目实战环境监测系统现在我们来做个真实项目通过串口接收DHT22传感器的温湿度数据。硬件连接如下传感器TX - 树莓派GPIO15(RXD)共地线连接Python代码改进版def parse_sensor_data(raw): try: temp, hum raw.split(,) return float(temp), float(hum) except: return None while True: ser.write(bGET_DATA\n) data ser.read_until(b\n) result parse_sensor_data(data.decode()) if result: temp, hum result print(f温度: {temp:.1f}℃ 湿度: {hum:.1f}%) time.sleep(2)数据格式建议用JSONimport json data {temp:25.5, hum:60} ser.write(json.dumps(data).encode() b\n)最后提醒几个注意事项长时间运行建议加看门狗机制关键数据要做校验和验证重要操作记录日志import logging logging.basicConfig(filenameuart.log, levellogging.INFO)