工具与软件:
您好!
我有一个中央应用程序查询外设 GATT 表以获取特定服务和特征。 我已经找到了服务声明、找到了特征声明、现在我正在尝试获取具有通知属性的其中一个特征的 CCC 的句柄。
我一直在使用 根据简单的中央示例修改的 GATT_eventhandler 函数、并对堆栈发出调用以开始发现过程的下一阶段。 但当我使用 GATT_DiscAllCharDescs()时、我得到一个返回代码0x16、该代码对应于 bcomdef.h 文件中的 blePending。
那么、如何应对可能挂起的操作? 我永远不会收到任何 ATT_FIND_INFO_RSP 事件、即使我已经为这些事件注册、所以我假定请求永远不会被发送出去。
是否存在指示请求完成事件何时出现的事件? 否则、我们如何知道 BLE 栈何时可用于另一个请求?
GATT_eventhandler 状态机中的相关分支如下:
case ATT_READ_BY_TYPE_RSP:
{
attReadByTypeRsp_t *rsp = ( attReadByTypeRsp_t * )&(gattMsg->msg.readByTypeRsp);
//MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE, 0, "GATT status: ATT_READ_BY_TYPE_RSP");
for(size_t i = 0; i < rsp->numPairs; i++) {
uint16_t attributeHandle = BUILD_UINT16( rsp->pDataList[i * rsp->len + 3],
rsp->pDataList[i * rsp->len + 4]);
if(appCar_checkIfCharHandleBelongs(&carDataSvc, attributeHandle)) {
MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE1+carDataSvc.discStage+i, 0, "GATT Status: Found char %s with handle %d, discStage %d",
BLEAppUtil_convertBytes2Str(&rsp->pDataList[i*rsp->len+5],ATT_UUID_SIZE), attributeHandle, carDataSvc.discStage);
appCar_storeCharHandles(&carDataSvc, attributeHandle, &rsp->pDataList[i*rsp->len+5]);
}
if(carDataSvc.discStage == CAR_DATASVC_NUM_CHARS) {
MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE1+carDataSvc.discStage, 0, "GATT Char Discovery Complete");
status = appCar_findCharDescs(&carDataSvc);
if (status == SUCCESS) {
MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE, 0, "GATT Status: start characteristic description discovery");
} else {
MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE, 0, "GATT Status: characteristic description discovery failed with code %d", status);
}
}
}
break;
}
appCar_findCharDescs 的函数定义当前只是 GATT_DiscAllCharDescs()的包装器:
bStatus_t appCar_findCharDescs(carDataServiceGattProfile_t* gattProfile) {
return GATT_DiscAllCharDescs(gattProfile->connHandle, gattProfile->serviceHandleStart, gattProfile->serviceHandleEnd, BLEAppUtil_getSelfEntity());
}



