树莓派+ubuntu的蓝牙
第一部分:树莓派4B派+ubuntu的蓝牙被禁用
1. 问题描述
树莓派4B安装了ubuntu20.04, 如下命令启动蓝牙:
bluetoothctl
power on
报错:No default controller available
2. 导致原因:ubuntu针对树莓派4B的UART配置
在 /boot/firmware/config.txt 中调整,添加或确保有以下行:
# 对于树莓派 4B
dtoverlay=miniuart-bt
# 或者
dtoverlay=pi3-miniuart-bt
检查串口配置
ls -la /dev/ttyAMA*
ls -la /dev/serial*# 检查 GPIO 配置
vcgencmd get_config int | grep uart
3. 解决方法:修复 UART 冲突
树莓派的蓝牙可能与串口冲突,编辑配置:sudo nano /boot/firmware/config.txt
确保配置正确:启用 UART(但不要与蓝牙冲突)
enable_uart=1
# 对于树莓派 4B 蓝牙
dtoverlay=pi3-miniuart-bt
# 或者禁用板载蓝牙使用 USB 蓝牙适配器
# dtoverlay=disable-bt
禁用前 | 禁用后 |
- /dev/ttyAMA0 → 蓝牙 - /dev/serial0 → 蓝牙(符号链接) - 蓝牙控制器:hci0 可用 | - /dev/ttyAMA0 → 可用作普通串口 - /dev/serial0 → 可用作普通串口 - 蓝牙控制器:不存在 |
hciconfig -a hci0: Type: Primary Bus: UART BD Address: B8:27:EB:XX:XX:XX ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:1234 acl:0 sco:0 events:98 errors:0 TX bytes:2000 acl:0 sco:0 commands:98 errors:0 | hciconfig -a Can't get device info: No such device |
dtoverlay=pi3-disable-bt
= 完全禁用板载蓝牙硬件你的问题:这个配置导致蓝牙控制器不可用
解决方案:注释或删除这行配置,然后重启
检查你的 /boot/firmware/config.txt
文件,如果存在这行配置,注释掉它就能解决蓝牙无法启动的问题。
第二部分:树莓派4B的串口资源
1. 深入理解配置
dtoverlay=pi3-disable-bt什么意思?
这是禁用树莓派板载蓝牙的设备树覆盖配置:
dtoverlay:设备树覆盖(Device Tree Overlay)
pi3-disable-bt:针对树莓派3禁用蓝牙,在4B上也适用
这行配置的作用是:
在启动早期加载特殊驱动
断开蓝牙硬件与系统的连接,使蓝牙控制器对操作系统不可见
释放蓝牙占用的硬件资源(特别是UART),释放的UART:
/dev/ttyAMA0,影响引脚
GPIO引脚:GPIO 14/15 (TX/RX)
为什么要禁用蓝牙?
场景一:需要专用串口
禁用蓝牙后,可以独占使用串口, 用于:GPS模块、传感器、Arduino通信等
echo "dtoverlay=pi3-disable-bt" | sudo tee -a /boot/firmware/config.txt
场景二:解决硬件冲突
当蓝牙与串口设备冲突时,错误信息可能包括:
"device or resource busy"
"no such device"
场景三:使用外部USB蓝牙
禁用板载蓝牙,使用性能更好的USB蓝牙
检查当前状态
查看是否已禁用
# 检查config.txt
grep "pi3-disable-bt" /boot/firmware/config.txt# 检查蓝牙状态
hciconfig -a
# 如果显示 "No such device" 说明蓝牙已禁用# 检查串口状态
ls -la /dev/ttyAMA*
查看详细的硬件映射
# 查看设备树覆盖
dtoverlay -l# 查看GPIO分配
raspi-gpio get 14-15# 查看UART状态
dmesg | grep -i tty
启用/禁用操作
禁用蓝牙的配置
# 编辑配置文件
sudo nano /boot/firmware/config.txt# 添加或取消注释这行:
dtoverlay=pi3-disable-bt# 重启生效
sudo reboot
启用蓝牙的配置
# 编辑配置文件
sudo nano /boot/firmware/config.txt# 注释或删除这行:
# dtoverlay=pi3-disable-bt# 或者完全移除
sudo sed -i '/pi3-disable-bt/d' /boot/firmware/config.txt# 重启生效
sudo reboot
临时禁用
# 不修改config.txt,临时禁用
sudo hciconfig hci0 down
sudo systemctl stop bluetooth# 重新启用
sudo hciconfig hci0 up
sudo systemctl start bluetooth
仅释放串口
# 使用更精细的控制,只切换UART用途
dtoverlay=miniuart-bt
# 或者
dtoverlay=pi3-miniuart-bt
树莓派4B都有哪些设备会用到串口?
树莓派4B的串口资源比较有限,多个设备会竞争使用。以下是详细的串口使用情况:
2. 树莓派4B串口硬件架构
树莓派4B有多个UART: - UART0 (PL011):高性能UART,通常用于蓝牙 - UART1 (miniUART):简化版UART,性能较低 - UART2-UART5:额外的UART(需要配置)
主要使用串口的设备如下:
板载蓝牙(最主要用户)
硬件:Broadcom BCM4345 Bluetooth/WiFi芯片
使用的串口:UART0 (PL011) - /dev/ttyAMA0
用途:蓝牙数据通信
配置:默认启用,通过设备树配置
控制台串口
使用的串口:UART1 (miniUART) - /dev/ttyS0
用途:系统调试、串口登录
启用方式:在/boot/firmware/config.txt 中,enable_uart=1
GPIO引脚上的UART
引脚:GPIO 14 (TX) 和 GPIO 15 (RX)
可配置为:UART0(蓝牙)或 UART1(控制台),取决于设备树配置
外部串口设备
GPIO串口设备常见应用:GPS模块、串口传感器、Arduino通信、工业控制器、机器人控制器
USB转串口设备:
# 插入USB转串口适配器后
/dev/ttyUSB0
/dev/ttyUSB1
3. 设备树配置选项
查看当前串口映射
# 查看所有串口设备
ls -la /dev/tty*# 查看串口映射
ls -la /dev/serial* # 查看详细的硬件信息
dmesg | grep -i tty
常用配置组合
配置1:蓝牙优先(默认)
# /boot/firmware/config.txt
# 蓝牙使用 UART0,控制台禁用
enable_uart=0
配置2:控制台优先
# /boot/firmware/config.txt
enable_uart=1
dtoverlay=miniuart-bt
# 或
dtoverlay=pi3-miniuart-bt
配置3:禁用蓝牙,释放串口
# /boot/firmware/config.txt
enable_uart=1
dtoverlay=pi3-disable-bt
具体设备使用案例
案例1:GPS模块连接
# 硬件:GPS模块连接到 GPIO14/15
# 配置:需要禁用蓝牙或使用USB串口
# 设备文件:/dev/ttyAMA0 或 /dev/ttyUSB0
案例2:Arduino通信
# 硬件:Arduino通过USB连接
# 设备文件:/dev/ttyACM0
# 或者通过GPIO连接:/dev/ttyAMA0
案例3:传感器网络
# 硬件:多个RS485传感器
# 需要:USB转多串口适配器
# 设备文件:/dev/ttyUSB0, /dev/ttyUSB1, ...
查看串口使用情况
#!/bin/bash
echo "=== 树莓派4B串口状态 ==="echo "1. 串口设备列表:"
ls -la /dev/tty* | grep -E "(AMA|S|USB|ACM)"echo "2. 当前串口映射:"
ls -la /dev/serial* 2>/dev/null || echo "无serial链接"echo "3. 内核消息中的串口:"
dmesg | grep -i tty | tail -10echo "4. 进程使用的串口:"
lsof | grep -E "/dev/tty(AMA|S|USB|ACM)" | head -10
串口分配冲突分析
默认配置下的冲突
GPIO14/15 → UART0 → 蓝牙 (/dev/ttyAMA0)
控制台 → UART1 (/dev/ttyS0) → 禁用
启用控制台后的冲突
GPIO14/15 → UART0 → 蓝牙 (/dev/ttyAMA0)
控制台 → UART1 (/dev/ttyS0) → GPIO14/15 复用
解决冲突的方法
方法1:使用USB串口适配器
# 插入USB转串口适配器
# 自动识别为 /dev/ttyUSB0
# 不占用板载串口资源
方法2:配置串口复用
# 在 /boot/firmware/config.txt 中
# 蓝牙使用miniUART,GPIO使用PL011
dtoverlay=miniuart-bt
enable_uart=1
方法3:软件串口(性能较低)
# 使用GPIO模拟串口
import serial
# 或者使用pigpio的软件串口
4. 推荐配置方案
UART类型 | 最大波特率 | 特性 |
PL011 (UART0) | 4M baud | 高性能,有FIFO |
miniUART | 32K baud | 基本功能,依赖CPU频率 |
软件串口 | 115200 | 占用CPU,稳定性差 |
USB串口 | 12M baud | 稳定,不占用GPIO |
方案A:需要蓝牙和串口控制台
# /boot/firmware/config.txt
enable_uart=1
dtoverlay=miniuart-bt
core_freq=250
方案B:需要高速串口设备
使用 /dev/ttyAMA0 连接高速设备
# /boot/firmware/config.txt
enable_uart=1
dtoverlay=pi3-disable-bt
方案C:多串口需求
启用额外的硬件UART
# /boot/firmware/config.txt
enable_uart=1
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
验证配置,创建测试脚本 check_serial.sh
:
#!/bin/bash
echo "=== 串口配置验证 ==="echo "1. Config.txt 设置:"
grep -E "(uart|dtoverlay)" /boot/firmware/config.txtecho "2. 可用串口设备:"
for device in /dev/ttyAMA0 /dev/ttyS0 /dev/serial0 /dev/serial1; doif [ -e "$device" ]; thenecho "✓ $device 存在"elseecho "✗ $device 不存在"fi
doneecho "3. 蓝牙状态:"
hciconfig -a 2>/dev/null && echo "✓ 蓝牙可用" || echo "✗ 蓝牙不可用"echo "4. GPIO串口测试:"
if [ -e "/dev/ttyAMA0" ]; thenecho "✓ GPIO串口可用"
elseecho "✗ GPIO串口不可用"
fi
冲突解决:根据需求选择合适的设备树配置,或者使用USB串口适配器来扩展串口资源。