news 2026/4/16 14:59:51

手把手教你完成树莓派串口通信初始设置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你完成树莓派串口通信初始设置

树莓派串口通信实战:从接线到Python收发,一文搞定

你有没有遇到过这种情况——手里的树莓派连上了GPS模块,代码也写好了,可就是收不到数据?或者和Arduino对讲半天,收到的全是乱码?

别急,问题很可能出在串口配置上。

虽然树莓派自带UART硬件,但出厂默认设置却“锁死了”这个接口:系统用它当登录控制台,蓝牙又占了主串口……新手直接操作基本必踩坑。今天我们就来彻底打通这条通信链路,让你的树莓派真正“说上话”。


为什么你的树莓派串口总是不通?

先别急着写代码,咱们得搞清楚一个关键事实:

树莓派上的/dev/ttyAMA0/dev/ttyS0不是同一个东西,性能差得远。

  • /dev/ttyAMA0是 PL011 UART,硬件级、高稳定性,支持高达921600bps以上波特率;
  • /dev/ttyS0是 mini-UART,依赖CPU核心频率,动态调频时容易失步,只适合低速通信;

而在树莓派3B+、4B这类带蓝牙的型号中,默认情况下:
- 蓝牙模块霸占了原本属于用户的PL011 UART(即/dev/ttyAMA0);
- 用户能用的只剩下一个不稳定的mini-UART(变成/dev/ttyS0);

结果就是:你明明接对了线,程序也在跑,但数据要么错乱,要么断断续续。

所以,想实现稳定可靠的树莓派串口通信,第一步不是写代码,而是把被抢走的主串口夺回来


硬件准备:接对这三根线就够了

开始前,请确认你的接线方式正确无误。

以最常见的与Arduino通信为例:

树莓派 GPIO功能Arduino 引脚
Pin 8 (GPIO14 / TXD)发送端(TX)→ 接对方RXRX
Pin 10 (GPIO15 / RXD)接收端(RX)← 接对方TXTX
Pin 6 (GND)共地GND

⚠️ 特别注意:
-交叉连接!树莓派TX → 对方RX,反之亦然;
- 必须共地,否则信号无法参考;
- 树莓派GPIO仅支持3.3V逻辑电平,严禁接入5V设备(如老款Arduino Uno),否则可能烧毁IO口!

若需连接5V系统(比如传统单片机),请务必使用双向电平转换芯片(如TXS0108E或MAX3312)进行隔离保护。


四步解锁高性能串口资源

第一步:关闭串口控制台登录

系统启动时默认通过串口输出shell登录提示,这会占用UART通道。

我们用官方工具一键关闭:

sudo raspi-config

进入菜单路径:

Interface Options → Serial Port
- Would you like a login shell accessible over serial? →No
- Do you want the serial port hardware to be enabled? →Yes

这个操作会自动完成两件事:
1. 从/boot/cmdline.txt中移除console=serial0,115200
2. 在/boot/config.txt中添加enable_uart=1

前者释放了串口控制台,后者确保UART驱动始终启用。


第二步:强制释放主UART给用户使用

打开配置文件:

sudo nano /boot/config.txt

确保包含以下两行:

enable_uart=1 dtoverlay=disable-bt

解释一下这两个参数的作用:

  • enable_uart=1:强制启用UART硬件,防止系统因节能而关闭;
  • dtoverlay=disable-bt:禁用蓝牙服务对PL011 UART的占用,让/dev/ttyAMA0回归用户手中;

📌 小贴士:如果你还想保留蓝牙功能怎么办?
可以考虑使用外部晶振+设备树定制方案(高级玩法),但对于绝大多数串口应用场景来说,直接关掉蓝牙是最简单有效的选择。


第三步:关闭蓝牙相关服务(可选但推荐)

即使禁用了蓝牙overlay,系统仍可能尝试加载蓝牙串口服务。为避免冲突,手动关闭它:

sudo systemctl disable hciuart

然后重启:

sudo reboot

第四步:验证设备节点是否就绪

重启后,检查主串口设备是否存在:

ls /dev/ttyAMA0

如果看到输出/dev/ttyAMA0,说明成功了!

再运行一次:

dmesg | grep tty

你应该能看到类似信息:

[ 0.000000] console [tty1] enabled [ 0.000000] printk: console [tty1] disabled [ 1.234567] dev:f1: ttyAMA0 mapped to IRQ0

这表明PL011 UART已正常加载且未被抢占。


Python串口通信实战:发送与接收全解析

现在硬件通了,轮到软件登场。

我们使用轻量高效的pyserial库来操控串口。

安装依赖

pip install pyserial

编写第一个串口程序

下面这段代码不仅能发数据,还能监听回应,适用于调试任何串口设备(比如Arduino、传感器、PLC等):

import serial import time # 配置参数 SERIAL_PORT = '/dev/ttyAMA0' # 主UART设备 BAUD_RATE = 115200 # 波特率(需与对方一致) TIMEOUT = 1 # 读取超时(秒) try: # 初始化串口 ser = serial.Serial( port=SERIAL_PORT, baudrate=BAUD_RATE, parity=serial.PARITY_NONE, # 无校验位 stopbits=serial.STOPBITS_ONE, # 1个停止位 bytesize=serial.EIGHTBITS, # 数据位长度 timeout=TIMEOUT # 设置read超时 ) print(f"✅ 已连接至 {SERIAL_PORT} @ {BAUD_RATE}bps") while True: # 发送消息 msg_out = "Hello from Pi!\n" ser.write(msg_out.encode('utf-8')) print(f"📤 发送: {msg_out.strip()}") # 检查是否有返回数据 if ser.in_waiting > 0: try: data = ser.readline().decode('utf-8').rstrip() print(f"📥 接收: {data}") except UnicodeDecodeError: print("⚠️ 接收到无效编码数据(可能是波特率不匹配)") time.sleep(1) except PermissionError: print("❌ 权限不足!请将用户加入 dialout 组:sudo usermod -aG dialout $USER") except serial.SerialException as e: print(f"🔧 串口异常:{e}") except KeyboardInterrupt: print("\n👋 用户中断,正在关闭...") finally: if 'ser' in locals() and ser.is_open: ser.close() print("🔌 串口已安全关闭")

🎯 关键点说明:

  • 使用in_waiting判断缓冲区是否有数据,避免阻塞;
  • 加入异常处理,防止因乱码或断开导致程序崩溃;
  • 所有字符串必须.encode()后才能发送;
  • 若提示权限错误,请执行:
    bash sudo usermod -aG dialout $USER
    并重新登录生效。

常见问题避坑指南

现象可能原因解决方法
根本打不开/dev/ttyAMA0没有权限加入dialout用户组
收到一堆乱码波特率不一致双方统一设为115200
只能发不能收TX/RX接反了交叉连接检查线路
数据时有时无使用的是/dev/ttyS0添加dtoverlay=disable-bt
串口频繁断开系统休眠或服务干扰禁用hciuart服务
接5V设备后板子异常电平不匹配必须加电平转换器

💡 进阶建议:
- 对于工业环境,建议增加光耦隔离模块防干扰;
- 多设备通信可选用USB转多串口HUB或SPI扩展芯片;
- 在生产项目中加入CRC校验、重试机制提升鲁棒性;


实际应用场景举例

想象这样一个系统:

[温湿度传感器] ↓ (串口) [Arduino Pro Mini] ↓ (串口) [树莓派] ←→ WiFi → [云平台] ↓ (存储) [本地数据库]

树莓派在这里扮演“智能网关”角色:
- 通过串口定期向MCU请求数据;
- 收集JSON格式的环境信息;
- 存入SQLite做本地缓存;
- 同时上传至阿里云IoT或MQTT服务器;

这种架构广泛应用于:
- 智能农业监控系统
- 工业设备状态采集
- 实验室数据记录仪
- 机器人主控通信中枢

而这一切的基础,正是可靠的树莓派串口通信能力。


写在最后:掌握底层,才能掌控全局

很多人觉得树莓派是个“小电脑”,插上网线就能玩AI、跑网页。但真正让它在嵌入式领域站稳脚跟的,其实是这些看似原始的接口——GPIO、I2C、SPI、UART

尤其是串口,作为最古老也最稳健的通信方式之一,在现代IoT系统中依然不可替代。

当你学会如何干预设备树、管理服务冲突、精准配置硬件资源时,你就不再只是一个“使用者”,而是一名真正的系统开发者。

下次如果你的串口又没反应,别再盲目百度“为什么读不到数据”了。停下来问自己一句:

“我有没有真正拥有/dev/ttyAMA0的控制权?”

答案往往就在其中。


💬互动时间:你在做树莓派串口项目时踩过哪些坑?欢迎在评论区分享你的经验,我们一起排雷!

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:47:38

MIPS/RISC-V ALU功能验证:实战测试案例

MIPS/RISC-V ALU功能验证实战:从设计原理到高覆盖测试你有没有遇到过这样的情况——处理器明明“看起来”跑通了,但在某个特定计算场景下突然输出错误结果?比如两个大正数相加得到一个负数,或者负数右移后变成了正数……这类问题的…

作者头像 李华
网站建设 2026/4/15 9:37:17

揭秘Open-AutoGLM网页端操作难点:3步实现高效AI建模

第一章:Open-AutoGLM网页端怎么用Open-AutoGLM 是一款基于大语言模型的自动化代码生成工具,其网页端提供了直观的操作界面,帮助开发者快速生成高质量代码。用户无需本地部署,只需通过浏览器访问即可使用全部功能。准备工作 确保网…

作者头像 李华
网站建设 2026/3/22 6:00:09

Ohook Office功能解锁工具:轻松体验完整功能

Ohook Office功能解锁工具:轻松体验完整功能 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 你是…

作者头像 李华
网站建设 2026/4/16 13:55:42

Python for Android终极指南:免Java开发安卓应用完整教程

Python for Android终极指南:免Java开发安卓应用完整教程 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python for Android是一个革命性的开源工…

作者头像 李华
网站建设 2026/4/16 13:53:21

为什么DJI H20T热成像点测温功能在Payload-SDK中无法使用?

为什么DJI H20T热成像点测温功能在Payload-SDK中无法使用? 【免费下载链接】Payload-SDK DJI Payload SDK Official Repository 项目地址: https://gitcode.com/gh_mirrors/pa/Payload-SDK 作为无人机开发者,当你满怀期待地想要为Matrice 300 RTK…

作者头像 李华
网站建设 2026/4/16 6:58:36

旅行规划AI伴侣:行程单+攻略文档一键智能问答

旅行规划AI伴侣:行程单攻略文档一键智能问答 在计划一次跨国旅行时,你是否曾经历过这样的场景?打开电脑,桌面上堆着十几个文件:PDF格式的签证指南、Word版的每日行程、Excel列出的餐厅清单、Markdown记下的注意事项………

作者头像 李华