3. 树莓派系统配置:启用UART接口、禁用蓝牙串口、重启验证

说实话,我第一次拿到树莓派想做串口通信时,也被这一步卡了半天。明明接好了线,代码也写对了,就是没反应。后来才发现——系统默认把UART给了蓝牙,根本没留给GPIO。

这一章,我们就来解决这个问题。说白了就是三件事:打开UART、关掉蓝牙占用、重启验证。每一步我都会把坑点指出来。

3.1 为什么需要手动配置?

树莓派默认的硬件设计里,UART0(也就是ttyAMA0)是分配给蓝牙模块的。GPIO 14/15上的那个串口,其实是mini UART(ttyS0),它依赖核心频率,不稳定。

我个人的习惯是:把主UART从蓝牙手里抢回来,给GPIO用。这样我们就能用稳定的硬件串口了。

串口设备 默认用途 特点
/dev/ttyAMA0 蓝牙(默认) 硬件UART,稳定,有FIFO
/dev/ttyS0 GPIO 14/15(默认) mini UART,依赖核心频率,不稳定

你想想看,做串口通信最怕什么?数据丢帧、波特率漂移。mini UART刚好两个都占。所以我们要做的,就是把ttyAMA0还给GPIO。

3.2 编辑 /boot/config.txt

这是树莓派的硬件配置文件。系统启动时,引导程序会读它来设置外设。

我个人习惯用nano来编辑:

sudo nano /boot/config.txt

在文件末尾,添加或修改以下几行:

# 启用UART接口
enable_uart=1

# 禁用蓝牙,把UART还给GPIO
dtoverlay=disable-bt

# 如果使用树莓派3/4/5,建议加上这句
core_freq=250

嗯,这里要注意:core_freq=250 这行,是为了让mini UART(如果你非要用它)有个稳定的时钟源。但既然我们已经把ttyAMA0抢回来了,这行其实不是必须的。我加上它,纯粹是习惯——万一哪天需要回退呢?

⚠️ 我曾经踩过的坑: 有次我忘了加 enable_uart=1,结果系统启动后,GPIO 14/15上完全没信号。折腾了两小时才发现,这行默认是0。记住:不加这行,串口就是关的。

3.3 禁用蓝牙串口服务

光改config.txt还不够。树莓派系统里,蓝牙服务会主动占用ttyAMA0。我们得把它停掉。

执行以下命令:

sudo systemctl disable bluetooth
sudo systemctl disable hciuart

这两条命令的作用:

  • disable bluetooth:关掉蓝牙服务本身
  • disable hciuart:关掉蓝牙和UART之间的连接服务

做完之后,最好再检查一下:

sudo systemctl status bluetooth

如果显示 disabled 就对了。

💡 小技巧: 如果你以后想恢复蓝牙,把上面两条的 disable 改成 enable 就行。config.txt里删掉 dtoverlay=disable-bt 那行。我一般会在改之前备份一下原文件:sudo cp /boot/config.txt /boot/config.txt.bak。

3.4 重启并验证

配置改完了,服务也关了。重启让配置生效:

sudo reboot

等系统重启后,登录进去,先看看串口设备有没有变化:

ls -l /dev/serial*

正常情况下,你会看到类似这样的输出:

lrwxrwxrwx 1 root root 5  ...  serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5  ...  serial1 -> ttyS0

注意看:serial0 指向了 ttyAMA0。这说明主串口已经成功从蓝牙手里抢回来了。

再用 dmesg 确认一下:

dmesg | grep ttyAMA

你应该能看到类似:

[    0.001234] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 114, base_baud = 0) is a PL011 rev2

看到 PL011 这个字眼了吗?那就是硬件UART,稳了。

✅ 验证清单:
  • ls -l /dev/serial* → serial0 指向 ttyAMA0
  • dmesg | grep ttyAMA → 显示 PL011 硬件串口
  • sudo systemctl status bluetooth → 显示 disabled

3.5 知识结构图

下面这张图,把整个配置流程串起来了。你可以把它当成一张「操作地图」:

树莓派UART启用流程 初始状态 编辑 /boot/config.txt enable_uart=1 dtoverlay=disable-bt core_freq=250 禁用蓝牙服务 sudo reboot 验证:ls -l /dev/serial* → serial0 指向 ttyAMA0

3.6 常见问题与排查

配置过程中,我遇到过不少问题。挑几个典型的说说:

  • 重启后蓝牙还在? 检查一下 /boot/config.txt 里有没有拼写错误。我犯过把 disable-bt 写成 disable-bluetooth 的错——少一个字母,整个配置就不生效。
  • serial0 还是指向 ttyS0? 说明 dtoverlay=disable-bt 没生效。用 dmesg | grep -i overlay 看看有没有报错。
  • 系统起不来了? 别慌。把SD卡插到电脑上,直接编辑 /boot/config.txt,把刚才加的行删掉或注释掉(行首加 #),就能恢复。
💡 我的经验: 每次改完 /boot/config.txt,我都会先 cat 一遍确认内容。别嫌麻烦,少个换行符都可能出问题。另外,改完一定要重启——这个配置不是热加载的。