CC2640蓝牙丢包问题(notify发送返回0x16:blePending)
发布日期:2021-07-19 12:30:11 浏览次数:11 分类:技术文章

本文共 1307 字,大约阅读时间需要 4 分钟。

发送间隔:24ms

发送包长度:20字节

从机 Notification发送方式有两种,用户根据自身要求选择:

(1)调用GATT_Notification( uint16 connHandle, attHandleValueNoti_t *pNoti, uint8 authenticated );直接发送
(2)调用GATTServApp_ProcessCharCfg函数,这个函数内部最终会导致master那边调用一个read请求,回调到simpleProfile_ReadAttrCB()。用这个函数,只有master向Peripheral的Notification允许位写1,才能使能从机,从而调用GATT_Notification向主机发送Notification。

Notification连接后,从机向主机发送的数据包,不需要主机确认收到,适合大量数据快速发送。

经过测试,方式(2)的丢包情况比方式(1)的严重,但是方式(1)仍然存在丢包情况。

这时候,需要三个参数:connection interval,latency,Supervision timeout

打个比方

mate10 pro与cc2640连接后的3个参数。interval为15*1.25ms,lentency值为0,timeout值为0xF4。
我们在一个间隙或更短时间发送一包数据(20Bytes),就会发生丢包现象。大于一个间隙发送一包数据,就不会丢包
根据前后处理数量,控制器需要2-3ms来准备下一个连接事件。因此更长的连接间隔可以提高吞吐量。由于使用notify方式传输,更高的连接间隔意味着连接事件减少。此示例将使用100ms的连接间隔,请注意,在实际情况下更高的连接间隔有着明显的缺点:由于射频干扰导致的连接事件将大大降低吞吐量。因此用户需要根据所需吞吐量进行权衡。当连接间隔大于100ms后,吞吐量将不会增加。

另一个影响参数是MAX_NUM_PDU和MAX_PDU_SIZE

定义6个Tx缓冲区,每个缓冲区251字节。用户应用程序应该根据自身堆栈情况进行分配。如果没有足够的堆栈,可以通过减少MAX_NUM_PDU,这样可能导致吞吐量的损失。实际使用中的最坏情况是MAX_NUM_PDU和MAX_PDU_SIZE的乘积。设计人员应该根据设备的可用内存来平衡这些参数。

#define MAX_NUM_PDU 6

#define MAX_PDU_SIZE 251

在实际应用中,由于其他处理需求,应用程序可能无法维持此吞吐量(例如必须通过串口传输有效数据负载)。此外blastData函数最大限度的增加了数据的排队,因此GATT_Notification会返回非SUCCESS状态,例如队列已满时的blePending。Tx队列的深度由上面定义的MAX_NUM_PDU决定。

如果以上都无法解决丢包问题,则考虑使用重发机制,判断GATT_Notification的返回结果,如果不为SUCCESS,返回为0x16,则重新调用GATT_Notification发送数据,经过测试,可重发成功,彻底解决丢包问题。

转载地址:https://blog.csdn.net/jdsnpgxj/article/details/102499707 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如何解决CC2640用IAR下载固件出现Fatal error: Failed to load the CPU core driver Session aborted的问题
下一篇:esp-idf版本更新及切换方法

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月28日 00时54分06秒