1. 初遇串口“失踪”:树莓派4B的独特现象

如果你刚从树莓派3B升级到4B,或者第一次在4B上折腾串口通信,大概率会碰到一个让人摸不着头脑的情况。按照网上流传多年的“祖传”教程,你信心满满地打开终端,输入 ls -l /dev/serial*,期待看到熟悉的 serial0 -> ttyS0 和 serial1 -> ttyAMA0 这对好兄弟。但现实却给你泼了一盆冷水:你很可能只看到一个孤零零的 serial1 -> ttyAMA0,serial0 和 ttyS0 这对组合直接“失踪”了。

我第一次遇到这情况时,也愣了好一会儿。心想,难道是系统镜像没刷好?或者是硬件坏了?反复重启、重刷系统,问题依旧。网上搜了一圈,发现大量教程都在讲树莓派3B/3B+,照着操作,比如去修改 /boot/config.txt,加上 enable_uart=1,结果要么没效果,要么把系统搞得更乱。这其实就是树莓派4B给我们挖的第一个“坑”:它的启动流程和固件配置方式,和它的前辈们有了本质的不同。

简单来说,树莓派4B引入了一个新的固件架构。在3B时代,/boot 目录下的 config.txt 是绝对的“老大”,所有配置都听它的。但到了4B,特别是使用 Ubuntu、Debian Bullseye 等较新系统时,/boot 目录下可能空空如也,真正的“指挥部”搬到了 /boot/firmware 下面。而且,配置的加载顺序也变了,存在一个“默认配置覆盖用户配置”的机制。如果你还在老地方用老方法,自然就会碰壁。所以,当你发现 serial0 和 ttyS0 不见时,别慌,这不是硬件故障,只是4B换了一套新的“游戏规则”,我们需要找到正确的入口。

2. 拨开迷雾:理解树莓派4B的串口“双胞胎”

要解决问题,得先搞清楚 ttyAMA0 和 ttyS0 到底是什么,以及 serial0 和 serial1 这两个“别名”又是怎么来的。你可以把树莓派的CPU(博通BCM2711)想象成一个多功能工具箱,里面装着两把不同的“螺丝刀”,也就是两个物理上的串口控制器。

第一把是专业级螺丝刀,名叫 PL011 UART。它功能强大、稳定可靠,时钟源独立,通信速率精准,还支持硬件流控(RTS/CTS)等高级功能。在系统里,它对应的设备文件就是 /dev/ttyAMA0。这把“好刀”默认被分配去干一件重要的事:驱动蓝牙(Bluetooth)模块。因为蓝牙通信对时序和稳定性要求很高,非它莫属。

第二把是迷你螺丝刀,名叫 Mini UART。它是PL011的一个简化版,功能比较基础,其时钟频率直接关联到CPU的主频。这意味着当CPU频率因负载变化而动态调整时,Mini UART的通信波特率可能会跟着漂移,导致数据出错。它在系统里对应的设备文件是 /dev/ttyS0。这把“小刀”默认被分配了一个相对简单的任务:作为控制台串口(Serial Console),也就是你可以通过USB转TTL线连接电脑,在终端里敲命令登录系统的那种方式。

那么 serial0 和 serial1 又是什么呢?它们不是实际的硬件,而是Linux系统为了方便我们使用而创建的符号链接,你可以理解为“快捷方式”。系统里有一个叫 udev 的规则,会根据 /boot 目录下的配置,动态决定把 serial0 这个好记的名字指向哪把“螺丝刀”(ttyAMA0 或 ttyS0),以及把 serial1 指向另一把。核心规则是:serial0 默认指向GPIO的14、15引脚(也就是我们常用来外接传感器、单片机的那两个针脚),而 serial1 默认指向蓝牙。

在树莓派3B/3B+的默认配置里,为了把稳定的PL011(ttyAMA0)留给我们用,系统会做一个“交换”:让 serial0(GPIO)指向 Mini UART(ttyS0),让 serial1(蓝牙)指向 PL011(ttyAMA0)。但树莓派4B的默认行为有时会更“固执”,特别是某些系统镜像下,它可能直接没启用 Mini UART,导致 ttyS0 这个设备根本就没创建,serial0 这个链接自然也就无处安放,于是就“失踪”了。

3. 第一步:让失踪的 serial0 和 ttyS0 现身

现在我们知道问题出在配置上。关键是要正确启用 Mini UART(ttyS0),并让系统建立正确的符号链接。很多过时的教程会直接让你修改 /boot/config.txt,但在树莓派4B的新架构下,这可能是无效甚至危险的。正确的位置是 /boot/firmware 目录。

首先,我们通过SSH或者桌面终端连接到你的树莓派4B。打开终端,先看看当前的状态:

ls -l /dev/serial*

如果只看到 serial1 -> ttyAMA0,那就证实了我们的判断。接下来,我们进入正确的配置目录:

cd /boot/firmware

这里非常重要: 请用 ls 命令查看一下,确认存在 config.txt 文件。有些系统(如Ubuntu Server)可能还会有 usercfg.txt 或 syscfg.txt。我们的原则是优先修改 config.txt,如果它里面引用了其他文件(比如有一行 include syscfg.txt),那我们可能需要去修改被引用的文件,或者在最后被加载的配置文件中添加设置。

现在,让我们用文本编辑器(如 nano,它比 gedit 在终端里更常用)打开配置文件:

sudo nano config.txt

在文件里,你需要寻找一行 enable_uart=0。这行命令的意思就是“禁用UART”。在树莓派4B的某些配置中,它可能默认就是0,导致串口功能没打开。我们的操作是:

  1. 找到 enable_uart=0 这一行,在行首加上一个 # 号把它注释掉,让它失效。这行就变成了 #enable_uart=0。
  2. 然后,在这行下面,或者文件的末尾(确保不在其他条件判断语句块内),新起一行,添加 enable_uart=1。

操作完成后,文件内容大致如下:

# 其他原有配置...
# 注释掉默认的禁用行
#enable_uart=0
# 添加启用命令
enable_uart=1

按 Ctrl+X,然后按 Y 确认,再按 Enter 保存并退出 nano 编辑器。

最后,重启你的树莓派4B,让配置生效:

sudo reboot

等待重启完成后,再次登录,运行检查命令:

ls -l /dev/serial*

这次,你应该能看到期待已久的两个链接了:serial0 -> ttyS0 和 serial1 -> ttyAMA0。恭喜你,失踪的串口找回来了!现在,GPIO 14/15引脚对应的就是 serial0(也就是 ttyS0,那个Mini UART),你可以用它进行基本的串口通信了。不过,由于Mini UART的稳定性问题,它可能只适合低速率、非实时的应用。

4. 第二步:性能升级,调换映射获取稳定硬件串口

如果你需要更高速、更稳定的串口通信(比如连接GPS模块、与STM32等单片机进行可靠数据交换),那么默认分配给蓝牙的PL011硬件串口(ttyAMA0)才是更好的选择。我们的目标,就是把 ttyAMA0 这个“专业螺丝刀”从蓝牙那里抢过来,分配给GPIO引脚使用。也就是实现映射调换:让 serial0(GPIO)指向 ttyAMA0,而让 serial1(蓝牙)指向 ttyS0。

这个过程需要两步:修改设备树(Device Tree)配置来剥离蓝牙对PL011的占用,并禁用蓝牙服务。

首先,再次编辑 /boot/firmware/config.txt 文件:

sudo nano /boot/firmware/config.txt

在文件的末尾,添加一行设备树叠加层(Device Tree Overlay)的配置:

dtoverlay=disable-bt

这行命令的作用是告诉内核:“加载一个叫 disable-bt 的配置片段,这个片段会把PL011 UART从蓝牙控制器那里释放出来。” 添加后保存退出。

接下来,我们需要停止并禁用系统自带的蓝牙服务,防止它尝试重新占用串口。在终端中输入:

sudo systemctl disable bluetooth
sudo systemctl stop bluetooth

disable 命令是禁止蓝牙服务开机自启,stop 命令是立即停止当前正在运行的蓝牙服务。

现在,再次重启树莓派:

sudo reboot

重启后,首先你会注意到桌面右上角(如果有桌面的话)的蓝牙图标消失了。然后我们进行关键验证:

ls -l /dev/serial*

如果一切顺利,你将看到映射关系已经成功调换:

  • /dev/serial0 -> ttyAMA0
  • /dev/serial1 -> ttyS0

这意味着,现在GPIO 14/15引脚上连接的是强大且稳定的PL011硬件串口(ttyAMA0)!你可以用 minicom、picocom 或者Python的 pyserial 库,以更高的波特率(如921600)与外部设备进行可靠通信了。而蓝牙功能则被转移到了性能较弱的Mini UART上,由于蓝牙通常已被禁用,所以这并无影响。

5. 深入原理:为什么3B的方法在4B上会失灵?

很多朋友会疑惑,为什么在3B上百试百灵的方法,到了4B就不管用了呢?甚至照着某些教程改完,系统直接启动失败。这背后是树莓派4B在固件和启动流程上的一次重要演进。

1. 固件分区变化: 树莓派4B采用了新的EFI兼容的固件启动方式。以前,/boot 分区通常是FAT32格式,所有固件和配置文件都放在这里。现在,很多现代Linux发行版(如Ubuntu 20.04+、Raspberry Pi OS Bullseye)为树莓派4B创建了一个独立的 /boot/firmware 分区,专门存放UEFI固件和启动配置。真正的“生效”的 config.txt 在这里,而根目录下的 /boot 可能只是个挂载点或者链接,甚至是空的。如果你修改错了文件,自然无法生效。

2. 配置覆盖链: 另一个关键点是配置的加载顺序和覆盖规则。在 /boot/firmware/config.txt 中,开头很可能有这样几行:

[all]
include syscfg.txt
include usercfg.txt

这表示它会先加载 syscfg.txt(系统预设配置),然后加载 usercfg.txt(用户自定义配置)。syscfg.txt 里可能就包含了 enable_uart=0 这样的默认设置。如果你直接在 config.txt 末尾添加 enable_uart=1,它可能会被后面加载的 syscfg.txt 中的 =0 再次覆盖掉!这就是为什么有时修改了却看不到效果。最稳妥的方法,是直接在 syscfg.txt 里修改,或者在最后被加载的 usercfg.txt 里添加配置,确保你的设置拥有最终决定权。

3. 设备树(DT)的强化: 树莓派4B更全面地使用设备树(Device Tree)来描述硬件。像 dtoverlay=disable-bt 这样的命令,就是动态修改设备树。在3B时代,有些硬件开关可能通过更简单粗暴的内核参数实现,而现在则需要通过标准的设备树叠加层来精确控制。理解这一点,就能明白为什么直接操作内核参数的老方法可能失效。

所以,在树莓派4B上玩转串口,核心心法就是:找准真正的配置目录(/boot/firmware),理解配置的加载顺序,并善用设备树叠加层(dtoverlay)这个强大的工具。 死记硬背命令行不通,理解其背后的逻辑才能以不变应万变。

6. 避坑指南与高级玩法

掌握了基本方法后,我们来看看实际操作中可能遇到的“坑”和一些进阶技巧。

常见坑点:

  • 坑点一:修改配置后无法启动。 这通常是因为在 config.txt 中键入了错误的命令或参数。比如 dtoverlay 拼写错误,或者参数格式不对。救砖方法是:将SD卡通过读卡器插入另一台电脑,挂载 /boot/firmware 分区,直接编辑错误的配置文件将其修正。
  • 坑点二:串口能发现但无法收发数据。 首先检查物理连接(TX接RX,RX接TX,GND接GND)。其次,使用 raspi-config 工具(sudo raspi-config -> Interface Options -> Serial Port)确保串口登录(Serial Console)功能被禁用。这个功能会占用串口,导致你的应用程序无法打开它。选择 “No” 来关闭通过串口的登录shell。
  • 坑点三:波特率不准或数据乱码。 如果你在使用调换前的 ttyS0(Mini UART),这很可能是由于其时钟依赖CPU主频。可以尝试在 config.txt 中强制固定CPU频率来稳定Mini UART:添加 core_freq=250 或 core_freq_min=250。但更一劳永逸的方案,还是按照本文步骤,换用 ttyAMA0。

高级玩法:启用更多串口 树莓派4B的BCM2711芯片其实隐藏了更多潜力,它最多支持6个UART(ttyAMA0 到 ttyAMA5)。默认只启用了两个,我们可以解锁更多。 例如,想启用 uart2(对应 ttyAMA1),只需在 /boot/firmware/config.txt 中添加:

dtoverlay=uart2

重启后,使用 ls /dev/ttyAMA* 查看,你会发现多出了 /dev/ttyAMA1。通过 dtoverlay -h uart2 可以查询其默认映射的GPIO引脚(通常是GPIO 0-3,即物理引脚27, 28)。这样你就拥有了第三个独立的硬件串口,可以同时连接更多串口设备。

验证与测试 配置完成后,如何测试串口是否工作正常?这里推荐一个简单的自环测试(Loopback Test)。将GPIO 14(TX)和 GPIO 15(RX)用杜邦线短接起来,这样自己发送的数据就会被自己接收。

  1. 安装串口调试工具:sudo apt install minicom
  2. 在一个终端启动minicom监听:minicom -b 115200 -o -D /dev/serial0 (根据你的映射,可能是 /dev/ttyAMA0 或 /dev/ttyS0)
  3. 在另一个终端用 echo 命令发送数据:echo \"Hello Raspberry Pi\" > /dev/serial0
  4. 观察第一个终端的minicom窗口,如果收到了“Hello Raspberry Pi”,那么恭喜你,串口通信完全正常!

折腾树莓派串口的过程,就像一次小小的硬件探险。从最初的“设备失踪”到最后的“稳定通信”,每一步问题的解决都建立在对系统更深一层的理解上。记住树莓派4B的配置路径和加载顺序这个关键差异,以后无论遇到什么外设问题,你都能更快地定位到症结所在。

更多推荐