初级会员

- 积分
- 142
- 金钱
- 142
- 注册时间
- 2018-10-19
- 在线时间
- 25 小时
|
使用硬件:战舰3,esp8266软件:SocketTool,XCOM V2.0
连接方式:串口1连接电脑,串口三连接wifi
time2定时器做为wifi异常处理定时器wifi连接路由器和网络服务器,8266作为tcp clien连接sever
void wifi_run(void)
{
wifi_null();
wifi_sat=NULL; //验证标志位置空
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT\r\n");
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK");//strstr(str1,str2)测算str1是否是str2的子串
wifi_null(); //清空接收
}
wifi_sat=NULL; //重置指向为null
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT+CWMODE=3\r\n");
for(i=0;i<3;i++)
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK"); //返回值为地址,不是的话返回null
wifi_null(); //清空接收
}
wifi_sat=NULL;
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT+CWJAP_CUR=\"@Tianb");//账号,密码
delay_ms(1);
u3_printf("oPhone\",\"2345678901\"\r\n");
for(i=0;i<20;i++)
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK"); //返回值为地址,不是的话返回null
wifi_null(); //清空接收
}
wifi_sat=NULL;
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT+CIPMUX=0\r\n"); //设置为单链接模式
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK"); //返回值为地址,不是的话返回null
wifi_null(); //清空接收
}
wifi_sat=NULL;
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT+CIPSTART=\"TCP\",");
delay_ms(1);
u3_printf("\"192.168.2.227\",8080\r\n");
for(i=0;i<5;i++)
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK"); //返回值为地址,不是的话返回null
if(wifi_sat==NULL)
wifi_sat=strstr((const char*)USART3_RX_BUF,"CON");
wifi_null(); //清空接收
if(wifi_sat!=NULL)
{
printf("连接完成");
wifi_sat_1=1; //连接标志位开启
}
}
}
数据读取函数
void wifi_r(char *temp) //temp是返回的数据
{
wifi_sat=NULL;
wifi_sat=strstr((const char*)USART3_RX_BUF,"A"); //结束符为A,接收的数据识别到A为一帧数据发送完成
if(wifi_sat!=NULL) //如果接收到结束符,将数据输出
{
printf("%s",USART3_RX_BUF);
for(i=0;USART3_RX_BUF[i]!='\0';i++)
{
temp[i]=USART3_RX_BUF[i];
if(USART3_RX_BUF[i+1]=='\0')
temp[i+1]='\0';
}
wifi_null();
USART3_RX_STA=0; //可以重新接受(使usart3从头开始接收)
}
}
数据发送函数
void wifi_w1(char *temp) //普通数据发送
{
int s;
s=strlen(temp)+2; //发送字节测算
wifi_null(); //清空接收
wifi_sat=NULL;
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("AT+CIPSEND=%d\r\n",s);//字节数,指令要发送多少字节数
for(i=0;i<5;i++)
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,">"); //返回值为地址,不是的话返回null
wifi_null(); //清空接收
}
wifi_sat=NULL;
while(wifi_sat==NULL) //定义为常变量,在本行语句中不能被更改
{
u3_printf("%s\r\n",temp); //发送字符串
for(i=0;i<3;i++)
delay_ms(1000);
printf("%s",(const char*)USART3_RX_BUF);
USART3_RX_STA=0;
wifi_sat=strstr((const char*)USART3_RX_BUF,"OK"); //返回值为地址,不是的话返回null
wifi_null(); //清空接收
}
}
char *wifi_error3=NULL; //检测指令是否发送正常
char *wifi_error1=NULL; //检测wifi是否正常连接
char *wifi_error2=NULL; //检测wifi是否已连接
char *wifi_error4=NULL; //服务器断开
连接异常处理
void TIM2_IRQHandler(void) //TIM3中断
{
wifi_error1=NULL;
wifi_error2=NULL;
wifi_error3=NULL;
wifi_error4=NULL;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
if(wifi_sat_1) //检测wifi是否连接
{
wifi_error1=strstr((const char*)USART3_RX_BUF,"DISCONNECT"); //检测连接是否断开
wifi_error3=strstr((const char*)USART3_RX_BUF,"ERROR"); //检测指令是否发送正常
wifi_error4=strstr((const char*)USART3_RX_BUF,"CLOSED"); //服务器已断开
if(wifi_error4)
{
printf("服务器断开");
wifi_run();
}
if(wifi_error3)
{
printf("模块重启");
wifi_run();
}
if(wifi_error1) //连接已断开
{
if(k==0) //执行一次
{
wifi_null();
printf("连接已断开");
USART3_RX_STA=0;
k=1;
}
}
wifi_error2=strstr((const char*)USART3_RX_BUF,"GOT IP"); //检测连接是否链接
if(wifi_error2) //已连接
{
wifi_null();
printf("wifi连接");
wifi_error1=NULL;
wifi_error2=NULL;
USART3_RX_STA=0;
k=0;
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIMx更新中断标志
}
}
不说了,上程序包
|
|