fix(eth): 增加服务器无应答兜底复位+链路断开清除注册标志

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跳过的问题
This commit is contained in:
2026-08-20 16:47:56 +08:00
parent f07b59163a
commit 4cf73b5a0f
2 changed files with 17 additions and 0 deletions
@@ -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;
+15
View File
@@ -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