diff --git a/peripheral/com.c b/peripheral/com.c index 207d4c0..5df5e17 100644 --- a/peripheral/com.c +++ b/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;