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.

[参考译文] CC2340R5:错误读取特性

Guru**** 2331900 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1460962/cc2340r5-error-reading-characteristics

器件型号:CC2340R5

工具与软件:

您好!

CCS 版本:12.7.1.

SDK 版本:8.10.01.02

项目: basic_ble

SYSCONF:
启用的外设+中心角色。

Сonnect 将设备移至中央设备。
此连接器件使用 CC2642微控制器。
正在获取发现参数。
读取接收到的特征指针的值(器件状态)。
在一个特定数量的读取(210-230)后、我收到一个错误、指向接收数据的指针为 NULL。
我已重置 CC2340并重新配置堆栈。 之后、一切都会重复。
问题可能是什么?
同时、BLE 堆栈将正常工作、因为我们已通过 BLE 与 CC2340建立连接。

GATT 事件处理程序的代码

静态空 GATT_eventhandler (uint32事件、BLEAppUtil_msgHdr_t * pMsgData)

 gattMsgEvent_t *gattMsg =( gattMsgEvent_t *)pMsgData;
 uint8_t channel = Connection_getConnIndex (gattMsg->connHandle);
 attReadByTypeReq_t req;

 如果((channel == LL_INACTIVE_CONNECTIONS)||(channel == ble_channel_peripheral))
  返回;

 if (gattMsg->HDR.status == bleNotConnected)  
  返回;

 开关(事件){

 案例 BLEAPPUTIL_ATT_MTU_UPDATD_EVENT:
  /*           */   
  休息;
  
 案例 BLEAPPUTIL_ATT_EXCHANGE_MTU_RSP:
  /*           */
   休息;

 案例 BLEAPPUTIL_ATT_FIND_BY_TYPE_VALUE_RSP:
  /*    */   
  休息;

 案例 BLEAPPUTIL_ATT_READ_BY_TYPE_RSP:
  /*     */
  休息;

 案例 BLEAPPUTIL_ATT_READ_RSP:
 {
  uint8_t *数据=(uint8_t*) gattMsg->msg.readRsp.pValue;
  uint16_t len = gattMsg->msg.readRsp.len;

  if (((data == NULL)||(len == 0)))
   休息;

  //阀状态
  /*     */  
   休息;
 }

 案例 BLEAPPUTIL_ATT_WRITE_RSP:
  /*        */  
   
休息;
    
 案例 BLEAPPUTIL_ATT_ERROR_RSP:
    /*       */
    休息;
 默认值:
  休息;
 }//切换

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您联系我们。 自8.10发布以来、已经有一些 SDK 版本、这些版本修复了许多错误、并对 F3 SDK 进行了几项改进。 您能否在8.40 SDK 上重新测试此行为? 您是否可以使用低功耗蓝牙监听器? 如果是、那么您是否也可以获取监听器行为日志?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    感谢您的回答。
    我有  低功耗蓝牙监听器。  
    我将再次获取日志并将其发布在聊天中。
    尝试使用新的 SDK 测试器件。
    我将报告获得的结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    听起来不错。 期待您的参与!

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    已连接到项目 SDK 版本8.40。
    问题自我重复、在多次读取特征的操作后、指针 msg.readRsp.pValue 返回 NULL。
    启动了 ROV 以跟踪堆大小。
    每次调用 GATT_ReadCharValue()函数时、堆大小会减少64个字节。
    处理 BLEAPPUTIL_ATT_READ_RSP 事件后、不会恢复堆大小。
    告诉我、由于内存泄漏、获得 gattMsg->msg.readRsp.pValue = NULL 是问题吗?
    是否有必要通过 BLEAPPUTIL_ATT_READ_RSP 事件中的 gattMsg->msg.readRsp.pValue 指针释放存储器?
    以及如何正确执行它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您在8.40上快速检查! 您是对的。 ATT_READ_RSP 有效载荷必须在提取数据后处于空闲状态。 BLEAppUtil_free() API 可用于此目的。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    我尝试通过 gattMsg->msg.readRsp.pValue 指针使用 BLEAppUtil_free ()释放内存。
    但是、如果我执行这样的操作、我会收到硬错误。
    这就是为什么我写了,如何通过 gattMsg->msg.readRsp.pValue 指针正确释放内存?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能在免费尝试的地方共享代码片段吗?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    用于处理 BLEAPPUTIL_ATT_READ_RSP 事件的代码片段
    在操作完成后执行数据处理和存储器清除

    案例 BLEAPPUTIL_ATT_READ_RSP://已收到响应

    uint8_t *数据=(uint8_t*) gattMsg->msg.readRsp.pValue;
    uint16_t len = gattMsg->msg.readRsp.len;

      if (((data == NULL)||(len == 0))){ // 无可用数据
        if (DATA = NULL)
          SET_ERROR (7);
          休息;
      }
      // 处理接收的数据
      
    if (pConnInfo->discoveryState == BLE_DISCOVERY_STATE_START){
        if (len == sizeof (blem_ValveState_t)){
          iBus_sendFrameGet (data、len、channel);
        }
      }
      //正在清除存储器
      
    BLEAppUtil_free (data);

      休息;
    }

    据我所知,错误不是发生在这个地方,而是当试图清除记忆事件处理 Util_Task 中

    void Util_Task (void *arg)

      //注册到堆栈并创建队列和事件
      BLEAppUtil_stackRegister ();

      //初始化 ble stack
      BLEAppUtil_stackInit();

      //应用程序主循环
      (;;)
      {
        BLEAppUtil_appEvt_t pAppEvt;

        //等待接收队列消息
        如果(MQ_RECEIVE (BLEAppUtil_theardEntity.queueHandle、(char*)&pAppEvt、sizeof (pAppEvt)、NULL)> 0)
        {
          BLEAppUtil_msgHdr_t * pMsgData =(BLEAppUtil_msgHdr_t *) pAppEvt.pData;
          bool freeMsg = false;
      ..........

          //释放数据
          if (pMsgData && freeMsg)
          {
            //使用 freeMsg
            BLEAppUtil_freMsg (pMsgData);
          }
          否则为(pMsgData)
          {
            //免费使用
            BLEAppUtil_free (pMsgData);
            pMsgData = NULL;
          }
          设计
          {
            /*即使是、也需要此 else 子句
              程序员预计这一点永远不会达到
              需要修复 MISRA-C:misra.if.no_else */
          }
        }
      }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    因此、我们可能会双倍释放内存。 你能在空闲后立即将变量设置为 NULL 吗?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    已找到问题的解决方案。
    在位于 app_data.c 模块中的 GATT eventhandler 处理程序结束时、需要调用 GATT_BM_FREE (&G、gattMsg->msg、gattMsg->method)函数。
    我认为、这一点应添加到 SDK 中提供的示例中。