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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user