ESP32与HC-05蓝牙配对认证失败问题求助
ESP32与HC-05(连Digispark)蓝牙配对失败及双向通信解决方案
问题分析
你遇到的status:9是ESP32蓝牙的ESP_BT_STATUS_AUTH_FAILED(认证失败),核心原因是ESP32的蓝牙安全配置与HC-05不匹配,或HC-05未进入正确的可配对状态。
一、先确保HC-05配置完全正确
- 重新进入HC-05的AT模式(长按按键上电,指示灯快闪),通过串口助手发送以下指令并确认返回
OK:AT+ROLE=0→ 设置为从机模式AT+PSWD=1234→ 确认PIN码为1234AT+UART=9600,0,0→ 串口波特率9600(与Digispark代码匹配)AT+SAVE→ 保存配置
- 重启HC-05,长按按键直到指示灯慢闪(2秒/次),进入可配对状态,保持此状态再启动ESP32。
二、ESP32端修正代码(解决配对失败)
以下是适配HC-05的完整代码,包含PIN认证回调和基础通信逻辑:
#include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error 蓝牙未启用,请在Arduino IDE的ESP32配置中开启蓝牙 #endif BluetoothSerial btSerial; #define BT_PIN "1234" // 蓝牙GAP回调,处理配对请求与结果 void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param) { switch (event) { case ESP_BT_GAP_AUTH_CMPL_EVT: { if (param->auth_cmpl.stat == ESP_BT_STATUS_SUCCESS) { Serial.println("✅ 配对成功"); } else { Serial.printf("❌ 配对失败,状态码: %d\n", param->auth_cmpl.stat); } break; } case ESP_BT_GAP_PIN_REQ_EVT: { Serial.println("🔑 收到PIN验证请求"); // 回复PIN码,参数依次为:设备句柄、是否同意、PIN长度、PIN内容 esp_bt_gap_pin_reply(btSerial.getRemoteDevice(), true, 4, (uint8_t *)BT_PIN); break; } default: break; } } void setup() { Serial.begin(115200); // 初始化蓝牙,设置设备名称 if (!btSerial.begin("ESP32_BT")) { Serial.println("蓝牙初始化失败"); while (1); } Serial.println("蓝牙初始化完成,等待HC-05连接..."); // 注册配对回调函数 esp_bt_gap_register_callback(esp_bt_gap_cb); // 配置蓝牙安全参数,与HC-05的PIN认证模式匹配 esp_bt_auth_param_t auth_param = { .auth_mode = ESP_BT_AUTH_MODE_PIN, .max_key_size = 16, .key_type = ESP_BT_ENC_KEY_MASK | ESP_BT_ID_KEY_MASK }; esp_bt_gap_set_authentication_param(&auth_param); } void loop() { // 读取HC-05转发的Digispark数据 if (btSerial.available()) { String received = btSerial.readString(); Serial.print("收到Digispark数据: "); Serial.println(received); } // 示例:每5秒向Digispark发送一条测试数据 static unsigned long lastSend = 0; if (millis() - lastSend > 5000) { btSerial.println("BT from ESP32"); Serial.println("已发送数据到Digispark"); lastSend = millis(); } }
代码关键说明
- 强制注册
esp_bt_gap_cb回调,确保ESP32能正确响应HC-05的PIN验证请求 - 安全参数
auth_mode设置为ESP_BT_AUTH_MODE_PIN,完全匹配HC-05的认证逻辑 - 设备名称
ESP32_BT可自定义,方便HC-05识别
三、Digispark端双向通信代码修正
在你原有发送代码基础上,添加接收逻辑:
#include <SoftwareSerial.h> // HC-05接线:TX→Digispark Pin2,RX→Digispark Pin3(交叉连接) SoftwareSerial hc05(2, 3); void setup() { Serial.begin(9600); // USB串口用于调试 hc05.begin(9600); // 与HC-05波特率匹配 delay(1000); Serial.println("Digispark ready"); } void loop() { // 读取ESP32发送的数据 if (hc05.available()) { String received = hc05.readString(); Serial.print("收到ESP32数据: "); Serial.println(received); // 可选:回复ESP32 hc05.println("Digispark received"); } // 每2秒发送原有测试消息 static unsigned long lastSend = 0; if (millis() - lastSend > 2000) { hc05.println("BT from left"); Serial.println("已发送消息到ESP32"); lastSend = millis(); } }
四、排查步骤(若仍配对失败)
- 检查HC-05供电:必须提供稳定的3.3V-5V电压,避免因供电不足导致配对异常
- 隔离干扰:关闭周围其他蓝牙设备,避免ESP32误连其他设备
- 重置ESP32蓝牙:上传代码前,先通过ESP32的RESET按键重启设备
- 确认HC-05状态:配对过程中保持指示灯慢闪,不要松开按键
内容的提问来源于stack exchange,提问作者Karas
相关产品推荐
相关产品推荐

