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:在中央器件中接收到100字节(56个数据包)后停止接收通知

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1512026/cc2340r5-stopped-receiving-notification-after-receiving-100-bytes-of-56-packets-in-central

器件型号:CC2340R5

工具/软件:

尊敬的 TI 团队:

我正在设计一个 多角色应用 在上 CC2340R5 串联电阻 BLE5-Stack 。 该设备同时发挥作用 中心 在一起 、并成功地与另一个通信 CC2340R5 BLE 器件 充当外设的角色。 此外、多角色模块还可以成功与移动设备连接。

MTU 大小 设置为255-4

POSIX 线程栈大小为0x400

堆大小为0x4D50

问题:

我正在使用从一个外围器件(另一个 CC2340R5)向我的多角色中央器件发送通知 100字节的数据 。 中央接收成功 55个数据包 。 然而,在那之后,中心 停止接收数据 。 时钟函数 更新数据 在上 GATT 写入特性 外设的可用性(四处发送 50字节 )、我遇到了以下问题:

我看到了一个NULL回报:

REQ_pValue = GATT_BM_alloc (ConnHandle、ATT_PREPARE_WRITE_REQ、len、NULL);

bool Central_sendGattWrite(uint8_t *pData, uint16_t len, uint16_t ConnHandle)
{
    attPrepareWriteReq_t req;
    status_t status = FAILURE;
    BLEAppUtil_entityId_t getSelfEntity;
    getSelfEntity = BLEAppUtil_getSelfEntity();

    req.pValue = GATT_bm_alloc(ConnHandle, ATT_PREPARE_WRITE_REQ, len, NULL);

    if (req.pValue != NULL)
    {
        req.handle =  writeHandle - 1
                req.len = len;
        memcpy(req.pValue, pData, len);
        status = GATT_WriteLongCharValue(ConnHandle, &req,/*ICall_getEntityId*/
                                         getSelfEntity); //GATT_WriteNoRsp
        if (status != SUCCESS)
        {
            GATT_bm_free((gattMsg_t*) &req, ATT_PREPARE_WRITE_REQ/*ATT_WRITE_REQ*/);
            UART2_write(uart, "fail\n",4, 0);
            UART2_write(uart, &status,1, 0);
        }      
    }else
    {
        UART2_write(uart, "\nBM_Allocfail",13, 0); 
    }
    return status;
}

我已经测试了另一个场景、其中包括 中心 将数据发送到 在一起 连接 GATT 写入特性 并期望 A 通过通知回复  每一次 1秒 。 会发生以下情况:

  • 系统最初工作正常、但是 30秒后 通知接收停止

  • 执行另一个任务时会发生什么 GATT 写入  如果返回失败状态0x16、则使用 GATT_WriteLongCharValue 进行操作

    status = GATT_WriteLongCharValue(ConnHandle, &req,getSelfEntity);

如果对导致问题的原因以及如何解决问题有任何建议或见解、我将不胜感激。

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

    您好:

    感谢您联系我们! 我们将看看这个并尽快回复您!

    此致、

    Tarek

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

    你好 Joseph!

    我怀疑您在第19行执行的内存分配GATT_bm_free((gattMsg_t*) &req, ATT_PREPARE_WRITE_REQ);失败、并且您的内存未正确分配。

    的文档 GATT_bm_free说明其需要的参数是指向gattMsg_t对象 attPrepareWriteReq_t的指针、对象是包含该类型的联合体。 当给他指向你的req变量的指针是正确的事情要做,你做的实际分配GATT_bm_alloc是在pValue的字段上req,而不是req对象本身。

    解决此问题的方法是将类型更req改为attPrepareWriteReq_t*、并调用GATT_bm_alloc req 而不是req.pValue。 您还需要将调用更GATT_WriteLongCharValueGATT_bm_freereq改为某些函数、如和、方法是给它们而不是&req

    生成的代码如下所示:

    bool Central_sendGattWrite(uint8_t *pData, uint16_t len, uint16_t ConnHandle)
    {
        attPrepareWriteReq_t* req;
        status_t status = FAILURE;
        BLEAppUtil_entityId_t getSelfEntity;
        getSelfEntity = BLEAppUtil_getSelfEntity();
    
        req = GATT_bm_alloc(ConnHandle, ATT_PREPARE_WRITE_REQ, len, NULL);
    
        if (req != NULL)
        {
            req->handle =  writeHandle - 1;
            req->len = len;
            
            memcpy(req->pValue, pData, len);
            
            status = GATT_WriteLongCharValue(ConnHandle, req,/*ICall_getEntityId*/
                                             getSelfEntity); //GATT_WriteNoRsp
            if (status != SUCCESS)
            {
                GATT_bm_free((gattMsg_t*) req, ATT_PREPARE_WRITE_REQ /*ATT_WRITE_REQ*/);
                UART2_write(uart, "fail\n",4, 0);
                UART2_write(uart, &status,1, 0);
            }      
        }else
        {
            UART2_write(uart, "\nBM_Allocfail",13, 0); 
        }
        return status;
    }

    您是否可以尝试此解决方案、看看它是否能解决您的问题?

    此致、
    Maxence

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

    您好、Maxence、

    感谢您对代码更改的建议。 我尝试在我的函数中实现建议的修改、但遗憾的是、当代码执行该函数时、模块被重置。 所以,我在我的实施中做了一个更正  ,改变:&req 到 req.pValu。

    GATT_bm_free((gattMsg_t*) &req, ATT_PREPARE_WRITE_REQ);

    to

    GATT_BM_FREE ((gattMsg_t*) req.pValue、ATT_PREPARE_WRITE_REQ);

    关于主要问题:
    当中央设备未接收到通知(用于向外设写入数据的内存分配成功)时、一切正常。 但是、一旦中央器件开始从外设接收通知(大约55个数据包)、它就会停止接收进一步的通知。 此时、中央器件也未能分配内存来向外设写入数据。

    我确定了app_data.c文件中的根本原因。 在以下函数中收到通知后、内存未取消分配:

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

    为解决此问题、我在 GATT_eventhandler 函数末尾添加了以下行

    GATT_BM_FREE (&(gattMsg->msg)、gattMsg->method);

    完成此更改后、问题已解决。