TI中文支持网
TI专业的中文技术问题咨询交流网站

CC2541 GAPRole_TerminateConnection调用后有时候会无法进入GAP_LINK_TERMINATED_EVENT

代码如下:

if(events & SBP_BLE_SLEEP_EVT)
{

  SBP_BLE_Sleep_Func();

  return (events ^ SBP_BLE_SLEEP_EVT);
}

void SBP_BLE_Sleep_Func(void)
{
  if(Ble_rf.Ble_EnableSleepFlg != false)
  {
    U8 Adv_Status;
    
    os_env.BLE_statu = 2;
    os_env.lock_Comm_Mone = 4;

    Adv_Status = false;
    GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof(U8), &Adv_Status);
    
    GAPRole_TerminateConnection();    
    Ble_rf.Ble_EnableSleepFlg = false;                      
    osal_stop_timerEx(gu8_simpleBLEPeripheral_TaskID,SBP_BLE_SLEEP_EVT);
  }
}

从机断开后,有时候会出现无法进入GAP_LINK_TERMINATED_EVENT的情况,请问这是为什么呢?

Kevin Qiu1:

使用GAPRole_TerminateConnection,要进入GAP_LINK_TERMINATED_EVENT的话,要传入参数,检查下传入参数是否正确 * @brief Terminates the existing connection. * * Public function defined in peripheral.h. */ bStatus_t GAPRole_TerminateConnection(void) { if ((gapRole_state == GAPROLE_CONNECTED) || (gapRole_state == GAPROLE_CONNECTED_ADV)) { return (GAP_TerminateLinkReq(selfEntity, gapRole_ConnectionHandle, HCI_DISCONNECT_REMOTE_USER_TERM)); } else { return (bleIncorrectMode); } }

user5994340:

回复 Kevin Qiu1:

该函数返回的是SUCCESS,然而偶尔会无法进入事件

Kevin Qiu1:

回复 user5994340:

偶尔无法进入,在无法进入的时候是否还在广播或者还处于连接状态中?

user5994340:

回复 Kevin Qiu1:

显示还处在连接状态

Kevin Qiu1:

回复 user5994340:

当连接终止的时候才能进入到GAP_LINK_TERMINATED_EVENT
/*——————————————————————-
* Terminate a link connection.** @par Corresponding Events:* @ref GAP_LINK_TERMINATED_EVENT of type @ref gapTerminateLinkEvent_t** @param connectionHandle connection handle of link to terminate*or @ref CONNHANDLE_ALL* @param reason terminate reason.** @return @ref SUCCESS : termination request sent to stack* @return @ref bleIncorrectMode : No Link to terminate* @return @ref bleInvalidTaskID : not app that established link*/
extern bStatus_t GAP_TerminateLinkReq(uint16_t connectionHandle, uint8_t reason);

user5994340:

回复 Kevin Qiu1:

现在问题就是调用函数已经成功,然而连接没有终止。
目前采用一个取巧的办法,判断有没有中断成功,若未成功,再次调用GAPRole_TerminateConnection函数

Kevin Qiu1:

回复 user5994340:

操作之后能进入到GAP_LINK_TERMINATED_EVENT中吗

user5994340:

回复 Kevin Qiu1:

由于判断流程是在void osal_start_system( void )函数中,所以是在一直判断,目前已经可以断开连接,但是重试了多少次没有测

Kevin Qiu1:

回复 user5994340:

可能是调用方式不对,你可以仿照例程里面的调用方法。
建议在应用程序任务或ICall注册的RTOS任务中调用这个API,不要在非ICall的回调处理函数里调用。
注意不要在application task (或任何ICall注册的RTOS任务)之外调用这些API

user5994340:

回复 Kevin Qiu1:

在应用程序任务中调用是说在任务事件中调用吗?ICall注册的RTOS任务是什么意思?相关文件是什么呢?
我看到例程里是在任务事件中调用的,如下是血压计例程中的代码:if ( events & BP_DISCONNECT_EVT ){uint8 advEnable = FALSE;//disable advertising on disconnectGAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &advEnable );HalLedSet ( HAL_LED_1, HAL_LED_MODE_ON );// Terminate ConnectionGAPRole_TerminateConnection();
return (events ^ BP_DISCONNECT_EVT);}
应该跟我的是差不多的

赞(0)
未经允许不得转载:TI中文支持网 » CC2541 GAPRole_TerminateConnection调用后有时候会无法进入GAP_LINK_TERMINATED_EVENT
分享到: 更多 (0)