refactor(GateWay): 重构ETH通信状态机并调整测试配置

1.  将MAC_ADDR_TYPE从9改为0,使用测试MAC地址配置
2.  移除硬编码的服务器地址和端口默认值
3.  新增ETH状态机管理,完善链路检测、重连和收发逻辑
4.  添加一系列ETH通信超时、重试相关的宏定义
5.  新增调试观察窗口配置
This commit is contained in:
2026-06-11 19:17:31 +08:00
parent d05345afb7
commit 030c22472d
5 changed files with 181 additions and 24 deletions
+135 -16
View File
@@ -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)
-5
View File
@@ -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;