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.

[参考译文] LP-EM-CC2340R5:如何将 1000 字节的数据从中央器件写入外设。

Guru**** 2539500 points
Other Parts Discussed in Thread: LP-EM-CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1527176/lp-em-cc2340r5-how-to-write-1000-bytes-of-data-from-a-central-to-a-peripheral

器件型号:LP-EM-CC2340R5

工具/软件:

大家好、我正在使用 LP-EM-CC2340R5、在一次写入 1000 字节数据时遇到问题。

我正在开发我的自定义客户端、其中我的客户端将向服务器写入 1000 字节的数据。 我一直使用该 API 来执行此操作。  

void WriteData_OverBLE(uint8_t *payload, uint16_t length)
{
    uint16_t offset = 0;
    bStatus_t status;
    linkDBInfo_t connInfo = {0};
    
    // Get connection info including negotiated MTU
    status = linkDB_GetInfo(BLE_Handle.Connection_Handle, &connInfo);
    if (status != SUCCESS)
    return;
    
    uint16_t maxChunkLen = connInfo.MTU - 3;
    
    while (offset < length)
    {
        count_of_gatt_write++;
        
        uint16_t chunkLen = (length - offset > maxChunkLen) ? maxChunkLen : (length - offset);
        
        attPrepareWriteReq_t req = {0};
        req.pValue = GATT_bm_alloc(BLE_Handle.Connection_Handle, ATT_WRITE_REQ, chunkLen, NULL);
        
        if (req.pValue != NULL)
        {
            req.handle = BLE_Handle.Rx_Char_Handle;
            req.len = chunkLen;
            req.offset = offset;
            memcpy(req.pValue, payload + offset, chunkLen);
            
            status = GATT_WriteLongCharValue(BLE_Handle.Connection_Handle, &req, BLEAppUtil_getSelfEntity());
            
            if (status != SUCCESS)
            {
                for(;;);
                GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
                return;
            }
        }
    
    offset += chunkLen;
    }

}



1.我协商 MTU 大小为 MAX ,即 247 ,我能够将 244 字节的自定义数据写入我的自定义特性上的服务器。 在服务器端、我能够正确接收数据、而不会出现任何问题。 客户端接收到状态为成功的 ATT_EXECURE_WRITE_RSP。

2.当 COUNT_OF_GATT_WRITE 变为 2 时、会进入指示 BLE_PENDING 的循环、因为未正确处理该循环。

3.因此、我看到的权变措施是等待 ATT_EXECURE_WRITE_RSP 、当我收到 RSP 时、我调用了下一次写入。 它基本上是通过执行 4 次写入来手动发送数据。 现在、我想知道是否有方法可以一次性发送 1000 字节的数据、而不是多次调用相同的 API。

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

    您好:

    感谢您联系我们! 解决方法是实现此目标的最佳方法。 使用 GATT_WriteLongCharVaue 时、仅当收到 ATT_EXECURE_WRITE_RSP 时、该过程才完成。 因此、您需要等待该事件、然后再发送数据包的下一个片段。

    我希望这能回答您的问题!

    此致、

    Tarek