主机例子中没有 找到现成的发送例子,在论坛上找了些资料看了能发送成功,但是发着发着就会出问题,再也发送不了数据了。发送程序如下:
void BleMasterSend(u8 *Data,u8 Len)
{
attWriteReq_t req;
u8 Res;
if(centralProcedureInProgress == FALSE)
{
centralDoWrite=TRUE;
req.cmd=FALSE;
req.sig=FALSE;
req.handle=centralCharHdl;
req.len=Len;
req.pValue=GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0);
if(req.pValue!=NULL)
{
memcpy(req.pValue,Data,Len);
Res=GATT_WriteCharValue(centralConnHandle,&req,centralTaskId);
if(Res==SUCCESS)
{
centralProcedureInProgress=TRUE; //翻转读写状态
centralDoWrite=!centralDoWrite; //翻转读写状态
tmos_start_task(centralTaskId,START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY); //
print(DEBUG_BLE,"\n Master Write ok");
}
else
{
print(DEBUG_BLE,"\n Master Write faild=%x",Res);
}
GATT_bm_free((gattMsg_t*)&req,ATT_WRITE_REQ);
}
else
{
print(DEBUG_BLE,"\n alloc Faild");
}
}
else
{
print(DEBUG_BLE,"\n Flag True");
}
}
从打印信息看,主要是GATT_WriteCharValue 发送超时。
①发送成功不需要手动释放缓存,协议栈底层会进行释放;
②你这里将centralProcedureInProgress标志取反,然后没有再置1,if判断不满足;
③打印GATT_WriteCharValue的返回值,并作为判断是否执行到write函数处。如果是0x16,则重复过10ms调用发送函数。
void BleMasterSend(u8 *Data,u8 Len)
{
attWriteReq_t req;
u8 Res;
if(centralProcedureInProgress==TRUE)
{
print(DEBUG_BLE,"\n Busy");
}
else
{
req.cmd=FALSE;
req.sig=FALSE;
req.handle=centralCharHdl;
req.len=Len;
req.pValue=GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0);
if(req.pValue!=NULL)
{
memcpy(req.pValue,Data,Len);
Res=GATT_WriteCharValue(centralConnHandle,&req,centralTaskId);
if(Res==SUCCESS)
{
centralProcedureInProgress=TRUE; //翻转读写状态
print(DEBUG_BLE,"\n Master Write ok");
}
else
{
print(DEBUG_BLE,"\n Master Write faild=%x",Res);
GATT_bm_free((gattMsg_t*)&req,ATT_WRITE_REQ);
}
}
else
{
print(DEBUG_BLE,"\n alloc Faild");
}
}
}
我现在是 GATT_WriteCharValue() 这个写入ok,但是如果在centralProcessGATTMsg()中没有打印Write success 那么后续发送GATT_WriteCharValue() 都是返回超时,所以应该是发送失败的情况下,底层某个地方需要处理下。
GATT_WriteCharValue这个函数返回值为0,代表数据传入底层。
write success代表数据成功发送数据。
如果传入底层成功,但是没有成功发送。那可能是蓝牙丢包导致,协议栈会进行重复传输。直到底层数据传输完成。如果蓝牙断开,则此包数据丢失。
针对你上面的情况,一直没有write success,建议查看一下缓存是否够用。写一个tmos任务,查询一下协议栈剩余的大小。
查询BLE协议栈剩余RAM字节数:
PRINT("memory_len = %d\n",tmos_memory_getlen());
调用前添加声明:uint32_t tmos_memory_getlen(void);