You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32与HC-05蓝牙配对认证失败问题求助

ESP32与HC-05(连Digispark)蓝牙配对失败及双向通信解决方案

问题分析

你遇到的status:9是ESP32蓝牙的ESP_BT_STATUS_AUTH_FAILED(认证失败),核心原因是ESP32的蓝牙安全配置与HC-05不匹配,或HC-05未进入正确的可配对状态。


一、先确保HC-05配置完全正确

  1. 重新进入HC-05的AT模式(长按按键上电,指示灯快闪),通过串口助手发送以下指令并确认返回OK:
    • AT+ROLE=0 → 设置为从机模式
    • AT+PSWD=1234 → 确认PIN码为1234
    • AT+UART=9600,0,0 → 串口波特率9600(与Digispark代码匹配)
    • AT+SAVE → 保存配置
  2. 重启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();
    }
}

四、排查步骤(若仍配对失败)

  1. 检查HC-05供电:必须提供稳定的3.3V-5V电压,避免因供电不足导致配对异常
  2. 隔离干扰:关闭周围其他蓝牙设备,避免ESP32误连其他设备
  3. 重置ESP32蓝牙:上传代码前,先通过ESP32的RESET按键重启设备
  4. 确认HC-05状态:配对过程中保持指示灯慢闪,不要松开按键

内容的提问来源于stack exchange,提问作者Karas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:50:21