ch579蓝牙连接上从机断开重新连接主机出现问题

重新连接主机的串口打印会出现     Write Error: 1.

我把我主机发送的程序屏蔽掉发现连接就没有问题代码我放在下面,各位大佬能否帮我看下哪里的问题

spacer.gif

static char BLE_SEND_BUF[30] = {0};

static void BLE_SEND_DAT(const char *buf,u32 len)

{

    //设置为写

    centralDoWrite = 1;

    tmos_memset(BLE_SEND_BUF,0,30);

    tmos_memcpy(BLE_SEND_BUF,buf,len);

    //tmos_start_task( centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

    if( centralProcedureInProgress == FALSE )

    {

      //if( centralDoWrite )

      {

        // Do a write

        attWriteReq_t req;

        

        req.cmd = FALSE;

        req.sig = FALSE;

        req.handle = centralCharHdl;

        req.len = 25;

        req.pValue = GATT_bm_alloc(centralConnHandle,ATT_WRITE_REQ,req.len,NULL,0);

        if ( req.pValue != NULL )

        {

          //*req.pValue = centralCharVal;

          tmos_memcpy(req.pValue,BLE_SEND_BUF,req.len);

          if( GATT_WriteCharValue(centralConnHandle,&req,centralTaskId) == SUCCESS )

          {      

            centralProcedureInProgress = TRUE;

            //centralDoWrite = !centralDoWrite;

            //tmos_start_task( centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

          }

          else

          {

            GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);

          }

        }

      }

    }

}



 Write Error: 1. 意思是gatt的handle 不对,

在你的工程中,就是 centralCharHdl 的值,这个值代表从机中具体的characteristic,

,这个值初始化时候是0,当断开连接后也是0,

当连上后,主机发起查询请求,通常是根据uuid 进行一些列的查询,然后最终赋值给centralCharHdl 然后发送.


当你从机断开后, 这个值会在你主机端的断开事件里面 置0.

如果这时候你没有停止你的发送事件,当再次连上后,如果这个值没有正确的赋值,就会以handle为0 去发送,然后从机端协议栈会直接返回1,这实际上是上面的结果.


至于为什么连上后没有正确的对centralCharHdl  赋值,

因为你的write 事件并没有停止,导致ble协议栈发送在忙, 从而导致主机发起查询请求失败,centralCharHdl 一直为0,你一直产生 Write Error: 1.


你可以这样做:

1,主机端断开后,把发送事件关掉(建议)

或者:

2, 在服务查询失败时候,重启服务查询直到查询成功


好的,谢谢大佬,刚刚按照您的建议解决了这个问题。


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