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.

[参考译文] CC2650MODA:发送数据过快时蓝牙挂起- SPP 服务器示例

Guru**** 2577385 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/591225/cc2650moda-bluetooth-hangs-when-sending-data-too-fast---spp-server-example

器件型号:CC2650MODA
Thread 中讨论的其他器件:CC2650

大家好、

我正在尝试使用 SSP 服务器示例。 直到我试图以太快的速度发送数据时、一切看起来都很好。

问题似乎是将其发送到蓝牙的速度太快。 它只是停止发送它、我必须重置它才能再次工作。
调用 SerialPortService_SetParameter 发送数据时、它会返回"MSG_buffer_no_ave"。


尝试执行更多测试并确定系统挂起的位置、但我根本看不到任何错误消息...

有人知道会发生什么?

编辑:

该示例有一个周期性任务示例、用于使 LED 闪烁。 这需要一段时间、并阻止主任务从 UART 队列向蓝牙发送数据。 解决了大部分问题。 在全速921600下、系统会再次损坏、而不是丢弃字节以避免完全中断。
但最令我困扰的仍然是系统完全损坏、没有发现任何警告(至少是我发现的)。 我希望、仅仅是我们错过的消息、系统就能正常工作。
因此、我现在的担忧仍然是确定错误本身并解决/抑制错误、以防由于某种原因发生

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

    您要发送多少个字节? 您使用的连接间隔是多少?

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

    您好、Zahid、

    我尝试发送大量字节-我将更好地描述我发现的问题:

    我发现与 SDI/UART 缓冲区相关的问题是128字节、队列消息也具有该大小(SDItask to applicationTask 队列)。

    在应用任务中、它尝试直接将要发送的所有数据放入"蓝牙手"中(使用 SerialPortService_SetParameter)。 当数据超过 MTU-3 (还是-4?)时、这将返回错误 MSG_BUFFER_NOT AVAIL 硬编码为65。 由于没有成功、UART 消息将不会被丢弃、并且会尝试再次发送-这当然会导致持续失败。

    LED 指示灯以延迟闪烁不应影响系统导致此行为。

    我进行了一项测试、其中发送了一些字节、没有问题、然后经过一段时间后、以最大速度发送了200字节。  这将导致发送长度为128和72的2个消息队列。 第一个具有128字节的字节将立即触发此问题。

    我将客户端 CC2650和服务器 C2650中的 PDU 更改为255、问题消失了。

    我强烈建议修改这个例子。 应用程序不应将消息队列直接发送到 SerialPortService_SetParameter,而应将其分解成最小的块,最大大小为 MTU (对于我来说,由于某种原因,它必须是 PDU-4-3或 MTU-3)。 我也发现了另一个错误。 如果有时间、我可能会尝试做出承诺(这是正确的术语?) 向 GitHub 报告-尽管我从未真正这么做过-但我建议这么做。

    另一件事是、如果 MTU 仅为20、可能不是最好的选择? 这些协议肯定会与 Android 一起使用、大多数应用程序不会握手 MTU、并且在 CC2650服务器不知道的情况下将默认值保持为20。 (只是一个想法)。

    以下是我为使一切正常工作所做的(对于最大尺寸为20的封装):

    uint16_t l = pMsg->length;
    uint8_t *a = pMsg->data;
    //以20字节的数据包发送
    while (l > 20){
    RetVal = SerialPortService_SetParameter (SERIALPORTSERVICE_CHAR_DATA、20、A);
    L -= 20;
    a+=20;
    }
    //发送其余字节
    if (l!= 0)
    RetVal = SerialPortService_SetParameter (SERIALPORTSERVICE_CHAR_DATA、l、a); 

     您能否通过连续调用 SerialPortService_SetParameter 来验证我是否不会遇到问题? 就我可以看到要发送的数据通过队列到达蓝牙任务-因此在传输前一个任务之前不会有任何向蓝牙任务发送更多数据的问题、对吧?

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

    您好!  

    对于通知和写入命令、您可以多次调用、并且它将在控制器中将其排队、但对于其他 GATT 命令、您必须等待、直到从远程设备接收到响应。  

    GATT MTU 大小为 PDU 大小- 4、以考虑 L2CAP 头的4个字节。  

    当发送超过20个字节时、控制器应该自动对数据包进行分段/重新组装。 应将 MTU 大小设置为至少128、以避免数据分配错误。  

    祝你一切顺利

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

    [引用 user="Zahid Haq"> GATT MTU 大小为 PDU 大小-4、以考虑 L2CAP 头的4个字节。  [/报价]是的、我知道、但出于某种原因、我需要将 PDU 设置为27才能发送20。


    [引用 USER="Zahid Haq">当发送超过20个字节时,控制器应自动对数据包进行分段/重新组装。 应将 MTU 大小设置为至少128、以避免数据分配错误。  [/报价]
    好的、谢谢。 示例仍然应该具有此更改。

    对于我的应用程序、我不得不将 MTU 更改为20 (并采取其他预防措施)、因为电话应用程序不会握手 MTU、并且其 MTU 本身为20。

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

    因此、基本上让我们将其分解为默认 PDU 大小设置为27。
    如果为 L2CAP 取4个字节、则得到23个字节。
    则不同 GATT 过程有不同的标头。
    因此、对于 GATT 通知、1字节用于操作码(例如 通知数据包)和2个字节的句柄。 为实际数据留出20个字节。

    一般规则可能是实际 PDU 大小应比最大数据量的数据字节大7字节。 因此、如果要发送128字节的应用程序数据、则应将 MAX_PDU_SIZE 至少设置为135。

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Zahid、

    这是我第一次使用 BLE、最后期限不允许我对其进行足够的学习。 很高兴有 TI 团队提供帮助。
    我将设置为验证答案我认为在搜索时对未来用户最有用的内容