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.

CC2642R-Q1: 在蓝牙配对完成后使用gapBondMgrReadBondRec函数,在断开蓝牙后卡死。

Part Number: CC2642R-Q1

1.在使用蓝牙例程过程,打开配对绑定功能,在配对完成后SP_PAIR_STATE_EVT事件下case GAPBOND_PAIRING_STATE_BOND_SAVED里面使用gapBondMgrReadBondRec()这个函数,在断开蓝牙连接后出现卡死状况,上电重启程序也不能运行,只能重新刷写程序。

2.使用gapBondMgrReadBondRec函数的方法是从C:\ti\simplelink_cc13xx_cc26xx_sdk_7_10_01_24\docs\ble5stack\ble_user_guide 的 GAP Bond Manager and LE Secure Connections章节学习的。

3.请问这种情况怎么解决?

  • 您好,

    遇到在使用 `gapBondMgrReadBondRec()` 函数后造成系统卡死的情况,可能是由于在特定的事件处理中进行了不适当的操作,或者是资源管理(如内存)上的问题。以下是一些建议和步骤来解决这个问题:

    1. 确保你按照 TI 文档中的指导正确使用 `gapBondMgrReadBondRec()` 函数。包括函数调用的上下文、传入的参数以及对返回值的处理。

    2. 进行调试和记录一些日志并提供给我们,这样我们也能更快定位问题。
    - 在调用 `gapBondMgrReadBondRec()` 之前和之后添加日志打印,观察程序的行为和变量的状态。
    - 使用调试工具逐步执行,查看在哪一步操作后程序开始出现异常行为。

  • 这个函数是从 NV 提取绑定信息为了成功提取绑定信息,应用程序需要输入对等设备的地址类型和对等设备的地址。建立链接时,这些信息将从 BLE5-Stack 提供给应用程序。

    我按照  BLE5 User guide 中的描述导入之前读取的 Bonding 时(如下所示),可以看到导入成功

      // Parameters needed for storing bonding information.
                            gapBondRec_t pSavedBondRec1;
                            gapBondLTK_t pLocalLtk1;
                            gapBondLTK_t pPeerLtk1;
                            uint8_t pPeerIRK1[KEYLEN];
                            uint8_t pPeerSRK1[KEYLEN];
                            uint32_t pPeerSignCount1;
                            gapBondCharCfg_t charCfg1;
    
                           uint8_t readStatus = FAILURE;
                           readStatus = gapBondMgrReadBondRec(PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID,
                                                              pSavedBondRec.addr,
                                                              &pSavedBondRec1,
                                                              &pLocalLtk1,
                                                              &pPeerLtk1,
                                                              pPeerIRK1,
                                                              pPeerSRK1,
                                                              pPeerSignCount1,
                                                              &charCfg1);
                           if (readStatus == SUCCESS)
                           {
                             // If read success, then export the data
                             // Here we will print it out for later use.
                             // For the print, we added the following defines
                             // Please consider your own example and modify as needed
                              #define SP_ROW_DEBUG_BondLog  (TBM_ROW_APP + 9)
                              #define SP_ROW_DEBUG_PeerAddr (TBM_ROW_APP + 10)
                              #define SP_ROW_DEBUG_LocalLTK (TBM_ROW_APP + 16)
                              #define SP_ROW_DEBUG_PeerIRK  (TBM_ROW_APP + 40)
                              #define SP_ROW_DEBUG_PeerSRK  (TBM_ROW_APP + 56)
    
                             Display_printf(dispHandle, SP_ROW_DEBUG_PeerAddr, 0,
                                            "Peer Device Addr = [0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x];",
                                           pSavedBondRec1.addr[0],
                                           pSavedBondRec1.addr[1],
                                           pSavedBondRec1.addr[2],
                                           pSavedBondRec1.addr[3],
                                           pSavedBondRec1.addr[4],
                                           pSavedBondRec1.addr[5]);
    
                             Display_printf(dispHandle, SP_ROW_DEBUG_PeerAddr+1, 0, "Peer Device AddrType = 0x%02x; stateFlag = 0x%02x;",pSavedBondRec1.addrType,pSavedBondRec1.stateFlags);
                             Display_printf(dispHandle, SP_ROW_DEBUG_PeerAddr+2, 0, "Local Device eDiv = 0x%02x; keySize = 0x%02x", pLocalLtk1.div, pLocalLtk1.keySize);
                             Display_printf(dispHandle, SP_ROW_DEBUG_PeerAddr+3, 0, "peer Device SignCount = 0x%08x;", pPeerSignCount1);
                             for (i = 0; i < KEYLEN; i++)
                             {
                                 Display_printf(dispHandle, SP_ROW_DEBUG_LocalLTK+i, 0, "Local Device LTK[%d]= 0x%02x;", i, pLocalLtk1.LTK[i]);
                                 Display_printf(dispHandle, SP_ROW_DEBUG_PeerIRK+i, 0, "Peer Device IRK[%d]= 0x%02x;", i, pPeerIRK1[i]);
                                 Display_printf(dispHandle, SP_ROW_DEBUG_PeerSRK+i, 0, "Peer Device SRK[%d]= 0x%02x;", i, pPeerSRK1[i]);
                             }
                             for (i = 0; i < B_RANDOM_NUM_SIZE; i++)
                             {
                                 Display_printf(dispHandle, SP_ROW_DEBUG_LocalLTK+16+i, 0, "Local Device rand[%d]= 0x%02x;", i, pLocalLtk1.rand[i]);
                             }
    
                             Display_printf(dispHandle, SP_ROW_DEBUG_PeerSRK+16+1, 0, "Charcfg attrHandle = 0x%04x; value = 0x%02x", charCfg1.attrHandle, charCfg1.value);
                           }

  • 我这边也是导入成功,有log打印出来,但是在在蓝牙断开后会死机,如果不用这个函数则一切正常,这边您方便的化能不能把你加了上述函数的代码工程分享一下,我这边做个对比,如果不方便就算了 ,十分感谢您的帮助。

  • 您好,

    导入成功,有log打印出来,但是在在蓝牙断开后会死机,如果不用这个函数则一切正常

    建议逐步测试一下代码。

    根据您的描述 gapBondMgrReadBondRec() 函数是按预期工作的。

    尝试使用调试器(可在此处获取调试指南)来确定如何引发错误。

    或者,您把文件贴上来,我们会对您的代码进行检查。

  • 您的问题解决了吗?

  • 您好,问题已经解决了,是示例有问题,你们的技术支持已给出了解决办法,感谢您的帮助  谢谢。

  • 不客气,问题解决了就好。

  • 您使用的是哪个示例,最终如何解决的,可以分享一下吗?

  • 好的,感谢分享。