使用BLE的Notify功能,通过定时器每隔10ms向手机发送一包数据,每包数据20字节,发送大约4000包后出现丢包情况,每次丢1包,再次发送大约2000包后再丢一包,这种情况是为什么呢?
当前的连接间隔:
// Minimum connection interval (units of 1.25ms, 80=100ms) for automatic // parameter update request #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 16 //20 // Maximum connection interval (units of 1.25ms, 800=1000ms) for automatic // parameter update request #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 32 //40
发送代码:
//10ms
if (events & KFD_DATA_RECV_DELAY_EVT)
{
events &= ~KFD_DATA_RECV_DELAY_EVT;
Util_startClock(&dataRecvDelayClock);
if(tempTimes>=199)
{
Util_stopClock(&dataRecvDelayClock);
}
tempTimes++;
Pfd_ServApp_SendNotiInd(&tempdata[0],20);
}
发送Notify的代码:
bStatus_t Pfd_ServApp_SendNotiInd(uint8_t *nvalue, uint16_t nlen)
{
attHandleValueNoti_t noti;
uint16_t slen;
bStatus_t status;
slen = nlen;
gattCharCfg_t *pItem = Pfd_ProfileChar4Config;
if(PFDexConnected)
{
pItem->connHandle = Pfd_CCC_Handle;
}
if ( pItem->connHandle != INVALID_CONNHANDLE )
{
//check the notify CCCD open of not
if (!GATTServApp_ReadCharCfg(pItem->connHandle, Pfd_ProfileChar4Config))
{
GATTServApp_WriteCharCfg(pItem->connHandle,Pfd_ProfileChar4Config,1);
}
//the above added by lining
noti.pValue = (uint8 *)GATT_bm_alloc( pItem->connHandle, ATT_HANDLE_VALUE_NOTI,slen,&slen);
// GATT_MAX_MTU, &slen );
if ( noti.pValue != NULL ) //申请到了地址。=NULL说明没申请到地址
{
noti.handle = Pfd_ProfileAttrTbl[2].handle;
noti.len = slen;
memcpy(noti.pValue, nvalue, slen);
// CCCD enabled, send notification
status = GATT_Notification( pItem->connHandle, ¬i, FALSE );
if ( status != SUCCESS )
{
GATT_bm_free( (gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI );
}
}
else
{
GATT_bm_free( (gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI );
status = bleNoResources;
}
}
return ( status );
}