GATT_Notification总返回0x16导致发送速度很慢

你好 使用GATT_Notification发送数据,这个函数经常返回0x16,就是blePending,导致发送1K数据都要几秒钟的时间,请问有什么办法可以提升发送速度呢?

补充:MTU设置为了23,每包只发送20字节数据,如果MTU设置为最大值,苹果手机会支持吗?


苹果手机需要查看APP是否支持,nrfconnect是可以修改MTU的。

其次可以将蓝牙的连接间隔配置小一些,这样发包的速度会加快。

如果出现pending的返回值,可以过10ms再次发送函数进行发送。


请问出现blepending后,等待2s在传输还是blepending,有什么办法解决blepending嘛。因为我现在是blepending之后,就会出现蓝牙无数据交互而断开连接


出现pending是因为底层的收发接口函数的缓存不够,所以数据发送不成功且显示需等待。可以做如下的操作: 

①将config.h文件中的BLE_BUFF_NUM参数给大一些,默认是5,可以配置为10;

②过10ms再进行调用发送函数;

③如果一直调用发送函数且一直出现pending,建议看下你的函数发送失败的时候有没有释放缓存。可能是发送函数失败并且不释放缓存,导致缓存一直不够;

image.png

④如果是使用的测速例程,建议看一下你自己改了那些参数,并修改为之前的参数,对比测试是否出现pending问题。原始的例程我们测试过是没有pending的情况的;

⑤出现reason8的断开,大概率是有任务操作时间过长,导致蓝牙没有收发窗口导致断开。可以先将你自己的代码去掉进行测试。连接间隔需要配置为最大任务时长的2倍。提供一份博客参考:

蓝牙BLE从机Peripheral讲解一(广播间隔和连接间隔) - SweetTea_lllpc - 博客园 (cnblogs.com)

⑥一个问题发一个帖子描述清楚就行了,看到会回复的。


好的,谢谢。

  1. 我测试了两个程序。一个是基于peripheral例程改的,一个用的是测速例程。在我使用测速例程的时候,不修改代码,只是把MTU改成了70,然后放在那里静置一段时间,就会出现pending然后出现reason8的断连。更极端一段,还是测速例程,不修改代码,把MTU改成240,放一会儿就会出现pending然后出现reason8的断连

  2. 基于peripheral例程改的话,连接间隔,我现在设置的是120ms以上,没有超过60ms的单个任务。正常静置不动发送没有问题,蓝牙正常,但是我有个外部中断,大概60ms触发一次,一旦开始工作,就很容易出现blepending。请问外部中断会影响蓝牙发送的情况嘛

  3. 我修改的参数包括下面几个:

    BLE_BUFF_MAX_LEN                    70

    BLE_BUFF_NUM                        10

    BLE_TX_NUM_EVENT                    6

  4. 我释放缓存了,那里我是用的例程的代码,有没有释放缓存失败的可能

  5. 我目前有个疑问,就是每次连接事件来的时候,从机和数据发送数据会清空控制器的缓存区嘛。比如我设置1s调用两次GATT_notification,我的缓冲区是10,每次最多传输6个包。那么我的理解就是,每个连接事件来的时候,可以一次性最多清除6个数据包,那我应该不会出现blepending才对,但是事实上我还是会出现blepending。所以这个缓冲区是如何清空数据包发送的?


①修改speedtest的MTU,需要同时修改noti发送的数据长度。默认的发送长度是244B,如果将MTU改小,则会堆在了缓存中。如果是测速则可以参考speedtest,其他功能开发建议参考BLE_UART或者peripheral例程;
②释放缓存可以查看返回值判断是否成功;
③我们这里测试配置定时器10ms中断并翻转PB4,蓝牙noti100ms周期,长度100B,测试没有连接断开的情况,会偶尔出现pending的情况。

1.png

操作中断要求快进快出,所以我们会将服务函数放在RAM中运行。可以在中断里面置标志或者翻转GPIO,如果调用函数需要加上highcode。如果调用的函数过多,建议通过标志,另外开一个tmos查询该任务。

④如果配置了MTU后,需要手机端APP连接也修改MTU的;

⑤noti发送成功会由底层清除缓存,发送失败需要手动清除缓存。失败后需要手动重新调用发送函数;

⑥测试有问题的话,发送邮件到邮箱lpc@wch.cn,我提供一下测试的代码,可以对比看下。


好的,谢谢,目前我这个正常工作了。请问您在第三点里面提到测试,每次发送的数据是多少。我是1s调用一次发送,每次发送会连续两次调用gatt_notification,每个数据都是70Bytes


100ms调用一次noti发送100字节。


好的,谢谢。您说测试的时候,偶尔会出现blepending,请问出现blepending您是怎么处理的,手动释放内存之后下一次就还是正常发送嘛


只有登录才能回复,可以选择微信账号登录