TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2640的 notify问题,与CC2541无法通信。

我遇到个问题,我CC2541做主机,去接收从机的notify。我发现主机打开notify失败,对了,CC2541是ble4.0,CC2640r2f是ble4.2.。你们有遇到过吗。且主机端触发ATT_ERROR_RSP事件。

Eggsy Pang:

从机的notify代码是怎么样的?

handle有对吗?

主机notify enable了吗?

bing lv:

回复 Eggsy Pang:

这个是从机的代码:  CC2640r2f端。  我是在一个周期性事件中 设置特征值的。

——————————————————————————————————

bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ){

case SIMPLEPROFILE_CHAR4: uint8 notify_gate_open; // notify 是否打开 uint16 notify_Handle; GAPRole_GetParameter(GAPROLE_CONNHANDLE,&notify_Handle); //获取当前连接的handle notify_gate_open = GATTServApp_ReadCharCfg( notify_Handle, simpleProfileChar4Config );//读出CCC的值 if(notify_gate_open == GATT_CLIENT_CFG_NOTIFY){ //方法封装的 ServApp_SendNotiInd(value,len); } else { ret = bleInvalidRange; } break;

——————————————————————————————————

bStatus_t ServApp_SendNotiInd( uint8_t *nvalue,uint16_t nlen){ attHandleValueNoti_t noti; uint16_t slen; bStatus_t status; slen = nlen; //获得notify 相应通道的状态,用于从机有没有被连接上 gattCharCfg_t *pItem = simpleProfileChar4Config;

// 若从机有已经被连接上 /////////////////////////////////////////// Display_print0(dispHandle, 3, 5, "not conn"); /////////////////////////////////////////// if ( pItem->connHandle != INVALID_CONNHANDLE ) { // 对要发送的数据申请一段内存 // ATT_HANDLE_VALUE_NOTI: 申请这段内存用来发送NOTIFY;要申请多少内存;系统同意分配你多少内存 noti.pValue = (uint8 *)GATT_bm_alloc( pItem->connHandle, ATT_HANDLE_VALUE_NOTI,slen,&slen); //若果申请到了地址 if ( noti.pValue != NULL ) { // 填充noti结构 ,获得通知的handle noti.handle = simpleProfileAttrTbl[11].handle; noti.len = slen; memcpy(noti.pValue, nvalue, slen); ////////////////////// static uint8 i = 0; Display_print1(dispHandle, 3, 5, "***%d***",i++); ////////////////////// // 验证格式并发送数据 GATT_Notification 在从机代码中使用,由从机主动通知,且不需要主机发出请求和回应。 // GATTServApp_ProcessCharCfg;从机代码中使用,需要主机发送一次“通知请求”给从机,从机收到“通知请求”才发送通知 status = GATT_Notification( pItem->connHandle, &noti, FALSE );

if ( status != SUCCESS ) { GATT_bm_free( (gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI ); } } //没申请到地址 else { GATT_bm_free( (gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI ); status = bleNoResources; } }

return ( status );}

——————————————————————————————————

//************************************************************************************

//************************************************************************************

下面是主机端代码:CC2541

——————————————————————————————————

// ble 处于 发现char中… else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR ) { DEBUG(" finding char …\n"); printf("pMsg->method =%d ;dnumPairs=%d \n",pMsg->method ,pMsg->msg.readByTypeRsp.numPairs); // pMsg->method =9 ;dnumPairs=1 // Characteristic found, store handle 若已经发现了特征,记录下特征句柄 ;从此可以读写特性值,对于 NOTIFY 或 INDICATE 类型的需要先激活 if ( pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0 ) { // DEBUG("had find char, recod char hand\n"); simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0], pMsg->msg.readByTypeRsp.dataList[1] ); printf("simpleBLECharHdl=%x \n",simpleBLECharHdl);    // 这里读取的0x26 open_notify(); simpleBLEProcedureInProgress = FALSE; } // 若还没发现了特征,ble 就设置为 发现过中的 空闲状态 simpleBLEDiscState = BLE_DISC_STATE_IDLE; }

——————————————————————————————————

#define GATT_CLIENT_CFG_NOTIFY 0x0001 //打开notify开关的数值

//修改从机skconfig的值uint8 open_notify(void){ //开启notify的CCC attWriteReq_t req; //char4的CCC的特征值句柄,这里写死0x2F,可通过btool获取到 req.handle = simpleBLECharHdl+2 ; // CCC handle   =  0x26+2 =0x28 req.len = 2; req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); //【1:开启Notification 0:关闭Notify】 req.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY); // 【1:开启Indification 0:关闭Indi】 req.sig = 0; req.cmd = 0; printf("retrurn =%d\n",GATT_WriteNoRsp(simpleBLEConnHandle ,&req));                                                 // 这个会 return  INVALIDPARAMETER=2 //printf("retrurn =%d\n",GATT_WriteCharValue(simpleBLEConnHandle ,&req,simpleBLETaskId));         // 这个会 retrurn =22

}

——————————————————————————————————

关于句柄:我看了下没问题

希望能帮忙分析一下。。。

赞(0)
未经允许不得转载:TI中文支持网 » CC2640的 notify问题,与CC2541无法通信。
分享到: 更多 (0)