ShipCentralControl/Anjiehui7_DTU/User/uart_Ethernet.c

288 lines
6.8 KiB
C
Raw Permalink Normal View History

2025-04-03 15:59:48 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : uart_Ethernet.h
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include <includes.h>
// ETHERNET<45><54><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ETHERNET_DATA_COUNT 200
loopbuff_t Ethernet_Buff;
uint8_t Ethernet_Buff_Data[sizeof(uint8_t) * (ETHERNET_DATA_COUNT + 1)] = {0};
// ETHERNET<45><54><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD>Ϣ֪ͨ
SemaphoreHandle_t Ethernet_semQ = NULL;
// ETHERNET<45><54><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ETHERNET_ATDATA_COUNT 50
loopbuff_t Ethernet_ATBuff;
uint8_t Ethernet_ATBuff_Data[sizeof(uint8_t) * (ETHERNET_ATDATA_COUNT + 1)] = {0};
// <20><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>״̬
uint8_t Ethernet_initStatus = 0, Ethernet_connected = 0;
static void Ethernet_IRQHandler(USART_Handle *huart)
{
BaseType_t xHigherPriorityTaskWoken;
uint8_t c = (uint8_t) huart->Instance->DR;
// <20><><EFBFBD><EFBFBD><EBBBBA>
LoopBuff_PutItem(&Ethernet_Buff, &c);
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
xSemaphoreGiveFromISR(Ethernet_semQ, &xHigherPriorityTaskWoken);
}
static void Ethernet_ATHandler(USART_Handle *huart)
{
uint8_t c = (uint8_t) huart->Instance->DR;
// <20><><EFBFBD><EFBFBD><EBBBBA>
LoopBuff_PutItem(&Ethernet_ATBuff, &c);
}
void Ethernet_Send(char *buf)
{
UART_Transmit(&huart3, (uint8_t *) buf, strlen(buf));
}
// <20><><EFBFBD>жϷ<D0B6>ʽ<EFBFBD><CABD>ֱ<EFBFBD>ӴӴ<D3B4><D3B4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t Ethernet_Recv(char *buf, uint16_t wait_cnt)
{
uint16_t recv_cnt = 0;
uint32_t stop_seconds;
char c;
stop_seconds = rf_get_seconds() + 2;
while(rf_get_seconds() < stop_seconds)
{
if(LoopBuff_GetCount(&Ethernet_ATBuff) > 0)
{
c = *(uint8_t *) LoopBuff_GetDataPtr(&Ethernet_ATBuff, Ethernet_ATBuff.info.rdPtr);
LoopBuff_RemoveItems(&Ethernet_ATBuff, 1);
printf("%c", c);
if(c != '\r' && c != '\n')
{
buf[recv_cnt++] = c;
if(recv_cnt == wait_cnt)
break;
}
}
}
return recv_cnt;
}
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
uint8_t Ethernet_ATMode()
{
uint8_t try_cnt;
char buf[3] = {0};
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
for(try_cnt = 0; try_cnt < 3; try_cnt++)
{
// <20>Ƚ<EFBFBD><C8BD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
delay_ms(100);
Ethernet_Send("+++");
if(Ethernet_Recv(buf, 1) < 1 || buf[0] != 'a')
continue;
Ethernet_Send("a");
if(Ethernet_Recv(buf, 3) < 3 || strncmp(buf, "+ok", 3) != 0)
continue;
// <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
delay_ms(100);
return 1;
}
return 0;
}
uint8_t Ethernet_ATCmd(char *cmd, char *ok_str, char *err_str)
{
char buf[21], c;
uint8_t try_cnt;
uint16_t recv_cnt = 0;
uint32_t stop_seconds;
memset(buf, 0, sizeof(buf));
for(try_cnt = 0; try_cnt < 3; try_cnt++)
{
// <20><><EFBFBD>մ<EFBFBD><D5B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>
LoopBuff_Clear(&Ethernet_ATBuff);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Ethernet_Send(cmd);
Ethernet_Send("\r");
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stop_seconds = rf_get_seconds() + 2;
while(rf_get_seconds() < stop_seconds)
{
if(LoopBuff_GetCount(&Ethernet_ATBuff) > 0)
{
c = *(uint8_t *) LoopBuff_GetDataPtr(&Ethernet_ATBuff, Ethernet_ATBuff.info.rdPtr);
LoopBuff_RemoveItems(&Ethernet_ATBuff, 1);
printf("%c", c);
if(c != '\r' && c != '\n')
{
buf[recv_cnt++] = c;
if(strstr(buf, ok_str) != NULL)
return 1;
if(strstr(buf, err_str) != NULL)
return 0;
}
}
}
}
return 0;
}
void Ethernet_Open()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
LoopBuff_Create(&Ethernet_Buff, sizeof(uint8_t), ETHERNET_DATA_COUNT, 0, (uint32_t) Ethernet_Buff_Data);
LoopBuff_Create(&Ethernet_ATBuff, sizeof(uint8_t), ETHERNET_ATDATA_COUNT, 0, (uint32_t) Ethernet_ATBuff_Data);
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
Ethernet_semQ = xSemaphoreCreateBinary();
SET_BIT(USART3->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
LL_USART_Enable(USART3);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><C3B5>жϣ<D0B6>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>ִ<EFBFBD><D6B4>
void Ethernet_Config()
{
huart3.RxISR = Ethernet_ATHandler;
delay_ms(100);
VCC_ETHERNET_ON();
delay_ms(1000);
// <20><><EFBFBD><EFBFBD>״̬
Ethernet_initStatus = 0;
Ethernet_connected = 0;
// <20><><EFBFBD><EFBFBD>Usr_K3<4B><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
#if 1
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
if(!Ethernet_ATMode())
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB2BB><EFBFBD><EFBFBD>
if(!Ethernet_ATCmd("AT+E=OFF", "+OK", "+ERR"))
return;
// <20><><EFBFBD><EFBFBD>DHCP
if(!Ethernet_ATCmd("AT+WANN=DHCP", "+OK", "+ERR"))
// if(!Ethernet_ATCmd("AT+WANN=STATIC,192.168.0.3,255.255.255.0,192.168.0.1", "+OK", "+ERR"))
return;
// <20><><EFBFBD><EFBFBD>DNS<4E><53><EFBFBD><EFBFBD>DHCP<43><50><EFBFBD>ÿɲ<C3BF><C9B2><EFBFBD>DNS)
// if(!Ethernet_ATCmd("AT+DNS=202.106.0.20", "+OK", "+ERR"))
// return;
// <20><><EFBFBD><EFBFBD>TCPģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if(RF_APP == RF_APP_AJH)
{
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,171.88.5.52,8061", "+OK", "+ERR")) // <20><>˾·<CBBE><C2B7><EFBFBD><EFBFBD>
2025-05-30 12:38:36 +08:00
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,extra.cd-ls.cn,8061", "+OK", "+ERR"))
2025-06-05 13:40:44 +08:00
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,121.89.205.240,41001", "+OK", "+ERR"))
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,data.ajhiot.com,8088", "+OK", "+ERR"))
2025-04-03 15:59:48 +08:00
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,114.55.209.85,8088", "+OK", "+ERR")) // data.ajhiot.com
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,192.168.0.2,8061", "+OK", "+ERR")) // ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
else if(RF_APP == RF_APP_PRAX)
{
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,tts.praxair.com.cn,7005", "+OK", "+ERR"))
return;
}
else
{
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,data.cd-ls.cn,8088", "+OK", "+ERR"))
return;
}
// <20>رմ<D8B1><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!Ethernet_ATCmd("AT+HEARTEN1=OFF", "+OK", "+ERR"))
return;
// <20>رմ<D8B1><D5B4><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
if(!Ethernet_ATCmd("AT+REGEN1=OFF", "+OK", "+ERR"))
return;
// <20>رն<D8B1><D5B6><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD>
if(!Ethernet_ATCmd("AT+SOCKSL1=OFF", "+OK", "+ERR"))
return;
// <20><><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺60<36><30>
if(!Ethernet_ATCmd("AT+RSTIM=60", "+OK", "+ERR"))
return;
// <20><><EFBFBD><EFBFBD>ǰ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>
if(!Ethernet_ATCmd("AT+UARTCLBUF=ON", "+OK", "+ERR"))
return;
// <20><>ΪĬ<CEAA>ϲ<EFBFBD><CFB2><EFBFBD>
if(!Ethernet_ATCmd("AT+CFGTF", "saved", "+ERR"))
return;
// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
if(!Ethernet_ATCmd("AT+Z", "OK", "+ERR"))
return;
#endif
/* Enable UART3 interrupt */
huart3.RxISR = Ethernet_IRQHandler;
// <20><><EFBFBD><EFBFBD>״̬
Ethernet_initStatus = 1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t Ethernet_IsConnected()
{
u8 try_count;
u8 atMode = 0, connected = 0, tranMode = 0;
huart3.RxISR = Ethernet_ATHandler;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LoopBuff_Clear(&Ethernet_ATBuff);
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>3<EFBFBD>β<EFBFBD><CEB2>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>λ
for(try_count = 0; try_count < 3; try_count++)
{
if(Ethernet_ATMode())
{
atMode = 1;
break;
}
osDelay(500);
}
if(atMode)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
connected = Ethernet_ATCmd("AT+SOCKLKA1", "+OK=CONNECTED", "+OK=CONNECTING");
// <20><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ<C4A3><CABD>3<EFBFBD>β<EFBFBD><CEB2>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>λ
for(try_count = 0; try_count < 3; try_count++)
{
if(Ethernet_ATCmd("AT+ENTM", "+OK", "+ERR"))
{
tranMode = 1;
break;
}
osDelay(500);
}
}
huart3.RxISR = Ethernet_IRQHandler;
return (atMode && connected && tranMode);
}