|
|
|
@ -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; |
|
|
|
|