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:如何在两个 CC2340R5器件之间交换 GATT 数据包?

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1407216/cc2340r5-how-to-exchange-gatt-packets-between-two-cc2340r5-devices

器件型号:CC2340R5

工具与软件:

您好、TI:

我将使用两个 CC2340器件、一个用作外设、另一个用作中央器件、并使用 SDK"simplelink_lowpower_f3_sdk_8_10_01_02"。 我正在使用的 BLE5堆栈示例工程是"basic_ble_oad_onchip"。

接下来、我需要连接这两个 CC2340器件、然后通过 Central 传输任何 GATT 数据包。
我选择了使用 GATT 中的"ATT_EXCHANGE_MTU_REQ"作为测试数据传输的方法。
在中 app_menu.c、我声明了一个名为 Menu_exchangeGATTmtuCB(uint8 index)的新函数。

然后、我在此处添加了一个按钮选择选项:


之后我 在中将 ATT_ExchangeMTUREQ ()称为 ATT_ExchangeMTUREQ ()  Menu_exchangeGATTmtuCB() and used MenuModule_printf for debugging.

构建项目后、 会弹出一条警告消息:
"对未声明函数'AssertHandler'的调用;ISO C99及更高版本不支持隐式函数声明[-Wimit-function-declaration]"

Tera Term 中的执行屏幕如下所示:


好像很成功、但当我使用监听器进行观察时、我看不到"ATT_EXCHANGE_MTU_REQ"交换。

我的代码中是否有任何需要修改的地方?
谢谢。

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

    尊敬的 Aki:

    感谢您评估 CC2340R5并将您的问题发布到 E2E 论坛!  TI 的所有 BLE E2E 论坛专家都将 在8月30日(星期五)休息、他们将按收到的顺序和优先级返回到应答论坛帖子。  在此之前、您可以进一步考虑以下一些资源、这些资源可以独立解决您的问题:

    如果您找到问题的解决方案、请回复此 E2E 帖子!  否则、 感谢您  提供的所有调试信息 、以便在 BLE E2E 专家返岗时为他们提供最佳的支持。

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的答复! 我可以使用 TI 在 GitHub 上公开提供的开源代码解决先前的问题。
    https://github.com/TexasInstruments/ble_examples

    但是、我遇到了一个新问题。 我正在中央设备以无限循环的方式重复发送 GATT 数据包、但由于中央设备崩溃、连接在大约8次迭代后断开。 每次我重新连接并再次运行无限循环时、都会出现此问题。 您能帮助我了解导致此问题的原因吗?

    下图显示了app_menu.c我根据 GitHub 上的 TI 开源代码修改后中的代码。

    下图显示了我使用监听器监测数据包观察到的结果。 理想情况下、这两个器件应该能够无限地交换 ATT 数据包。 但实际上、在大约八次交换之后、连接会断开。

    外设 UART

    谢谢你。

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

    今天的更新:即使使用函数GATT_bm_free()释放内存,崩溃的问题仍然存在。

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

    您好!

    感谢您联系我们! 很高兴您取得了进步! 我建议不要以这种方式实现功能。 相反、我建议利用发送数据包时返回的事件对后续数据包进行排队。 您可以使用全局变量来确定是否要发送新数据包、而不是使用无限的 while 循环。

    此致、

    1月

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

    您好!

    感谢您的建议! 我现在删除了Menu_doEnableNotification()内的无限循环 app_menu.c

    而且,根据你的建议,我 打电话Menu_doEnableNotification(1)ATT_HANDLE_VALUE_NOTI情况中app_data.c.

    我还打印一个计数器、用于跟踪发送的 GATT 数据包数。 但是、在发送大约162个数据包后、传输停止、但 CC2340R5不会像之前那样崩溃或断开。

    该监听器还显示ATT_WRITE_CMD数据包总共传输了大约162次。

    您能说明为什么会发生这种情况吗?

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

    您好!

    很高兴听到这种行为似乎有所改善! 您是否可以尝试重新启动通知以查看是否发送了更多数据包? 器件是否在响应? 您仍然可以操作菜单吗?

    此致、

    1月

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

    您好!
    当我重新启动通知时、我通过监听器观察到通知不会再次发送。 其他类型的 ATT 数据包(例如 ATT_WRITE 和 ATT_READ)也无法发送。 通过调用状态返回的值不是0而是23、这似乎表示发送失败。

    但是、仍然正常发送链路层数据包、例如 LL_encryption_req 和 LL_para_update_req。

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

    您好!

    明白了。 感谢您的确认。 您能否打开 ROV 并共享任务和堆栈大小? 是否溢出。

    此致、

    1月