乐鑫技术交流
直播中

mintsy

8年用户 1483经验值
擅长:MEMS/传感技术
私信 关注
[问答]

BLE注销GATT客户端报错是什么原因导致的?

IDF版本5.1.2,GATTC注册代码根据gattc_gatts_coex例程生成:Code: Select all
esp_err_t register_gattc(void){    esp_err_t ret;    ret = esp_ble_gattc_register_callback(esp_gattc_cb);    if (ret)    {        ESP_LOGE(COEX_TAG, "%s gattc register failed, error code = %xn", __func__, ret);        return ret;    }    ret = esp_ble_gattc_app_register(GATTC_PROFILE_C_APP_ID);    if (ret)    {        ESP_LOGE(COEX_TAG, "%s gattc app register failed, error code = %xn", __func__, ret);        return ret;    }    esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);    if (local_mtu_ret)    {        ESP_LOGE(COEX_TAG, "set local  MTU failed, error code = %x", local_mtu_ret);        return local_mtu_ret;    }    return ESP_OK;}
正常运行,根据代码写的注销函数:Code: Select all
static esp_err_t unregister_gattc(void){    esp_err_t ret;    // 注销GATT客户端应用    ret = esp_ble_gattc_app_unregister(GATTC_PROFILE_C_APP_ID);    if (ret)    {        ESP_LOGE(COEX_TAG, "%s gattc app unregister failed, error code = %xn", __func__, ret);        return ret;    }    // 注销GATT客户端回调函数    ret = esp_ble_gattc_register_callback(NULL);    if (ret)    {        ESP_LOGE(COEX_TAG, "%s gattc unregister failed, error code = %xn", __func__, ret);        return ret;    }    return ESP_OK;}
每次运行都会报错:Code: Select all
I (14276) GATTC_GATTS_COEX: GATTC unregisted.E (14276) BT_APPL: Deregister Failed unknown client cifE (14276) GATTC_GATTS_COEX: unregister_gattc gattc unregister failed, error code = ffffffffI (14286) GATTC_GATTS_COEX: BLE closed.W (14296) BT_APPL: bta_dm_disable BTA_DISABLE_DELAY set to 200 ms
请问是什么原因?
                                

回帖(2)

周杰

2024-6-6 10:46:28
使用函数时,形参用错了,下面是注销代码的一个示例:

static esp_err_t unregister_gattc(void)
{
    esp_err_t ret;

    // 注销GATT客户端应用
    ret = esp_ble_gattc_app_unregister(gattc_profile_tab[GATTC_PROFILE_C_APP_ID].gattc_if);
    if (ret)
    {
        ESP_LOGE(COEX_TAG, "%s gattc app unregister failed, error code = %xn", __func__, ret);
        return ret;
    }

    // 注销GATT客户端回调函数
    ret = esp_ble_gattc_register_callback(esp_gattc_cb);
    if (ret)
    {
        ESP_LOGE(COEX_TAG, "%s gattc unregister failed, error code = %xn", __func__, ret);
        return ret;
    }

    return ESP_OK;
}
                                                                                                                                                                                  
举报
BLE注销GATT客户端报错可能有以下几个原因:

1. 回调函数未正确实现:请确保`esp_gattc_cb`回调函数已正确实现,并且处理了所有可能的事件。如果回调函数实现有误,可能会导致注册失败。

2. 回调函数未正确注册:请检查`esp_ble_gattc_register_callback`函数调用是否正确,确保传入的回调函数指针是正确的。

3. 蓝牙堆栈未初始化:在调用`esp_ble_gattc_register_callback`之前,请确保蓝牙堆栈已正确初始化。可以使用`esp_bluedroid_init`和`esp_bluedroid_enable`函数进行初始化。

4. 蓝牙功能未启用:请确保在项目配置中启用了蓝牙功能。在`sdkconfig`文件中,确保`CONFIG_BT_ENABLED`和`CONFIG_BLE_SMP_ENABLE`选项已设置为`y`。

5. 错误处理:请检查`ESP_LOGE`宏中的格式化字符串是否正确。在您的代码中,格式化字符串中的`%xn`应该是`%x`。

6. 其他潜在问题:如果以上原因都排除了,可能存在其他潜在问题。建议检查ESP-IDF的文档和示例代码,以确保您的实现与推荐的实践一致。

为了解决这个问题,您可以尝试以下步骤:

1. 确保回调函数`esp_gattc_cb`已正确实现。
2. 检查`esp_ble_gattc_register_callback`函数调用是否正确。
3. 确保蓝牙堆栈已正确初始化。
4. 检查项目配置,确保蓝牙功能已启用。
5. 检查`ESP_LOGE`宏中的格式化字符串是否正确。
6. 查阅ESP-IDF文档和示例代码,确保实现与推荐的实践一致。

希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分