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.

[参考译文] CC2745R10-Q1:关于 L2CAP 发送 API 使用问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1501085/cc2745r10-q1-on-the-usage-issue-of-the-l2cap-sending-api

器件型号:CC2745R10-Q1

工具/软件:

您好、TI

我目前需要通过 L2CAP 协议层传输数据。 我使用 L2CAP_SendSDU()函数发送、输入参数是 l2capPacket_t 类型的结构 哪个函数应该用于为 l2capPacket_t 中的 pPayload 分配存储器?

此致!

普雷斯顿

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

    您好:

    文档的这一部分提到  L2CAP_BM_alloc (...)  应使用: https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_8_40_00_61/docs/ble5stack/ble_user_guide/html/ble-stack-common/l2cap.html?highlight=l2cap#l2cap-mtu

    希望这对您有所帮助!

    此致、

    Nima Behmanesh

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

    嗨、Nima

    我对参考文档中的示例代码有疑问。 在发送函数中执行 L2CAP_BM_alloc 后、仅在发送操作失败时才释放存储器。 这可能会在发送批量数据时导致问题(例如内存溢出)吗?

    bStatus_t Application_sendL2capData(void)
    {
      l2capPacket_t pkt;
      bStatus_t status = SUCCESS;
    
      // Tell L2CAP the desired Channel ID
      pkt.CID = cocCID;
    
      // Allocate space for payload
      pkt.pPayload = L2CAP_bm_alloc(sizeof(appData));
    
      /* Copy payload data */
      memcpy(pkt.pPayload, appData, sizeof(appData));
    
      if (pkt.pPayload != NULL)
      {
        pkt.len = (sizeof(appData));
    
        // Print transmit data to serial terminal, expected data is /0 terminated
        MenuModule_printf(11, 0, "L2CAP Data TX - %s", pkt.pPayload);
    
        // Send packet
        status = L2CAP_SendSDU(&pkt);
    
        // Check that the packet was sent
        if (SUCCESS != status)
        {
          // If SDU wasn't sent, free
          BM_free(pkt.pPayload);
        }
      }
      else
      {
        status = bleMemAllocError;
      }
    
      return (status);
    }

    此致!

    普雷斯顿

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

    嗨、Nima

    此外、我想确认:CC2745和 CC2340之间的蓝牙功能(包括器件配对和 L2CAP 数据传输)是否已正确测试并验证为可正常运行?

    CC2340 SDK 版本:8.20.0.119

    此致!

    普雷斯顿

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

    您好:

    我对参考文档中的示例代码有疑问。 在发送函数中执行 L2CAP_BM_alloc 后、仅在发送操作失败时才释放存储器。 这可能会在发送批量数据时导致问题(例如内存溢出)吗?

    开发人员负责管理此存储器:

    对于数据包有效载荷、更高级别的协议(ATT、SM、Application)负责使用进行分配 L2CAP_bm_alloc(...)。 对于 ATT 和 SM、这是对用户透明的。 对于 CoC SDU、用户拥有与有效载荷关联的存储器。

    但是、您在参考代码中提出了一个很好的观点。   无论数据包是否成功、该数据包都应空闲。

    此外、我想确认:CC2745和 CC2340之间的蓝牙功能(包括设备配对和 L2CAP 数据传输)是否已正确测试并验证为可正常运行?

    我建议使用最新版本的 SDK (编写此文件时为8.40)、尤其是使用 CC2745时。 您是否遇到问题?

    此致、

    Nima Behmanesh

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

    嗨、Nima

    我将在 CC2745和 CC2340之间建立蓝牙连接以进行 L2CAP 数据传输。 传输大约超过1KB 的数据(最大单帧有效载荷约为100多字节)后、L2CAP 传输失败。 在 CC2745端调试期间、程序始终在 osal_start_system ()处挂起。

    BLE 是否进入某种异常状态? 在不同的 SDK 版本之间连接和传输数据时是否会出现兼容性问题?

    此致!

    普雷斯顿

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

    您好:

    您是否介意附加调用栈?   调用 OSAL_START_SYSTEM()以启动任务和调度程序。 调用堆栈将为我提供了解 CC2745运行情况所需的信息。

    此致、

    Nima Behmanesh

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

    嗨、Nima

    如何获取调用栈信息?

    此致!

    普雷斯顿

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

    您好:

    通过调试工程、调试窗口应该会打开。 左上角应该有一个调用栈。

    此致、

    Nima Behmanesh

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

    嗨、Nima

    这是一个吗?

    通过 L2CAP 发送导致异常的数据后、系统在 osal_start_system()处重复停止。 初始化似乎失败、蓝牙广播已终止(CC2745)。

    此致!

    普雷斯顿

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

    您好普雷斯顿  

    我已被重新分配到 TT。 很抱歉耽误响应时间。  

    我将浏览您所看到的调用堆栈中的位置。 要澄清一下、您是在成功还是失败尝试后释放内存? 问题似乎可能是某种类型的内存泄漏、这很可能意味着在 L2CAP 事务之后没有释放数据包内存。  

    此外、两个不同 SDK 之间的通信不是问题。 归根结底、两个 SDK 都符合蓝牙规范。  

    谢谢、  

    Isaac

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

    您好、Isaac

    无论操作成功还是失败、都会释放内存。 存储器将重新发送-下次需要发送数据时已请求。 我认为我的处理方法是正确的、但我不知道为什么会导致内存泄漏。 我是否可以询问可以使用哪些方法进行故障排除?

    此致!

    普雷斯顿