refactor(GateWay): 重构ETH通信状态机并调整测试配置
1. 将MAC_ADDR_TYPE从9改为0,使用测试MAC地址配置 2. 移除硬编码的服务器地址和端口默认值 3. 新增ETH状态机管理,完善链路检测、重连和收发逻辑 4. 添加一系列ETH通信超时、重试相关的宏定义 5. 新增调试观察窗口配置
This commit is contained in:
@@ -410,7 +410,7 @@
|
|||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>JL2CM3</Key>
|
<Key>JL2CM3</Key>
|
||||||
<Name>-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)</Name>
|
<Name>-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)</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
@@ -435,6 +435,21 @@
|
|||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>GateWay,0x0A</ItemText>
|
<ItemText>GateWay,0x0A</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>1</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>EthStatus</ItemText>
|
||||||
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>2</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>EthRecvTimeoutCnt,0x0A</ItemText>
|
||||||
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>3</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>(60 * 1000),0x0A</ItemText>
|
||||||
|
</Ww>
|
||||||
</WatchWindow1>
|
</WatchWindow1>
|
||||||
<WatchWindow2>
|
<WatchWindow2>
|
||||||
<Ww>
|
<Ww>
|
||||||
@@ -465,7 +480,7 @@
|
|||||||
<DebugFlag>
|
<DebugFlag>
|
||||||
<trace>0</trace>
|
<trace>0</trace>
|
||||||
<periodic>1</periodic>
|
<periodic>1</periodic>
|
||||||
<aLwin>0</aLwin>
|
<aLwin>1</aLwin>
|
||||||
<aCover>0</aCover>
|
<aCover>0</aCover>
|
||||||
<aSer1>0</aSer1>
|
<aSer1>0</aSer1>
|
||||||
<aSer2>0</aSer2>
|
<aSer2>0</aSer2>
|
||||||
|
|||||||
@@ -14,6 +14,15 @@
|
|||||||
|
|
||||||
#define CAT_ONE_DELAY_1MS(X)
|
#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 {
|
typedef enum {
|
||||||
CAT_ONE_AT_NULL,
|
CAT_ONE_AT_NULL,
|
||||||
CAT_ONE_AT, //开机检测
|
CAT_ONE_AT, //开机检测
|
||||||
@@ -49,6 +58,17 @@ typedef enum {
|
|||||||
CAT_ONE_CLOSE_TCP,
|
CAT_ONE_CLOSE_TCP,
|
||||||
}CatOneStatus_m;
|
}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 {
|
typedef enum {
|
||||||
CAT_ONE_RET_NULL,
|
CAT_ONE_RET_NULL,
|
||||||
CAT_ONE_RET_OK,
|
CAT_ONE_RET_OK,
|
||||||
@@ -90,6 +110,14 @@ typedef struct {
|
|||||||
|
|
||||||
GateWayPara GateWay;
|
GateWayPara GateWay;
|
||||||
DataRevCallBack CatOneRevCallBack;
|
DataRevCallBack CatOneRevCallBack;
|
||||||
|
|
||||||
|
// ETH状态机相关字段
|
||||||
|
EthStatus_m EthStatus;
|
||||||
|
uint32_t EthResetDelayCnt;
|
||||||
|
uint32_t EthLinkWaitCnt;
|
||||||
|
uint32_t EthRecvTimeoutCnt;
|
||||||
|
uint8_t EthSendRetryCnt;
|
||||||
|
bool EthFirstRegFlag;
|
||||||
}CatOne_t, *pCatOne_t;
|
}CatOne_t, *pCatOne_t;
|
||||||
|
|
||||||
CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen);
|
CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#define SOFTWARE_VERSION 12
|
#define SOFTWARE_VERSION 12
|
||||||
#define HARDWARE_VERSION 12
|
#define HARDWARE_VERSION 12
|
||||||
|
|
||||||
#define MAC_ADDR_TYPE 9//0为测试服务器
|
#define MAC_ADDR_TYPE 0//0为测试服务器
|
||||||
|
|
||||||
extern bool MainDispEn;
|
extern bool MainDispEn;
|
||||||
#define MAIN_DBG_LOG(...) { if(MainDispEn) Debug_Printf(__VA_ARGS__);}
|
#define MAIN_DBG_LOG(...) { if(MainDispEn) Debug_Printf(__VA_ARGS__);}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ static uint8_t EthRevTimeOutCnt;
|
|||||||
|
|
||||||
static uint16_t CatSendErrCnt = 0;
|
static uint16_t CatSendErrCnt = 0;
|
||||||
|
|
||||||
|
// ETH状态机相关变量已移至 CatOne_t 结构体中
|
||||||
|
|
||||||
#define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);}
|
#define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);}
|
||||||
//#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}}
|
//#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}}
|
||||||
|
|
||||||
@@ -587,26 +589,143 @@ void EthLoopHandler(void)
|
|||||||
{
|
{
|
||||||
rt_err_t result;
|
rt_err_t result;
|
||||||
|
|
||||||
if(CatOne.GateWay->SvrRegFlag == false) {
|
switch(CatOne.EthStatus) {
|
||||||
if(CatOne.RegisterDelayCnt == 0) {
|
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) {
|
if(ETH_LINK_GET() == Reset) {
|
||||||
CatOne.RegisterDelayCnt = REGISTER_INTERVAL_MAX * 10;
|
CAT1_DBG_LOG("ETH Link OK!\r\n");
|
||||||
uint8_t ret = GateWayRegister(CatOneEthTxBuff);
|
if(CatOne.GateWay->SvrRegFlag == false) {
|
||||||
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret);
|
CatOne.EthStatus = ETH_REG_SVR;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CatOne.EthStatus = ETH_WAIT_SEND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CatOne.RegisterDelayCnt--;
|
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; // 重置重试计数器
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETH_WAIT_SEND:
|
||||||
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100);
|
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100);
|
||||||
if(result == RT_EOK) {
|
if(result == RT_EOK) {
|
||||||
CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff);
|
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);
|
HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen);
|
||||||
EthRevTimeOutCnt = 0;
|
EthRevTimeOutCnt = 0;
|
||||||
EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2);
|
EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2);
|
||||||
CommUnitSendASCII[CatOneEthTxLen * 2] = 0;
|
CommUnitSendASCII[CatOneEthTxLen * 2] = 0;
|
||||||
CAT1_DBG_LOG("Eth Send: %s\r\n",CommUnitSendASCII);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -169,11 +169,6 @@ void GateWayInit(void)
|
|||||||
#if MAC_ADDR_TYPE == 0
|
#if MAC_ADDR_TYPE == 0
|
||||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6);
|
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6);
|
||||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
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
|
#elif MAC_ADDR_TYPE == 1
|
||||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6);
|
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6);
|
||||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||||
|
|||||||
Reference in New Issue
Block a user