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 指向 ttyAMA0dmesg | grep ttyAMA→ 显示 PL011 硬件串口sudo systemctl status bluetooth→ 显示 disabled
3.5 知识结构图
下面这张图,把整个配置流程串起来了。你可以把它当成一张「操作地图」:
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 一遍确认内容。别嫌麻烦,少个换行符都可能出问题。另外,改完一定要重启——这个配置不是热加载的。