树莓派GPIO串口通信实战:从配置到调试的完整指南

张开发
2026/4/13 20:19:33 15 分钟阅读

分享文章

树莓派GPIO串口通信实战:从配置到调试的完整指南
1. 树莓派GPIO串口通信入门指南第一次接触树莓派串口通信时我也被各种专业术语搞得晕头转向。GPIO、UART、TTL这些名词听起来高大上其实理解起来并不复杂。简单来说GPIO就是树莓派上那些可以自由控制的小针脚而串口通信则是通过其中两个特定的针脚TX和RX来收发数据的一种方式。树莓派自带了硬件串口UART这个功能特别适合用来和其他设备对话。比如你可以用串口连接Arduino、传感器模块甚至是另一台树莓派。我最早是用它来调试没有屏幕的树莓派通过串口查看系统日志后来发现这个功能简直是个宝藏能做的事情太多了。要使用串口功能首先得了解树莓派的引脚定义。以常见的40针GPIO接口为例第8针GPIO14/TXD负责发送数据第10针GPIO15/RXD负责接收数据。这两个针脚就是我们要用到的硬件串口。需要注意的是不同型号的树莓派引脚排列可能略有不同建议在使用前先查清楚自己设备的引脚图。2. 硬件连接与准备工作2.1 所需材料清单开始动手前先检查下你手头有没有这些装备树莓派主板任何型号都可以但配置方法可能略有差异USB转TTL串口模块推荐使用CH340或CP2102芯片的便宜又好用杜邦线若干建议准备母对母和公对母各几根万用表非必须但排查问题时很有用我第一次尝试时用的是一块5块钱的USB转TTL模块结果死活不通后来才发现是模块质量问题。所以建议新手不要贪便宜买个20块左右的靠谱模块能省去很多麻烦。2.2 正确连接硬件硬件连接其实就三步但每个细节都很关键将USB转TTL模块的TXD引脚连接到树莓派的RXDGPIO15将模块的RXD连接到树莓派的TXDGPIO14将模块的GND连接到树莓派的GND这里有个新手常犯的错误把两边的TXD和TXD直接连在一起了这样当然无法通信。记住口诀发对收收对发地连地。还有一点要特别注意千万不要把USB转TTL模块的VCC接到树莓派的3.3V或5V上这样可能会烧毁设备连接完成后建议先用万用表检查下通断。我遇到过好几次杜邦线内部接触不良的情况排查了半天才发现是线的问题。3. 软件配置全流程3.1 启用串口功能树莓派默认是关闭串口功能的我们需要先开启它。有两个方法可以做到方法一图形界面配置在树莓派桌面点击左上角菜单选择Preferences Raspberry Pi Configuration切换到Interfaces标签页找到Serial Port选项选择Enable点击OK后重启系统方法二命令行配置适合无图形界面的情况sudo raspi-config然后在菜单中选择Interfacing Options Serial选择是启用串口最后重启。注意在较新的树莓派OS版本中你可能会看到两个串口选项。如果是用于设备通信记得选择不启用登录shell的选项。3.2 检查串口设备配置完成后我们可以检查下系统是否识别到了串口设备ls -l /dev/serial*正常情况下应该能看到类似这样的输出lrwxrwxrwx 1 root root 7 Apr 1 10:00 /dev/serial0 - ttyAMA0 lrwxrwxrwx 1 root root 7 Apr 1 10:00 /dev/serial1 - ttyS0这里的serial0就是我们主要使用的硬件串口。如果看不到这个设备说明前面的配置步骤可能有问题。4. Python串口通信实战4.1 安装必要库树莓派默认已经安装了Python但我们需要额外安装pyserial库sudo apt update sudo apt install python3-serial这个库封装了串口通信的各种细节用起来非常方便。4.2 编写第一个串口程序下面是一个最简单的发送Hello World的例子import serial import time # 初始化串口 ser serial.Serial( port/dev/serial0, baudrate9600, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, bytesizeserial.EIGHTBITS, timeout1 ) try: while True: message Hello from Raspberry Pi!\n ser.write(message.encode(utf-8)) print(fSent: {message.strip()}) time.sleep(1) except KeyboardInterrupt: print(Program terminated) finally: ser.close()保存为serial_test.py后用以下命令运行sudo python3 serial_test.py需要sudo权限是因为串口设备默认只有root用户有访问权限。4.3 接收数据示例如果你想同时接收数据可以这样修改代码# 在发送代码后面添加接收逻辑 received_data ser.readline().decode(utf-8).strip() if received_data: print(fReceived: {received_data})这个简单的例子展示了最基本的双向通信。在实际项目中你可能需要处理更复杂的数据协议比如Modbus或者自定义的二进制协议。5. 常见问题与解决方案5.1 串口设备不存在如果你发现/dev/serial0不存在可能是以下原因串口功能没有正确启用 - 重新检查raspi-config配置使用了错误的设备名 - 有些老教程会使用ttyAMA0但在新系统上可能已经变了内核模块没有加载 - 可以尝试手动加载sudo modprobe 82505.2 乱码问题终极解决方案乱码问题困扰了我整整一个周末试了各种方法都不行。最后发现是树莓派3/4的一个特殊问题蓝牙模块和串口共用了硬件资源。解决方法如下取出树莓派的SD卡插入电脑在boot分区找到config.txt在末尾添加dtoverlaypi3-miniuart-bt如果已有其他dtoverlay参数可以先注释掉修改同一目录下的cmdline.txt确保内容如下dwc_otg.lpm_enable0 consoletty1 root/dev/mmcblk0p2 rootfstypeext4 elevatordeadline fsck.repairyes rootwait注意要去掉所有consoleserial0或consolettyAMA0的配置保存文件插回树莓派重启这个方法之所以有效是因为它将蓝牙转移到软件实现的mini-UART把硬件串口完全释放出来给我们使用。5.3 权限问题如果你不想每次都用sudo运行Python脚本可以把自己的用户加入dialout组sudo usermod -a -G dialout $(whoami)然后注销重新登录即可。不过为了安全考虑生产环境中还是建议使用sudo。6. 高级应用与调试技巧6.1 使用minicom进行调试除了自己写Python程序还可以用minicom这个终端工具来测试串口sudo apt install minicom sudo minicom -D /dev/serial0 -b 9600常用快捷键CtrlA Z显示帮助菜单CtrlA X退出minicomCtrlA C清屏minicom特别适合快速测试串口连接是否正常我经常用它来确认硬件连接没有问题后再开始写代码。6.2 使用示波器分析信号如果你手头有示波器可以观察下串口信号波形。正常的UART信号应该是这样的起始位低电平数据位8位从低位到高位依次发送停止位高电平通过观察波形可以判断是否存在波特率不匹配、信号干扰等问题。我曾经用这个方法发现过一个因为导线过长导致的信号衰减问题。6.3 多串口应用树莓派的硬件资源有限但通过一些技巧可以实现多串口通信使用软件串口可以借助pigpio这样的库实现额外的软件串口使用USB转串口扩展一个树莓派可以连接多个USB转串口设备使用I2C或SPI转串口芯片如SC16IS752这类扩展芯片在实际项目中我经常同时使用硬件串口和USB转串口来连接多个设备这种方法既经济又可靠。7. 实际项目经验分享去年我用树莓派串口做了一个工业设备监控系统总结了一些实用经验长距离传输要加转换器当通信距离超过3米时建议使用RS485转换器普通的TTL电平抗干扰能力太差做好错误处理串口通信容易受干扰代码中一定要有完善的重试和超时机制数据校验很重要即使是简单的通信也建议加上校验和或CRC校验日志记录是关键所有收发数据都应该记录日志方便后期排查问题有个特别有意思的案例我们有个设备偶尔会收不到数据最后发现是因为树莓派USB接口供电不足导致串口模块工作不稳定。换成带外部供电的USB hub后就再没出现过问题。

更多文章