本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!