From 030c22472d6e4a3d0bfed6dab3a70f8560c828e2 Mon Sep 17 00:00:00 2001 From: YuanHongbin <975559679@qq.com> Date: Thu, 11 Jun 2026 19:17:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(GateWay):=20=E9=87=8D=E6=9E=84ETH?= =?UTF-8?q?=E9=80=9A=E4=BF=A1=E7=8A=B6=E6=80=81=E6=9C=BA=E5=B9=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=B5=8B=E8=AF=95=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 将MAC_ADDR_TYPE从9改为0,使用测试MAC地址配置 2. 移除硬编码的服务器地址和端口默认值 3. 新增ETH状态机管理,完善链路检测、重连和收发逻辑 4. 添加一系列ETH通信超时、重试相关的宏定义 5. 新增调试观察窗口配置 --- Project/GateWay/MDK/GateWay.uvoptx | 19 ++- Project/GateWay/source/User/Inc/CatOneTask.h | 28 ++++ Project/GateWay/source/User/Inc/main.h | 2 +- Project/GateWay/source/User/Src/CatOneTask.c | 151 +++++++++++++++++-- Project/GateWay/source/User/Src/main.c | 5 - 5 files changed, 181 insertions(+), 24 deletions(-) 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;