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:从密钥卡写入多角色→集群返回 LEN=0

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1576173/cc2340r5-gatt-write-from-keyfob-multirole-cluster-returns-len-0

器件型号:CC2340R5


工具/软件:

您好论坛、

我正在处理一个密钥卡项目、其中密钥卡和群集设备都是多角色的。 在钥匙扣方面、当按下一个按钮时、它会尝试通过 GATT 写入向群集发送数据包 (GATT_WriteCharValue)。

但是、在集群侧、在写入回调 (WriteCB) 内部、我没有收到任何数据;len参数始终为 0。 值得注意的是,GATT_WriteCharValue 密钥卡上的 API 返回SUCCESS,并且 GATT 消息中没有报告错误。

作为交叉检查、我使用 NRF Connect 应用程序连接到集群并执行相同的写入操作。 使用 NRF Connect 时、写入按预期工作、群集可以正确接收数据。

我使用的是 SDK 版本 09.11.00.08。

是否有任何关于从钥匙扣写入的内容为何无法到达群集的建议?

我要添加代码片段、请看一下

void send_packet(uint8_t packet[], uint8_t len)
{
    attWriteReq_t wReq;
    KeyFobFlags.data_exchange_in_process = 1;
    
    memcpy(current_packet,packet,len);      // Store latest packet globally.
    uint8_t tmp;


    wReq.pValue = GATT_bm_alloc( CurConnHndl, ATT_WRITE_REQ, len, NULL );
    if(NULL == wReq.pValue)
        {
            sprint("\nsendPacket::MemAllocError");//ERROR
            return;
        }
    memcpy(wReq.pValue,packet,len);

    wReq.cmd    = 0;
    wReq.sig    = 0;
    wReq.handle = ClusterParams.valueHndle_CtrlPoint_char;//ClusterParams.valueHndle_CtrlPoint_char;
    sprint("\nValue Handle:");
    print(&ClusterParams.valueHndle_CtrlPoint_char,2);
    uint8_t status = 0x00;
    //status = GATT_WriteNoRsp(CurConnHndl, &wReq);
    sprint("\nConnHandle:");
    print(&CurConnHndl,2);
    status = GATT_WriteCharValue(CurConnHndl, &wReq, BLEAppUtil_getSelfEntity());
        sprint("\nLen:");
    tmp = len + 0x30;
    print(&tmp,1);
    sprint("\nPacket Sent:");
    print(&status,1);
    if(SUCCESS != status)
        {
            GATT_bm_free((gattMsg_t*)&wReq, ATT_WRITE_REQ);
        }
    if(SUCCESS == status)
        {
            //read_auxillary_packet(); // the auxillary packet from cluster.
        }
    
}

此致、
Vaibhav

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

    您好!

    GATT_WriteCharValue 出现错误的两个主要原因可能是:
    -特性句柄不正确 (ClusterParams.value'Point_char) Hndle_Ctrl
    - GATT_WriteCharValue 由于其他原因而失败

    您能否检查 GATT_WriteCharValue 的返回值是否成功? 如果没有、您能否回答其值、以便我们找出问题所在?
    此外、特性的值句柄可能错误。 您是否正在尝试向 CCCD 写入通知?

    如果您能提供监听器日志来帮助您、这也会有很大帮助。

    此致、
    Lea  

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

    尊敬的 Lea:

     在我看来、characterHandle 是正确的、因为我得到了 writeCB  AT  仪表组端。 GATT_WriteCharvalue 的返回值为 成功  我在前面已经说过。 我不使用 CCCD、特征只有 write 属性。  

    我们没有 BLE 监听器、使用 nRF52840 的监听日志是否正常?

    此致

    Vaibhav

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

    你好、Vaibhav!

    抱歉、我误解了您的问题。 您面临的问题是 attWriteReq_t 结构实际上有一个 len 字段 。 声明 wREQ 对象时、C 标准要求默认情况下每个字段都设置为 0。 这意味着您正在为数据调用长度为 0 的函数、即使 pValue 字段包含数据也是如此。

    解决方法是在调用 GATT_WriteCharValue 之前添加以下行:  
    wReq.len = len;

    此致、
    Lea

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

    尊敬的 Lea:

    不可以、我在传递到 GATT_WriteCharValue 之前交叉检查了 attWriteREQ_t 的“Len"值“值、且该值为非零。

    只是为了进一步,我做了单独的项目来测试这个例程的功能,在那里它工作正常。  

    此致

    Vaibhav

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

    您好、

    您能给我发送您正在使用的代码吗? 上面发送给我的代码未设置 wReq 对象的 len 值。

    此致、
    Lea