diff --git a/Project/GateWay/MDK/GateWay.uvoptx b/Project/GateWay/MDK/GateWay.uvoptx index 15d0988..c6a3d15 100644 --- a/Project/GateWay/MDK/GateWay.uvoptx +++ b/Project/GateWay/MDK/GateWay.uvoptx @@ -410,7 +410,7 @@ 0 JL2CM3 - -U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO11 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) + -U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO11 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) 0 @@ -435,6 +435,21 @@ 1 GateWay,0x0A + + 1 + 1 + EthStatus + + + 2 + 1 + EthRecvTimeoutCnt,0x0A + + + 3 + 1 + (60 * 1000),0x0A + @@ -465,7 +480,7 @@ 0 1 - 0 + 1 0 0 0 diff --git a/Project/GateWay/source/User/Inc/CatOneTask.h b/Project/GateWay/source/User/Inc/CatOneTask.h index 60482ac..725f3b9 100644 --- a/Project/GateWay/source/User/Inc/CatOneTask.h +++ b/Project/GateWay/source/User/Inc/CatOneTask.h @@ -14,6 +14,15 @@ #define CAT_ONE_DELAY_1MS(X) +// ETH状态机相关宏定义 +#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000) +#define ETH_LINK_WAIT_TIME_MAX (10 * 1000) +#define ETH_REG_TIMEOUT_MAX (30 * 1000) +#define ETH_SEND_TIMEOUT_MAX (5 * 1000) +#define ETH_RECV_TIMEOUT_MAX (60 * 1000) +#define ETH_SEND_RETRY_MAX 3 +#define ETH_FIRST_REG_DELAY (5 * 1000) + typedef enum { CAT_ONE_AT_NULL, CAT_ONE_AT, //开机检测 @@ -49,6 +58,17 @@ typedef enum { CAT_ONE_CLOSE_TCP, }CatOneStatus_m; +typedef enum { + ETH_IDEL, + ETH_RESET, + ETH_WAIT_LINK, + ETH_REG_SVR, + ETH_WAIT_SEND, + ETH_SEND_DATA, + ETH_WAIT_RECV, + ETH_OFF, +}EthStatus_m; + typedef enum { CAT_ONE_RET_NULL, CAT_ONE_RET_OK, @@ -90,6 +110,14 @@ typedef struct { GateWayPara GateWay; DataRevCallBack CatOneRevCallBack; + + // ETH状态机相关字段 + EthStatus_m EthStatus; + uint32_t EthResetDelayCnt; + uint32_t EthLinkWaitCnt; + uint32_t EthRecvTimeoutCnt; + uint8_t EthSendRetryCnt; + bool EthFirstRegFlag; }CatOne_t, *pCatOne_t; CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen); diff --git a/Project/GateWay/source/User/Inc/main.h b/Project/GateWay/source/User/Inc/main.h index 70a1b20..7060d46 100644 --- a/Project/GateWay/source/User/Inc/main.h +++ b/Project/GateWay/source/User/Inc/main.h @@ -7,7 +7,7 @@ #define SOFTWARE_VERSION 12 #define HARDWARE_VERSION 12 -#define MAC_ADDR_TYPE 9//0为测试服务器 +#define MAC_ADDR_TYPE 0//0为测试服务器 extern bool MainDispEn; #define MAIN_DBG_LOG(...) { if(MainDispEn) Debug_Printf(__VA_ARGS__);} diff --git a/Project/GateWay/source/User/Src/CatOneTask.c b/Project/GateWay/source/User/Src/CatOneTask.c index 46c844b..f3fb2a4 100644 --- a/Project/GateWay/source/User/Src/CatOneTask.c +++ b/Project/GateWay/source/User/Src/CatOneTask.c @@ -23,6 +23,8 @@ static uint8_t EthRevTimeOutCnt; static uint16_t CatSendErrCnt = 0; +// ETH状态机相关变量已移至 CatOne_t 结构体中 + #define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);} //#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}} @@ -587,27 +589,144 @@ void EthLoopHandler(void) { rt_err_t result; - if(CatOne.GateWay->SvrRegFlag == false) { - if(CatOne.RegisterDelayCnt == 0) { + switch(CatOne.EthStatus) { + case ETH_IDEL: + rt_thread_delay(1); + if(CatOne.EthResetDelayCnt > 0) { + CatOne.EthResetDelayCnt--; + } + else { + CatOne.EthStatus = ETH_RESET; + } + break; + + case ETH_RESET: + CAT1_DBG_LOG("ETH Reset!\r\n"); + ETH_RESET_CLR(); + rt_thread_delay(10); + ETH_RESET_SET(); + rt_thread_delay(2000); // 延长复位后稳定时间到2秒 + CatOne.EthStatus = ETH_WAIT_LINK; + CatOne.EthLinkWaitCnt = 0; + CatOne.EthFirstRegFlag = true; // 重置首次注册标志 + break; + + case ETH_WAIT_LINK: if(ETH_LINK_GET() == Reset) { - CatOne.RegisterDelayCnt = REGISTER_INTERVAL_MAX * 10; + CAT1_DBG_LOG("ETH Link OK!\r\n"); + if(CatOne.GateWay->SvrRegFlag == false) { + CatOne.EthStatus = ETH_REG_SVR; + } + else { + CatOne.EthStatus = ETH_WAIT_SEND; + } + } + else { + CatOne.EthLinkWaitCnt++; + if(CatOne.EthLinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) { + CAT1_DBG_LOG("ETH Link Timeout, Reset!\r\n"); + CatOne.EthStatus = ETH_OFF; + } + rt_thread_delay(1); + } + break; + + case ETH_REG_SVR: + { + // 首次注册时添加延迟,等待系统稳定 + if(CatOne.EthFirstRegFlag) { + CAT1_DBG_LOG("ETH First Register, waiting for system stable...\r\n"); + rt_thread_delay(ETH_FIRST_REG_DELAY); + CatOne.EthFirstRegFlag = false; + } + uint8_t ret = GateWayRegister(CatOneEthTxBuff); rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret); + CAT1_DBG_LOG("ETH Register Server...\r\n"); + CatOne.EthStatus = ETH_WAIT_SEND; + CatOne.EthSendRetryCnt = 0; // 重置重试计数器 } - } - else { - CatOne.RegisterDelayCnt--; - } + break; + + case ETH_WAIT_SEND: + result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100); + if(result == RT_EOK) { + CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff); + CatOne.EthStatus = ETH_SEND_DATA; + } + else { + if(CatOne.EthStatus == ETH_RESET || CatOne.EthStatus == ETH_OFF) + return; + if(ETH_LINK_GET() != Reset) { + CAT1_DBG_LOG("ETH Link Lost!\r\n"); + CatOne.EthStatus = ETH_OFF; + } + else { + rt_thread_delay(1); + } + } + break; + + case ETH_SEND_DATA: + HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen); + EthRevTimeOutCnt = 0; + EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2); + CommUnitSendASCII[CatOneEthTxLen * 2] = 0; + CAT1_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII); + + CatOne.EthStatus = ETH_WAIT_RECV; + CatOne.EthRecvTimeoutCnt = 0; + CatOne.EthSendRetryCnt = 0; + break; + + case ETH_WAIT_RECV: + rt_thread_delay(1); + CatOne.EthRecvTimeoutCnt++; + + if(CatOne.EthRecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) { + CAT1_DBG_LOG("ETH Recv Timeout!\r\n"); + CatOne.EthSendRetryCnt++; + if(CatOne.EthSendRetryCnt >= ETH_SEND_RETRY_MAX) { + CAT1_DBG_LOG("ETH Send Retry Max, Reset!\r\n"); + CatOne.EthStatus = ETH_OFF; + } + else { + if(CatOne.GateWay->SvrRegFlag == false) { + CatOne.EthStatus = ETH_REG_SVR; + } + else { + CatOne.EthStatus = ETH_WAIT_SEND; + } + } + } + + if(ETH_LINK_GET() != Reset) { + CAT1_DBG_LOG("ETH Link Lost During Wait!\r\n"); + CatOne.EthStatus = ETH_OFF; + } + + if(CatOne.GateWay->SvrRegFlag == true) { + CAT1_DBG_LOG("ETH Register Success!\r\n"); + CatOne.EthStatus = ETH_WAIT_SEND; + CatOne.EthRecvTimeoutCnt = 0; + CatOne.EthSendRetryCnt = 0; + } + + break; + + case ETH_OFF: + CAT1_DBG_LOG("ETH Power Off!\r\n"); + ETH_RESET_CLR(); + rt_thread_delay(3000); + ETH_RESET_SET(); + CatOne.EthStatus = ETH_IDEL; + CatOne.EthResetDelayCnt = ETH_RESET_DELAY_TIME_MAX; + break; + + default: + CatOne.EthStatus = ETH_RESET; + break; } - result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100); - if(result == RT_EOK) { - CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff); - HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen); - EthRevTimeOutCnt = 0; - EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2); - CommUnitSendASCII[CatOneEthTxLen * 2] = 0; - CAT1_DBG_LOG("Eth Send: %s\r\n",CommUnitSendASCII); - } } bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen) diff --git a/Project/GateWay/source/User/Src/main.c b/Project/GateWay/source/User/Src/main.c index 39f9518..c16d6c3 100644 --- a/Project/GateWay/source/User/Src/main.c +++ b/Project/GateWay/source/User/Src/main.c @@ -169,11 +169,6 @@ void GateWayInit(void) #if MAC_ADDR_TYPE == 0 memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6); GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; - GateWay.ConfigPara.SvrAddr[0] = 39; - GateWay.ConfigPara.SvrAddr[1] = 106; - GateWay.ConfigPara.SvrAddr[2] = 103; - GateWay.ConfigPara.SvrAddr[3] = 147; - GateWay.ConfigPara.SvrPort = 8080; #elif MAC_ADDR_TYPE == 1 memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6); GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;