重新连接主机的串口打印会出现 Write Error: 1.
我把我主机发送的程序屏蔽掉发现连接就没有问题代码我放在下面,各位大佬能否帮我看下哪里的问题
重新连接主机的串口打印会出现 Write Error: 1.
我把我主机发送的程序屏蔽掉发现连接就没有问题代码我放在下面,各位大佬能否帮我看下哪里的问题
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, 在服务查询失败时候,重启服务查询直到查询成功
好的,谢谢大佬,刚刚按照您的建议解决了这个问题。