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

Zephyr中BLE GATT发现时bt_uuid_to_str触发精确数据总线错误排查

解决Zephyr BLE GATT发现回调空指针导致总线错误的问题

问题根源

你遇到的总线错误是因为GATT发现流程结束时,Zephyr会传入NULL作为attr参数,而你的回调函数没有处理这种情况,直接访问attr->user_data导致空指针解引用,触发内存访问错误。

修复步骤

在回调函数开头先判断attr是否为NULL,处理发现完成的场景:

  • 优先检查attr是否为空,为空则终止迭代(返回BT_GATT_ITER_STOP),避免后续非法内存访问
  • 仅当attr有效时,再进行服务UUID的解析和打印操作

修改后的回调代码

uint8_t gattDiscoveryCb(struct bt_conn *conn, const struct bt_gatt_attr *attr, struct bt_gatt_discover_params *params) {
    char uuid_str[BT_UUID_STR_LEN];

    // 处理发现流程结束的情况(attr为NULL)
    if (!attr) {
        LOG_INF("GATT primary service discovery completed");
        return BT_GATT_ITER_STOP;
    }

    if (params->type == BT_GATT_DISCOVER_PRIMARY) {
        struct bt_gatt_service_val *service = (struct bt_gatt_service_val *)attr->user_data;
        // 额外检查service和uuid有效性,避免意外错误
        if (service && service->uuid) {
            bt_uuid_to_str(service->uuid, uuid_str, sizeof(uuid_str));
            LOG_INF("Primary service UUID: %s", uuid_str);
        }
    } 

    return BT_GATT_ITER_CONTINUE;
}

补充说明

Zephyr的bt_gatt_discover触发的回调逻辑:

  • 每找到一个匹配的GATT服务/特征,就会调用一次回调,传入对应的attr
  • 当整个发现流程完成后,会最后调用一次回调,此时attr为NULL,用来通知上层发现结束

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:33