news 2026/4/19 21:14:25

树莓派串口通信数据收发:Raspberry Pi 4 图解说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派串口通信数据收发:Raspberry Pi 4 图解说明

树莓派串口通信实战指南:从接线到代码,一文打通 Raspberry Pi 4 的 UART 关键链路

你有没有遇到过这种情况:
精心写好 Python 脚本,接上 Arduino,结果串口死活收不到数据?
或者程序偶尔能通一下,但波特率一高就丢包、乱码频出?

别急——这几乎每个玩树莓派的人都踩过的坑。问题不在你的代码,而在于Raspberry Pi 4 的串口默认配置是“残废”的

今天我们就来彻底讲清楚:
为什么树莓派串口总出问题?怎么改才能让它真正稳定工作?以及如何用最简洁的方式实现可靠的数据收发。


一、你以为的串口,和真实的树莓派串口,根本不是一回事

我们先抛开代码和接线,聊点硬件底层的事。

在大多数单片机(比如 STM32 或 Arduino)上,UART 是独立外设,时钟稳定,性能可靠。但在 Raspberry Pi 4 上,情况复杂得多。

树莓派有两个 UART,但只有一个“能打”

名称设备节点特性
PL011 UART/dev/ttyAMA0高性能,独立时钟源,抗干扰强
mini-UART/dev/ttyS0功能弱,依赖 CPU 主频,负载波动会影响波特率

听起来好像两个都能用?错。
出厂设置下,蓝牙模块霸占了那个好用的 PL011 UART,只把 mini-UART 分配给了 GPIO14/TX 和 GPIO15/RX。

这意味着什么?

👉 即使你接对了线、写对了程序,只要系统负载稍有变化(比如风扇启动、内存交换),mini-UART 的波特率就会漂移,导致通信失败。

这就是为什么很多人发现:“低速还能通,115200 就不行”、“隔几分钟断一次”。

🔍 检查你现在用的是哪个串口:

ls -l /dev/serial*

如果输出是:

/dev/serial0 -> ttyS0

那你正在使用的是那个“瘸腿”的 mini-UART。


二、释放真正的高性能串口:三步操作,让/dev/serial0指向 PL011

我们要做的,就是把蓝牙踢开,把 PL011 UART 还给用户使用。

✅ 第一步:禁用蓝牙对串口的占用

编辑配置文件:

sudo nano /boot/config.txt

在文件末尾添加这一行:

dtoverlay=disable-bt

保存退出(Ctrl+O → Enter → Ctrl+X)。
这条指令会通过设备树覆盖(Device Tree Overlay)机制,切断蓝牙与 PL011 的绑定。

✅ 第二步:关闭串行控制台(Serial Console)

很多人不知道,树莓派默认会把串口当作系统日志输出端口。也就是说,Linux 内核启动信息、登录提示符都会从这里往外“喷”。

这个服务叫serial-getty@ttyS0.service,必须关掉。

执行以下命令:

sudo systemctl stop serial-getty@ttyS0.service sudo systemctl disable serial-getty@ttyS0.service

这样下次开机也不会自动启动。

✅ 第三步:重启并验证串口映射

重启树莓派:

sudo reboot

再次查看串口链接:

ls -l /dev/serial*

正确的输出应该是:

lrwxrwxrwx 1 root root 7 ... /dev/serial0 -> ttyAMA0

看到ttyAMA0了吗?恭喜,你现在用上了真正的高性能 UART!

📌 提示:推荐始终使用/dev/serial0而不是硬编码/dev/ttyAMA0/dev/ttyS0。因为它是系统提供的抽象符号链接,能在不同型号树莓派之间自动适配。


三、硬件接线不能再错:一张图说清 TX/RX/GND 怎么连

再好的软件配置,也救不了错误的物理连接。

来看这张关键图:

Raspberry Pi 4 ↔ 外部设备(如 Arduino) +-----------------------------+ +----------------------------+ | Pin 8: GPIO14 (TXD) | ----------------------> | RX 引脚 | | | | | | Pin 10: GPIO15 (RXD) | <---------------------- | TX 引脚 | | | | | | Pin 6: GND | <---------------------> | GND | +-----------------------------+ +----------------------------+

记住三个铁律:

  1. 交叉连接:你的 TX 接对方的 RX,反之亦然;
  2. 共地必接:GND 必须连在一起,否则没有参考电平,信号无效;
  3. 绝不直连 5V 设备:树莓派 GPIO 只能承受 3.3V,Arduino Uno 等 5V 板子直接连上去可能烧毁芯片!

⚠️ 电平转换怎么做才安全?

如果你非要连 5V MCU,有两种方案:

  • 低成本方案:用两个电阻做分压电路(例如 1kΩ + 2kΩ),将 5V TX 降到 ~3.3V 再接入树莓派 RX;
  • 专业方案:使用双向电平转换芯片,如 TXB0108、MAX3312,支持多通道、自动方向识别,更可靠。

我建议:初学者优先选择 3.3V 微控制器(如 ESP32、STM32),天然兼容,省心又安全。


四、Python 实现串口通信:一段可复用的核心代码

准备好硬件和系统后,终于可以写代码了。

我们使用pyserial库,它轻量、跨平台、文档丰富。

安装依赖

sudo apt update sudo pip3 install pyserial

核心代码:带容错机制的串口收发脚本

# serial_demo.py import serial import time # 使用抽象设备名,兼容性强 SERIAL_PORT = '/dev/serial0' BAUD_RATE = 115200 TIMEOUT = 1 def main(): try: # 初始化串口 ser = serial.Serial( port=SERIAL_PORT, baudrate=BAUD_RATE, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=TIMEOUT ) print(f"✅ 成功打开串口 {SERIAL_PORT},波特率 {BAUD_RATE}") while True: # 发送消息 message = "Hello from Pi!\n" ser.write(message.encode('utf-8')) print(f"📤 已发送: {message.strip()}") # 检查是否有返回数据 if ser.in_waiting > 0: response = ser.readline().decode('utf-8').strip() print(f"📥 收到回复: {response}") time.sleep(1) except serial.SerialException as e: print(f"❌ 串口异常: {e}") except KeyboardInterrupt: print("\n🛑 用户中断,准备退出...") finally: if 'ser' in locals() and ser.is_open: ser.close() print("🔌 串口已关闭") if __name__ == '__main__': main()

关键设计说明

技术点作用
timeout=1避免readline()永久阻塞
in_waiting > 0判断缓冲区是否有数据,避免空读
UTF-8 编码支持中文传输
异常捕获防止因拔线或权限问题导致程序崩溃
with不适用?因为需要循环读写,手动管理生命周期更清晰

运行方式:

python3 serial_demo.py

五、调试技巧:几个实用命令帮你快速定位问题

当通信不畅时,不要盲目重试。用工具一步步排查。

1. 查看当前有哪些串口设备

ls /dev/tty*

确认/dev/serial0存在且指向正确目标。

2. 用 screen 快速测试连通性

sudo screen /dev/serial0 115200

按下回车,如果对方有回应,你会立刻看到数据。按Ctrl+AKY退出。

3. 查看内核是否识别到串口

dmesg | grep tty

正常情况下应看到类似:

[ 0.000000] Kernel command line: ... console=tty1 ... [ 1.234567] dev:ttyAMA0 at MMIO 0x... is a PL011 rev3

4. 检查用户权限

确保你属于dialout组:

groups $USER

如果没有dialout,执行:

sudo usermod -aG dialout $USER

然后重新登录生效。


六、进阶思考:为什么树莓派要这么折腾?

你可能会问:厂商为什么不默认就把串口放开?

其实背后有合理的设计逻辑:

  • 蓝牙集成度高:Pi 3B+ 及以后型号将蓝牙/WiFi 模块深度整合,共用天线和电源;
  • 向后兼容考虑:早期 Pi 型号没有板载蓝牙,PL011 原本就用于外部通信;
  • 资源复用策略:在没有明确需求前,优先保障无线功能可用。

但这对我们开发者来说,意味着一个事实:
树莓派不是传统意义上的嵌入式开发板,而是一台微型计算机。它的外设是“共享资源”,需要用软件去“争取”。

所以,掌握设备树、systemd 服务管理和硬件抽象层,已经成为现代嵌入式开发的基本功。


最后一点建议:别只盯着串口,想想你要解决的问题

串口只是手段,不是目的。

你是想读取传感器数据?控制电机?还是做边缘网关?

与其花三天时间调通一根线,不如一开始就选对架构:

  • 如果需要多个串口,考虑 USB 转 TTL 模块(如 CP2102、FT232RL);
  • 如果距离较远,换成 RS485 + Modbus 协议更稳健;
  • 如果要联网上传,可以用串口转 WiFi(ESP-01S)或直接由树莓派走 MQTT;
  • 如果追求实时性,C/C++ 比 Python 更合适。

当你下次再遇到“树莓派串口不通”的问题时,不妨停下来问自己三个问题:

  1. 我现在的/dev/serial0指向的是ttyAMA0还是ttyS0
  2. 我的 TX/RX 是不是交叉连接的?
  3. 我有没有把 5V 接到了树莓派的 RX 上?

解决了这三个问题,90% 的串口故障就已经排除了。

剩下的,交给时间和经验。

如果你觉得这篇文章帮你避开了几个大坑,欢迎点赞分享。也欢迎在评论区留下你在串口通信中遇到的奇葩问题,我们一起拆解。

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

腾讯开源Hunyuan-A13B:高效MoE架构平衡性能与资源消耗

腾讯开源Hunyuan-A13B&#xff1a;高效MoE架构平衡性能与资源消耗 【免费下载链接】Hunyuan-A13B-Pretrain 腾讯开源Hunyuan-A13B大语言模型&#xff0c;采用细粒度MoE架构&#xff0c;800亿总参数仅激活130亿&#xff0c;高效平衡性能与资源消耗。支持256K超长上下文、混合推理…

作者头像 李华
网站建设 2026/4/17 16:50:02

PDFCompare 终极使用指南:5步掌握Java PDF文件对比

PDFCompare 终极使用指南&#xff1a;5步掌握Java PDF文件对比 【免费下载链接】pdfcompare A simple Java library to compare two PDF files 项目地址: https://gitcode.com/gh_mirrors/pd/pdfcompare PDFCompare是一款功能强大的Java PDF文件对比工具&#xff0c;通过…

作者头像 李华
网站建设 2026/4/12 20:28:56

腾讯Hunyuan-7B-FP8开源:256K上下文+双推理模式

腾讯Hunyuan-7B-FP8开源&#xff1a;256K上下文双推理模式 【免费下载链接】Hunyuan-7B-Instruct-FP8 腾讯Hunyuan-7B-Instruct-FP8开源大模型&#xff0c;支持快慢双推理模式与256K超长上下文&#xff0c;Agent能力领先BFCL-v3等基准。采用GQA与FP8量化技术实现高效推理&#…

作者头像 李华
网站建设 2026/4/14 1:20:27

QMK Toolbox完全指南:让键盘固件刷新变得简单直观

QMK Toolbox完全指南&#xff1a;让键盘固件刷新变得简单直观 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 键盘固件刷新是客制化键盘爱好者的必备技能&#xff0c;但传统命令行工具的…

作者头像 李华
网站建设 2026/4/15 12:16:02

Markn:重新定义Markdown阅读体验的轻量级查看器

Markn&#xff1a;重新定义Markdown阅读体验的轻量级查看器 【免费下载链接】markn Lightweight markdown viewer. 项目地址: https://gitcode.com/gh_mirrors/ma/markn 还在为Markdown文档的预览问题而烦恼吗&#xff1f;Markn作为一款专注于阅读体验的轻量级Markdown查…

作者头像 李华
网站建设 2026/4/19 19:28:10

Bilibili经典界面回归指南:让怀旧体验触手可及

Bilibili经典界面回归指南&#xff1a;让怀旧体验触手可及 【免费下载链接】Bilibili-Old 恢复旧版Bilibili页面&#xff0c;为了那些念旧的人。 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old 你是否还记得那个没有繁杂推荐、没有花哨特效的B站&#xff1…

作者头像 李华