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;