Browse Source

【主线待合】check返回0超时后,直接清空buffer重新同步而不是一字节一字节丢弃

paint_robot_new-v1.5
Lizongdi 4 weeks ago
parent
commit
3a184f817b
  1. 38
      peripheral/com.c

38
peripheral/com.c

@ -201,6 +201,34 @@ int rd_ComWrite(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
return iRet;
}
/*****************************************************************************
函 数 名 : rd_ComDropAll
功能描述 : 清空接收环形缓冲区的所有残留数据,用于超时后快速重新同步。
相比旧的"超时一次只丢1字节",整块丢弃能在高波特率(115200≈11.5KB/s)
下追得上数据流入速度,避免旧坏数据占满缓冲区导致新数据被丢弃。
输入参数 : TComCtrl *_ptComCtrl
输出参数 : 无
返 回 值 : 无
调用函数 : rd_RingbufferGet
被调函数 : rd_ComRead
*****************************************************************************/
static void rd_ComDropAll(TComCtrl *_ptComCtrl)
{
char dropBuf[64];
int n;
if (NULL == _ptComCtrl)
{
return;
}
/* 循环整块读出并丢弃,直到缓冲区被取空为止 */
do
{
n = rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, dropBuf, (int)sizeof(dropBuf));
} while (n > 0);
}
/*****************************************************************************
函 数 名 : rd_ComRead
功能描述 : 读取一包数据,这里的入参用于存放校验通过的数据,如果buffer实际大小
@ -291,9 +319,9 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
}
if ((u32CurrentTime - ptMutiDev->m_uiLastRecvTime) > RECV_TIMEOUT)
{
char temp[1];
rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1); // 丢弃旧数据
{
// 超时:整块丢弃残留数据,快速重新同步,而不是一次只丢一个字节
rd_ComDropAll(_ptComCtrl);
// 重置该设备的时间戳,准备迎接下一次可能的通信
ptMutiDev->m_uiLastRecvTime = 0;
@ -400,8 +428,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
if ((u32CurrentTime - ptMutiDev->m_uiLastRecvTime) > RECV_TIMEOUT)
{
char temp[1];
rd_RingbufferGet(_ptComCtrl->m_stComBuf.m_ptRecv, temp, 1);
// 超时:整块丢弃残留数据,快速重新同步
rd_ComDropAll(_ptComCtrl);
ptMutiDev->m_uiLastRecvTime = 0;
_ptComCtrl->m_iDevIndex = -1;
return RD_FAILURE;

Loading…
Cancel
Save