From 4cf73b5a0f120ebea2181ed841bab42f436cdd5e Mon Sep 17 00:00:00 2001 From: YuanHongbin <975559679@qq.com> Date: Thu, 20 Aug 2026 16:47:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(eth):=20=E5=A2=9E=E5=8A=A0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E6=97=A0=E5=BA=94=E7=AD=94=E5=85=9C=E5=BA=95?= =?UTF-8?q?=E5=A4=8D=E4=BD=8D+=E9=93=BE=E8=B7=AF=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E6=B3=A8=E5=86=8C=E6=A0=87=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增SendNoDataCnt计数器: Much=ETH时每次发送累加, 连续>10次 无任何下行数据回应(0x7A帧)则置MuchRegFlag=false并ETH_RESET复位, 解决服务器在线但不应答时网关一直沉默无感知的问题 2. ETH_WAIT_RECV和ETH_WAIT_SEND检测到物理链路断开时立即清除 MuchRegFlag, 保证重连后强制重新注册, para显示为false 3. ETH_RESET和ETH_OFF时清零SendNoDataCnt, 避免计数器残留 4. 复位后MuchRegFlag=false使ETH_REG_SVR真正等待注册响应并重试, 修复原逻辑中复位后注册流程被MuchRegFlag=true跳过的问题 --- Project/GateWay/source/User/Inc/EthTask.h | 2 ++ Project/GateWay/source/User/Src/EthTask.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/Project/GateWay/source/User/Inc/EthTask.h b/Project/GateWay/source/User/Inc/EthTask.h index 45c9c81..7ffbddc 100644 --- a/Project/GateWay/source/User/Inc/EthTask.h +++ b/Project/GateWay/source/User/Inc/EthTask.h @@ -10,6 +10,7 @@ #define ETH_RECV_TIMEOUT_MAX (10 * 1000) #define ETH_SEND_RETRY_MAX 3 #define ETH_FIRST_REG_DELAY (1 * 1000) +#define ETH_SEND_NO_DATA_MAX 10 typedef enum { ETH_IDEL, @@ -28,6 +29,7 @@ typedef struct { uint32_t LinkWaitCnt; uint32_t RecvTimeoutCnt; uint8_t SendRetryCnt; + uint8_t SendNoDataCnt; bool FirstRegFlag; GateWayPara GateWay; diff --git a/Project/GateWay/source/User/Src/EthTask.c b/Project/GateWay/source/User/Src/EthTask.c index 7ba5821..0aa8249 100644 --- a/Project/GateWay/source/User/Src/EthTask.c +++ b/Project/GateWay/source/User/Src/EthTask.c @@ -93,6 +93,7 @@ void EthLoopHandler(void) case ETH_RESET: ETH_DBG_LOG("ETH Reset!\r\n"); + Eth.SendNoDataCnt = 0; ETH_RESET_CLR(); rt_thread_delay(10); ETH_RESET_SET(); @@ -165,6 +166,7 @@ void EthLoopHandler(void) return; if(ETH_LINK_GET() != Reset) { ETH_DBG_LOG("ETH Link Lost!\r\n"); + Eth.GateWay->MuchRegFlag = false; Eth.Status = ETH_OFF; } else { @@ -174,6 +176,16 @@ void EthLoopHandler(void) break; case ETH_SEND_DATA: + if(Eth.GateWay->ConfigPara.Much == CH_ETH) { + Eth.SendNoDataCnt++; + if(Eth.SendNoDataCnt > ETH_SEND_NO_DATA_MAX) { + ETH_DBG_LOG("ETH has no receive data for a long time, Reset!\r\n"); + Eth.SendNoDataCnt = 0; + Eth.GateWay->MuchRegFlag = false; + Eth.Status = ETH_RESET; + break; + } + } HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen); EthRevTimeOutCnt = 0; EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2); @@ -212,6 +224,7 @@ void EthLoopHandler(void) if(ETH_LINK_GET() != Reset) { ETH_DBG_LOG("ETH Link Lost During Wait!\r\n"); + Eth.GateWay->MuchRegFlag = false; Eth.Status = ETH_OFF; } @@ -226,6 +239,7 @@ void EthLoopHandler(void) case ETH_OFF: ETH_DBG_LOG("ETH Power Off!\r\n"); + Eth.SendNoDataCnt = 0; Eth.Status = ETH_IDEL; Eth.ResetDelayCnt = ETH_RESET_DELAY_TIME_MAX; break; @@ -285,6 +299,7 @@ static void EthRev_Thread_Entry(void *parameter) memset(HexData, 0x00, EthRxLen / 2); uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen); if(ret > 0 && HexData[0] == 0x7A) { + Eth.SendNoDataCnt = 0; if(GateWay->ConfigPara.Much == CH_ETH) GateWay->MuchRevCallBack(GateWay, HexData, ret); else