This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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的情况,请问这是为什么呢?

  • 使用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);
    }
    }

  • 该函数返回的是SUCCESS,然而偶尔会无法进入事件
  • 偶尔无法进入,在无法进入的时候是否还在广播或者还处于连接状态中?
  • 显示还处在连接状态
  • 当连接终止的时候才能进入到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);
  • 现在问题就是调用函数已经成功,然而连接没有终止。
    目前采用一个取巧的办法,判断有没有中断成功,若未成功,再次调用GAPRole_TerminateConnection函数
  • 操作之后能进入到GAP_LINK_TERMINATED_EVENT中吗
  • 由于判断流程是在void osal_start_system( void )函数中,所以是在一直判断,目前已经可以断开连接,但是重试了多少次没有测
  • 可能是调用方式不对,你可以仿照例程里面的调用方法。
    建议在应用程序任务或ICall注册的RTOS任务中调用这个API,不要在非ICall的回调处理函数里调用。
    注意不要在application task (或任何ICall注册的RTOS任务)之外调用这些API
  • 在应用程序任务中调用是说在任务事件中调用吗?ICall注册的RTOS任务是什么意思?相关文件是什么呢?
    我看到例程里是在任务事件中调用的,如下是血压计例程中的代码:
    if ( events & BP_DISCONNECT_EVT )
    {

    uint8 advEnable = FALSE;

    //disable advertising on disconnect
    GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &advEnable );

    HalLedSet ( HAL_LED_1, HAL_LED_MODE_ON );

    // Terminate Connection
    GAPRole_TerminateConnection();

    return (events ^ BP_DISCONNECT_EVT);
    }
    应该跟我的是差不多的
  • 就是要在使用RTOS回调函数的任务中使用,具体请看协议栈中的说明(5.3.1节):www.ti.com.cn/.../swru271i.pdf
  • 如以上所贴代码,应该已经是在RTOS回调函数中使用了
  • 已经反馈给相关专家,请在这里关注回复e2e.ti.com/.../923030
    可能得等几天