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