工作中写的,但是没用上,又不舍得直接删掉,现在发在这里留个念想
#define AT "AT\r\n"
#define AT_RESET "AT+RST\r\n"
#define AT_MODE_STA "AT+CWMODE=1\r\n"
#define AT_MODE_AP "AT+CWMODE=2\r\n"
#define AT_MODE_MIX "AT+CWMODE=3\r\n"
#define AT_CIPMODE "AT+CIPMODE=1\r\n" //透传命令
#define AT_EXITCIPMODE "AT+CIPMODE=0\r\n" //退出透传命令
#define AT_CIPSEND "AT+CIPSEND\r\n" //开始透传
#define AT_ENDCIPMODE "+++"
#define AT_CIPCLOSE "AT+CIPCLOSE\r\n" //断开服务器连接
#define AT_GETMUX "AT+CIPMUX=1\r\n" //开启多连接
#define AT_EXITMUX "AT+CIPMUX=0\r\n" //开启多连接
#define AT_BUILDSERVER "AT+CIPSERVER=1,1001\r\n" //建立服务器
#define AT_CLOSESERVER "AT+CIPSERVER=0\r\n" //关闭服务器
#define AT_RX_OK "ok" //用于接收的时候分析有没有接收到目标数据
void AT_Timer_Start(u8 period)
{
switch(period)
{
case 1:
{
WiFi_Timer_1s_CNT[0] = 0;
WiFi_Timer_1s_CTL = true;
break;
}
case 2:
{
WiFi_Timer_2s_CNT[0] = 0;
WiFi_Timer_2s_CTL = true;
break;
}
case 8:
{
WiFi_Timer_8s_CNT[0] = 0;
WiFi_Timer_8s_CTL = true;
break;
}
case 12:
{
WiFi_Timer_12s_CNT[0] = 0;
WiFi_Timer_12s_CTL = true;
break;
}
}
}
void AT_Timer_Stop(u8 period)
{
switch(period)
{
case 1:
{
WiFi_Timer_1s_CNT[0] = 0;
WiFi_Timer_1s_CTL = false;
break;
}
case 2:
{
WiFi_Timer_2s_CNT[0] = 0;
WiFi_Timer_2s_CTL = false;
break;
}
case 8:
{
WiFi_Timer_8s_CNT[0] = 0;
WiFi_Timer_8s_CTL = false;
break;
}
case 12:
{
WiFi_Timer_12s_CNT[0] = 0;
WiFi_Timer_12s_CTL = false;
break;
}
}
}
#define AT_RX_LEN 10
u8 AT_TX_Times = 0;
#define TX_SUCCESS 0
#define TX_WAITING 1
#define TX_FAIL 2
bool TX_State = false;
u8 TX_AT_AT(void)
{
bool RX_Fault = false;
u8 RX_Data[UART_RX_BUF_SIZE] = {0};
if(TX_State == false)
{
uart_Send_Data((u8*)"AT\r\n",sizeof("AT\r\n"));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_RESET_RX_LEN 20
//复位
//u8 AT_TX_Times = 0;
u8 TX_AT_RESER(void) //发完复位命令模块会回复一大堆设备信息,最后回复一个ready
{ //,但是这一堆信息太多了,大于256个字节,所以现在接收有点问题
bool RX_Fault = false;
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
if(TX_State == false)
{
uart_Send_Data((u8*)AT_RESET,sizeof(AT_RESET));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(2);
}
// while(1)
// {
if(WiFi_Timer_2s_CNT[0] >= WiFi_Timer_2s_CNT[1])
{
WiFi_Timer_2s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_RESET_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(2);
TX_State = false;
FL_DelayMs(300);
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(2);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_MIXMode_RX_LEN 20
//进入混合模式
u8 TX_AT_MIXMode(void)
{
bool RX_Fault = false;
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
if(TX_State == false)
{
uart_Send_Data((u8*)AT_MODE_MIX,sizeof(AT_MODE_MIX));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(2);
}
// while(1)
// {
if(WiFi_Timer_2s_CNT[0] >= WiFi_Timer_2s_CNT[1])
{
WiFi_Timer_2s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_MIXMode_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(2);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(2);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_GetWiFi_RX_LEN 90
//AT+CWJAP_DEF="XJWL_2.4G","XJWL888888"
#define WiFi_NAME_MAX_LEN 20
#define WiFi_PASSWORD_MAX_LEN 20
//连接WiFi
u8 WiFi_Name[WiFi_NAME_MAX_LEN] = {0}; //限制最长20个字符
u8 WiFi_Password[WiFi_PASSWORD_MAX_LEN] = {0}; //限制最长20个字符
u8 TX_AT_GetWiFi()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
char at[65] = {0};
u8 at_Len = 0;
strcpy((char*)WiFi_Name,"XJWL_2.4G");
strcpy((char*)WiFi_Password,"XJWL888888");
at_Len = sprintf(at,"AT+CWJAP_DEF=\"%s\",\"%s\"\r\n",WiFi_Name,WiFi_Password);
if(TX_State == false)
{
uart_Send_Data((u8*)at,at_Len);
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(8);
}
// while(1)
// {
if(WiFi_Timer_8s_CNT[0] >= WiFi_Timer_8s_CNT[1])
{
WiFi_Timer_8s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_MIXMode_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(8);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(8);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_GetServer_RX_LEN 80
//AT+CIPSTART="TCP","192.168.10.181",6060
//连接服务器
u8 Server_Name[16] = {0}; //限制最长16个字符
u8 Server_Port[5] = {0}; //限制最长5个字符
u8 TX_AT_GetServer()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
char at[65] = {0};
u8 at_Len = 0;
strcpy((char*)Server_Name,"192.168.10.181");
strcpy((char*)Server_Port,"6060");
at_Len = sprintf(at,"AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",Server_Name,Server_Port);
if(TX_State == false)
{
uart_Send_Data((u8*)at,at_Len);
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(8);
}
// while(1)
// {
if(WiFi_Timer_8s_CNT[0] >= WiFi_Timer_8s_CNT[1])
{
WiFi_Timer_8s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_GetServer_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(8);
TX_State = false;
return TX_SUCCESS;
}
if(NULL != strstr((char *)RX_Data, "ALREADY CONNECTED")) //处于连接状态会有这个回复
{ //出现了
AT_Timer_Stop(8);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(8);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_GetTransMode_RX_LEN 25
//进入透传模式
u8 TX_AT_GetTransMode()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_CIPMODE,sizeof(AT_CIPMODE));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_GetTransMode_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
//开始透传命令没有反馈
u8 TX_AT_StartTrans()
{
uart_Send_Data((u8*)AT_CIPSEND,sizeof(AT_CIPSEND));
return TX_SUCCESS;
}
//结束透传,也没有反馈
u8 TX_AT_EndTrans()
{
FL_DelayMs(300);
uart_Send_Data((u8*)AT_ENDCIPMODE,sizeof(AT_ENDCIPMODE));
FL_DelayMs(300);
return TX_SUCCESS;
}
//退出透传模式
#define AT_ExitTransMode_RX_LEN 25
u8 TX_AT_ExitTransMode()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_EXITCIPMODE,sizeof(AT_EXITCIPMODE));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_ExitTransMode_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
#define AT_ExitServer_RX_LEN 35
//断开服务器连接
u8 TX_AT_ExitServer()
{
bool RX_Fault = false;
u8 RX_Data[UART_RX_BUF_SIZE] = {0};
if(TX_State == false)
{
uart_Send_Data((u8*)AT_CIPCLOSE,sizeof(AT_CIPCLOSE));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_ExitServer_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没出现,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次都没成功
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
//打开多连接(建立服务器的前置操作)
#define AT_GetMUX_RX_LEN 25
u8 TX_AT_GetMUX()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_GETMUX,sizeof(AT_GETMUX));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_GetMUX_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没收到目标信息,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一,并且再进来会重发
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次没收到,返回一个不一样的值(TX_FAIL),并且再进来会重发
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
//关闭多连接(建立服务器的前置操作)
#define AT_GetMUX_RX_LEN 25
u8 TX_AT_ExitMUX()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_EXITMUX,sizeof(AT_EXITMUX));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(1);
}
// while(1)
// {
if(WiFi_Timer_1s_CNT[0] >= WiFi_Timer_1s_CNT[1])
{
WiFi_Timer_1s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_GetMUX_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(1);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没收到目标信息,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一,并且再进来会重发
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次没收到,返回一个不一样的值(TX_FAIL),并且再进来会重发
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(1);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
//建立服务器
#define AT_BuildServer_RX_LEN 45
u8 TX_AT_BuildServer()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_BUILDSERVER,sizeof(AT_BUILDSERVER));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(2);
}
// while(1)
// {
if(WiFi_Timer_2s_CNT[0] >= WiFi_Timer_2s_CNT[1])
{
WiFi_Timer_2s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_BuildServer_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(2);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没收到目标信息,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一,并且再进来会重发
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次没收到,返回一个不一样的值(TX_FAIL),并且再进来会重发
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(2);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
//关闭服务器
#define AT_BuildServer_RX_LEN 45
u8 TX_AT_CloseServer()
{
u8 RX_Data[UART_RX_BUF_SIZE+1] = {0};
bool RX_Fault = false;
if(TX_State == false)
{
uart_Send_Data((u8*)AT_CLOSESERVER,sizeof(AT_CLOSESERVER));
//标志位表示已经发送过这个命令了
TX_State = true;
AT_Timer_Start(2);
}
// while(1)
// {
if(WiFi_Timer_2s_CNT[0] >= WiFi_Timer_2s_CNT[1])
{
WiFi_Timer_2s_CNT[0] = 0;
Uart4_RX(RX_Data,AT_BuildServer_RX_LEN);
WiFi_CleanDataRevBuffer();
//----------查找需要的字符是否出现----------------
if(NULL != strstr((char *)RX_Data, AT_RX_OK))
{ //出现了
AT_Timer_Stop(2);
TX_State = false;
return TX_SUCCESS;
}
else
{ //没收到目标信息,错误标志位置位
RX_Fault = true;
}
if(RX_Fault == true)
{ //错误了就让发送次数加一,并且再进来会重发
TX_State = false;
AT_TX_Times++;
}
if(AT_TX_Times >= 3) //三次没收到,返回一个不一样的值(TX_FAIL),并且再进来会重发
{ //尝试三次还没有成功,关闭定时器,返回失败
AT_Timer_Stop(2);
AT_TX_Times = 0;
TX_State = false; //三次都没接收到,再运行这个函数就重新发送AT指令
return TX_FAIL;
}
}
// }
return TX_WAITING;
}
u8 Commu_Upload
bool AT_Test(void)
{
// TX_AT_AT(); //发送AT
// TX_AT_RESER(); //复位
// TX_AT_MIXMode(); //混合模式
// TX_AT_GetWiFi(); //链接WiFi
// TX_AT_GetServer(); //连接服务器
// TX_AT_GetTransMode(); //进入透传模式
// TX_AT_StartTrans(); //开始透传
// TX_AT_EndTrans(); //结束透传
// TX_AT_ExitTransMode(); //退出透传模式
TX_AT_ExitServer();
// TX_AT_GetMUX(); //打开多连接
// TX_AT_ExitMUX(); //退出多连接
// TX_AT_BuildServer(); //建立服务器
// TX_AT_CloseServer(); //关闭服务器
return true;
}