From 3a184f817b6144228ae7ca337b91d85a8215333c Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Fri, 4 Sep 2026 13:15:47 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=B8=BB=E7=BA=BF=E5=BE=85=E5=90=88?= =?UTF-8?q?=E3=80=91check=E8=BF=94=E5=9B=9E0=E8=B6=85=E6=97=B6=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E6=B8=85=E7=A9=BAbuffer=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=90=8C=E6=AD=A5=E8=80=8C=E4=B8=8D=E6=98=AF=E4=B8=80?= =?UTF-8?q?=E5=AD=97=E8=8A=82=E4=B8=80=E5=AD=97=E8=8A=82=E4=B8=A2=E5=BC=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- peripheral/com.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) 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;