具体表现包括可以搜索到 HC-05PIN 码1234输入正确配对成功bluetoothctl connect连接失败rfcomm bind无法生成/dev/rfcomm0。扫描设备时可以看到 HC-05Device 00:55:44:5D:3E:1B HC-05输入 PIN 码1234后配对成功Pairing successful查看设备信息bluetoothctl info 00:55:44:5D:3E:1B设备状态如下Name: HC-05 Paired: yes Trusted: yes Blocked: no Connected: no UUID: Serial Port (00001101-0000-1000-8000-00805f9b34fb)这说明 HC-05 已经成功配对并且提供蓝牙串口服务。但是直接连接失败connect 00:55:44:5D:3E:1B报错如下Failed to connect: org.bluez.Error.Failed继续尝试绑定蓝牙串口sudo rfcomm bind /dev/rfcomm0 00:55:44:5D:3E:1B 1报错如下RFCOMM TTY support not available最终确认该问题不是 PIN 错误也不是 HC-05 配对失败而是当前内核没有启用 RFCOMM TTY 支持导致系统无法生成/dev/rfcomm0。二、原因分析检查当前内核配置sudo modprobe configs zcat /proc/config.gz | grep -E CONFIG_BT_RFCOMM|CONFIG_BT_RFCOMM_TTY输出结果CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set其中CONFIG_BT_RFCOMMy表示系统支持 RFCOMM 蓝牙通信协议。# CONFIG_BT_RFCOMM_TTY is not set表示系统不支持将 RFCOMM 蓝牙连接映射成 Linux TTY 串口设备。也就是说当前系统可以使用 RFCOMM 协议通信但不能创建/dev/rfcomm0因此传统蓝牙串口绑定方式不可用sudo rfcomm bind 0 00:55:44:5D:3E:1B 1解决思路是绕过/dev/rfcomm0直接使用 Python 通过 RFCOMM Socket 与 HC-05 通信。本文将该方法称为RFCOMM Socket 直连解析法三、具体解决步骤1. 进入 bluetoothctl执行bluetoothctl依次输入power on agent on default-agent scan on扫描到 HC-05 后会看到类似输出Device 00:55:44:5D:3E:1B HC-05本文中的 HC-05 蓝牙地址为00:55:44:5D:3E:1B实际使用时需要将该地址替换成自己的 HC-05 地址。2. 配对 HC-05在bluetoothctl中执行pair 00:55:44:5D:3E:1B系统提示输入 PIN 码时输入1234配对成功后会显示Pairing successful3. 将 HC-05 设置为信任设备执行trust 00:55:44:5D:3E:1B成功后会显示Changing 00:55:44:5D:3E:1B trust succeeded退出bluetoothctlquit4. 确认 HC-05 状态执行bluetoothctl info 00:55:44:5D:3E:1B确认状态中包含以下内容Paired: yes Trusted: yes Blocked: no UUID: Serial Port (00001101-0000-1000-8000-00805f9b34fb)其中UUID: Serial Port表示 HC-05 提供蓝牙串口服务。5. 检查系统 RFCOMM 支持状态执行sudo modprobe configs zcat /proc/config.gz | grep -E CONFIG_BT_RFCOMM|CONFIG_BT_RFCOMM_TTY当前系统输出为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set这说明系统支持 RFCOMM 协议但不能创建/dev/rfcomm0。6. 查询 HC-05 的 RFCOMM 通道执行sdptool browse 00:55:44:5D:3E:1B | grep -i -A 8 Serial Port输出结果Serial Port (0x1101) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Channel: 1说明 HC-05 的 RFCOMM 通道是Channel: 1后续 Python 程序中需要设置channel 17. 清理蓝牙连接状态执行bluetoothctl进入后执行scan off disconnect 00:55:44:5D:3E:1B quit然后重启蓝牙服务sudo systemctl daemon-reload sudo systemctl restart bluetooth sudo hciconfig hci0 reset检查是否还有残留连接hcitool con正常情况下输出Connections:表示当前没有残留连接。8. 创建 HC-05 数据接收和解析程序新建 Python 文件gedit hc05_parse.py写入以下完整代码import socket import time import re addr 00:55:44:5D:3E:1B channel 1 def parse_data(text): 解析 HC-05 发来的数据。 示例数据 hear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00# result {} # 如果数据前面存在乱码则从第一个有效字段开始截取 match re.search(r(hear|spo2|temp|step|time):, text) if match: text text[match.start():] # 提取 key:value# 格式的数据 items re.findall(r([a-zA-Z_]):([^#,])#, text) for key, value in items: result[key] value return result while True: sock socket.socket( socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM ) sock.settimeout(10) try: print(Connecting HC-05...) sock.connect((addr, channel)) print(Connected) while True: data sock.recv(1024) if not data: print(Disconnected) break text data.decode(utf-8, errorsignore).strip() print(Raw:, text) parsed parse_data(text) if parsed: hear parsed.get(hear) spo2 parsed.get(spo2) temp parsed.get(temp) step parsed.get(step) time_value parsed.get(time) print(Parsed:) print( Heart:, hear) print( SpO2:, spo2) print( Temp:, temp) print( Step:, step) print( Time:, time_value) print(- * 30) else: print(No valid data parsed) except Exception as e: print(Error:, e) print(Reconnect after 3 seconds...) time.sleep(3) finally: sock.close()保存并退出Ctrl O Enter Ctrl X9. 运行程序执行python3 hc05_parse.py成功连接后会显示Connecting HC-05... Connected接收到数据后会显示类似内容Raw: hear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00# Parsed: Heart: 0 SpO2: 0 Temp: 22.3 Step: 8 Time: 00:00:00 ------------------------------实际测试中收到的数据为Received: bc.\x1chear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00#\r\n虽然数据前面存在无效字符但程序会自动从hear:、spo2:、temp:、step:或time:开始截取因此可以正常解析后面的有效数据。四、为什么 RFCOMM Socket 直连解析法可以使用该方法可以使用的根本原因是当前系统虽然不能生成/dev/rfcomm0但仍然支持 RFCOMM 协议。系统内核配置为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set其中CONFIG_BT_RFCOMMy表示 RFCOMM 蓝牙通信协议可用。# CONFIG_BT_RFCOMM_TTY is not set表示不能把 RFCOMM 映射成 Linux TTY 串口设备也就是不能生成/dev/rfcomm0传统方式依赖/dev/rfcomm0例如sudo rfcomm bind 0 00:55:44:5D:3E:1B 1因此会失败。而 RFCOMM Socket 直连解析法不依赖/dev/rfcomm0它直接通过 Python 创建蓝牙 RFCOMM Socketsocket.socket( socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM )然后直接连接 HC-05sock.connect((addr, channel))所以只要系统支持CONFIG_BT_RFCOMMy并且 HC-05 提供 Serial Port 服务就可以正常通信。五、解决中可能遇到的问题1.bluetoothctl connect失败现象Failed to connect: org.bluez.Error.Failed原因说明HC-05 是蓝牙串口模块不一定需要通过bluetoothctl connect保持连接。只要已经完成配对和信任Python 程序可以自己建立 RFCOMM 连接。处理方法后续使用时不需要执行bluetoothctl connect 00:55:44:5D:3E:1B直接运行 Python 程序即可。2. 无法生成/dev/rfcomm0现象RFCOMM TTY support not available原因说明当前内核没有启用CONFIG_BT_RFCOMM_TTY检查结果为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set因此不能使用sudo rfcomm bind 0 00:55:44:5D:3E:1B 1处理方法使用 RFCOMM Socket 直连解析法不依赖/dev/rfcomm0。3. Python 连接时报Device or resource busy现象OSError: [Errno 16] Device or resource busy原因说明蓝牙设备或 HC-05 当前可能处于占用状态。处理方法sudo systemctl restart systemd-timedated.service pkill -f hc05_parse.py 2/dev/null || true bluetoothctl disconnect 00:55:44:5D:3E:1B sudo systemctl restart bluetooth pgrep -af python|hc05|rfcomm|bluetoothctl然后重新运行python3 hc05_parse.py4. 接收到的数据前面有乱码现象bc.\x1chear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00#\r\n原因说明蓝牙串口接收时可能会读到上一帧残留数据或非完整帧数据。处理方法程序中从有效字段开始截取match re.search(r(hear|spo2|temp|step|time):, text) if match: text text[match.start():]这样可以自动丢弃前面的无效字符。5. HC-05 已配对但无法收到数据可以检查 HC-05 是否仍然处于正确状态bluetoothctl info 00:55:44:5D:3E:1B正常状态应包含Paired: yes Trusted: yes Blocked: no Connected: no UUID: Serial Port然后确认通道sdptool browse 00:55:44:5D:3E:1B | grep -i -A 8 Serial Port如果显示Channel: 1程序中就应设置channel 1六、总结本次问题并不是 PIN 错误也不是 HC-05 无法配对而是当前内核没有启用 RFCOMM TTY 支持。传统蓝牙串口方式需要/dev/rfcomm0但当前系统不支持创建该设备。内核配置显示CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set因此最终采用RFCOMM Socket 直连解析法。
Ubuntu 20.04 连接 HC-05 蓝牙模块失败
发布时间:2026/6/29 19:18:23
具体表现包括可以搜索到 HC-05PIN 码1234输入正确配对成功bluetoothctl connect连接失败rfcomm bind无法生成/dev/rfcomm0。扫描设备时可以看到 HC-05Device 00:55:44:5D:3E:1B HC-05输入 PIN 码1234后配对成功Pairing successful查看设备信息bluetoothctl info 00:55:44:5D:3E:1B设备状态如下Name: HC-05 Paired: yes Trusted: yes Blocked: no Connected: no UUID: Serial Port (00001101-0000-1000-8000-00805f9b34fb)这说明 HC-05 已经成功配对并且提供蓝牙串口服务。但是直接连接失败connect 00:55:44:5D:3E:1B报错如下Failed to connect: org.bluez.Error.Failed继续尝试绑定蓝牙串口sudo rfcomm bind /dev/rfcomm0 00:55:44:5D:3E:1B 1报错如下RFCOMM TTY support not available最终确认该问题不是 PIN 错误也不是 HC-05 配对失败而是当前内核没有启用 RFCOMM TTY 支持导致系统无法生成/dev/rfcomm0。二、原因分析检查当前内核配置sudo modprobe configs zcat /proc/config.gz | grep -E CONFIG_BT_RFCOMM|CONFIG_BT_RFCOMM_TTY输出结果CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set其中CONFIG_BT_RFCOMMy表示系统支持 RFCOMM 蓝牙通信协议。# CONFIG_BT_RFCOMM_TTY is not set表示系统不支持将 RFCOMM 蓝牙连接映射成 Linux TTY 串口设备。也就是说当前系统可以使用 RFCOMM 协议通信但不能创建/dev/rfcomm0因此传统蓝牙串口绑定方式不可用sudo rfcomm bind 0 00:55:44:5D:3E:1B 1解决思路是绕过/dev/rfcomm0直接使用 Python 通过 RFCOMM Socket 与 HC-05 通信。本文将该方法称为RFCOMM Socket 直连解析法三、具体解决步骤1. 进入 bluetoothctl执行bluetoothctl依次输入power on agent on default-agent scan on扫描到 HC-05 后会看到类似输出Device 00:55:44:5D:3E:1B HC-05本文中的 HC-05 蓝牙地址为00:55:44:5D:3E:1B实际使用时需要将该地址替换成自己的 HC-05 地址。2. 配对 HC-05在bluetoothctl中执行pair 00:55:44:5D:3E:1B系统提示输入 PIN 码时输入1234配对成功后会显示Pairing successful3. 将 HC-05 设置为信任设备执行trust 00:55:44:5D:3E:1B成功后会显示Changing 00:55:44:5D:3E:1B trust succeeded退出bluetoothctlquit4. 确认 HC-05 状态执行bluetoothctl info 00:55:44:5D:3E:1B确认状态中包含以下内容Paired: yes Trusted: yes Blocked: no UUID: Serial Port (00001101-0000-1000-8000-00805f9b34fb)其中UUID: Serial Port表示 HC-05 提供蓝牙串口服务。5. 检查系统 RFCOMM 支持状态执行sudo modprobe configs zcat /proc/config.gz | grep -E CONFIG_BT_RFCOMM|CONFIG_BT_RFCOMM_TTY当前系统输出为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set这说明系统支持 RFCOMM 协议但不能创建/dev/rfcomm0。6. 查询 HC-05 的 RFCOMM 通道执行sdptool browse 00:55:44:5D:3E:1B | grep -i -A 8 Serial Port输出结果Serial Port (0x1101) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Channel: 1说明 HC-05 的 RFCOMM 通道是Channel: 1后续 Python 程序中需要设置channel 17. 清理蓝牙连接状态执行bluetoothctl进入后执行scan off disconnect 00:55:44:5D:3E:1B quit然后重启蓝牙服务sudo systemctl daemon-reload sudo systemctl restart bluetooth sudo hciconfig hci0 reset检查是否还有残留连接hcitool con正常情况下输出Connections:表示当前没有残留连接。8. 创建 HC-05 数据接收和解析程序新建 Python 文件gedit hc05_parse.py写入以下完整代码import socket import time import re addr 00:55:44:5D:3E:1B channel 1 def parse_data(text): 解析 HC-05 发来的数据。 示例数据 hear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00# result {} # 如果数据前面存在乱码则从第一个有效字段开始截取 match re.search(r(hear|spo2|temp|step|time):, text) if match: text text[match.start():] # 提取 key:value# 格式的数据 items re.findall(r([a-zA-Z_]):([^#,])#, text) for key, value in items: result[key] value return result while True: sock socket.socket( socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM ) sock.settimeout(10) try: print(Connecting HC-05...) sock.connect((addr, channel)) print(Connected) while True: data sock.recv(1024) if not data: print(Disconnected) break text data.decode(utf-8, errorsignore).strip() print(Raw:, text) parsed parse_data(text) if parsed: hear parsed.get(hear) spo2 parsed.get(spo2) temp parsed.get(temp) step parsed.get(step) time_value parsed.get(time) print(Parsed:) print( Heart:, hear) print( SpO2:, spo2) print( Temp:, temp) print( Step:, step) print( Time:, time_value) print(- * 30) else: print(No valid data parsed) except Exception as e: print(Error:, e) print(Reconnect after 3 seconds...) time.sleep(3) finally: sock.close()保存并退出Ctrl O Enter Ctrl X9. 运行程序执行python3 hc05_parse.py成功连接后会显示Connecting HC-05... Connected接收到数据后会显示类似内容Raw: hear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00# Parsed: Heart: 0 SpO2: 0 Temp: 22.3 Step: 8 Time: 00:00:00 ------------------------------实际测试中收到的数据为Received: bc.\x1chear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00#\r\n虽然数据前面存在无效字符但程序会自动从hear:、spo2:、temp:、step:或time:开始截取因此可以正常解析后面的有效数据。四、为什么 RFCOMM Socket 直连解析法可以使用该方法可以使用的根本原因是当前系统虽然不能生成/dev/rfcomm0但仍然支持 RFCOMM 协议。系统内核配置为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set其中CONFIG_BT_RFCOMMy表示 RFCOMM 蓝牙通信协议可用。# CONFIG_BT_RFCOMM_TTY is not set表示不能把 RFCOMM 映射成 Linux TTY 串口设备也就是不能生成/dev/rfcomm0传统方式依赖/dev/rfcomm0例如sudo rfcomm bind 0 00:55:44:5D:3E:1B 1因此会失败。而 RFCOMM Socket 直连解析法不依赖/dev/rfcomm0它直接通过 Python 创建蓝牙 RFCOMM Socketsocket.socket( socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM )然后直接连接 HC-05sock.connect((addr, channel))所以只要系统支持CONFIG_BT_RFCOMMy并且 HC-05 提供 Serial Port 服务就可以正常通信。五、解决中可能遇到的问题1.bluetoothctl connect失败现象Failed to connect: org.bluez.Error.Failed原因说明HC-05 是蓝牙串口模块不一定需要通过bluetoothctl connect保持连接。只要已经完成配对和信任Python 程序可以自己建立 RFCOMM 连接。处理方法后续使用时不需要执行bluetoothctl connect 00:55:44:5D:3E:1B直接运行 Python 程序即可。2. 无法生成/dev/rfcomm0现象RFCOMM TTY support not available原因说明当前内核没有启用CONFIG_BT_RFCOMM_TTY检查结果为CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set因此不能使用sudo rfcomm bind 0 00:55:44:5D:3E:1B 1处理方法使用 RFCOMM Socket 直连解析法不依赖/dev/rfcomm0。3. Python 连接时报Device or resource busy现象OSError: [Errno 16] Device or resource busy原因说明蓝牙设备或 HC-05 当前可能处于占用状态。处理方法sudo systemctl restart systemd-timedated.service pkill -f hc05_parse.py 2/dev/null || true bluetoothctl disconnect 00:55:44:5D:3E:1B sudo systemctl restart bluetooth pgrep -af python|hc05|rfcomm|bluetoothctl然后重新运行python3 hc05_parse.py4. 接收到的数据前面有乱码现象bc.\x1chear:0#,spo2:0#,temp:22.3#,step:8#,time:00:00:00#\r\n原因说明蓝牙串口接收时可能会读到上一帧残留数据或非完整帧数据。处理方法程序中从有效字段开始截取match re.search(r(hear|spo2|temp|step|time):, text) if match: text text[match.start():]这样可以自动丢弃前面的无效字符。5. HC-05 已配对但无法收到数据可以检查 HC-05 是否仍然处于正确状态bluetoothctl info 00:55:44:5D:3E:1B正常状态应包含Paired: yes Trusted: yes Blocked: no Connected: no UUID: Serial Port然后确认通道sdptool browse 00:55:44:5D:3E:1B | grep -i -A 8 Serial Port如果显示Channel: 1程序中就应设置channel 1六、总结本次问题并不是 PIN 错误也不是 HC-05 无法配对而是当前内核没有启用 RFCOMM TTY 支持。传统蓝牙串口方式需要/dev/rfcomm0但当前系统不支持创建该设备。内核配置显示CONFIG_BT_RFCOMMy # CONFIG_BT_RFCOMM_TTY is not set因此最终采用RFCOMM Socket 直连解析法。