CH582蓝牙主机发送数据 一会会出现超时并且再也无法发送

主机例子中没有 找到现成的发送例子,在论坛上找了些资料看了能发送成功,但是发着发着就会出问题,再也发送不了数据了。发送程序如下:
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);




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