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
相关产品推荐
相关产品推荐

