#include "esp8266.h"extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节extern vu16 USART3_RX_STA; //接收数据状态
/////////////////////////////////////////////////////////////////////////////////////////////////////////// //用户配置区
//连接端口号:8086,可自行修改为其他端口.const u8 portnum[]="8089";
//WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改.const u8 wifista_ssid[]="wbyq1"; //路由器SSID号const u8 wifista_encryption[]="wpa2_aes"; //wpa/wpa2 aes加密方式const u8 wifista_password[]="123456789"; //连接密码
//WIFI AP模式,模块对外的无线参数,可自行修改.const u8 wifiap_ssid[]="Cortex_M3"; //对外SSID号const u8 wifiap_encryption[]="wpawpa2_aes"; //wpa/wpa2 aes加密方式const u8 wifiap_password[]="12345678"; //连接密码
/*函数功能:向ESP82668266发送命令函数参数: cmd:发送的命令字符串 ack:期待的应答结果,如果为空,则表示不需要等待应答 waittime:等待时间(单位:10ms)返 回 值: 0,发送成功(得到了期待的应答结果) 1,发送失败*/u8 ESP8266_SendCmd(u8 *cmd,u8 *ack,u16 waittime){ u8 res=0; USART3_RX_STA=0; UsartStringSend(USART3,cmd);//发送命令 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { DelayMs(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(ESP8266_CheckCmd(ack)) { res=0; //printf("cmd->ack:%s,%s\r\n",cmd,(u8*)ack); break;//得到有效数据 } USART3_RX_STA=0; } } if(waittime==0)res=1; } return res;}
/*函数功能:ESP8266发送命令后,检测接收到的应答函数参数:str:期待的应答结果返 回 值:0,没有得到期待的应答结果 其他,期待应答结果的位置(str的位置)*/u8* ESP8266_CheckCmd(u8 *str){ char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); //查找是否应答成功 printf("RX=%s",USART3_RX_BUF); } return (u8*)strx;}
/*函数功能:向ESP8266发送指定数据函数参数: data:发送的数据(不需要添加回车) ack:期待的应答结果,如果为空,则表示不需要等待应答 waittime:等待时间(单位:10ms)返 回 值:0,发送成功(得到了期待的应答结果)luojian*/u8 ESP8266_SendData(u8 *data,u8 *ack,u16 waittime){ u8 res=0; USART3_RX_STA=0; UsartStringSend(USART3,data);//发送数据 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { DelayMs(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(ESP8266_CheckCmd(ack))break;//得到有效数据 USART3_RX_STA=0; } } if(waittime==0)res=1; } return res;}
/*函数功能:ESP8266退出透传模式返 回 值:0,退出成功; 1,退出失败*/u8 ESP8266_QuitTrans(void){ while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(15); //大于串口组帧时间(10ms) while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(15); //大于串口组帧时间(10ms) while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(500); //等待500ms return ESP8266_SendCmd("AT","OK",20);//退出透传判断.}
/*函数功能:获取ESP82668266模块的AP+STA连接状态返 回 值:0,未连接;1,连接成功*/u8 ESP8266_ApStaCheck(void){ if(ESP8266_QuitTrans())return 0; //退出透传 ESP8266_SendCmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态 if(ESP8266_CheckCmd("+CIPSTATUS:0")&& ESP8266_CheckCmd("+CIPSTATUS:1")&& ESP8266_CheckCmd("+CIPSTATUS:2")&& ESP8266_CheckCmd("+CIPSTATUS:4")) return 0; else return 1;}
/*函数功能:获取ESP8266模块的连接状态返 回 值:0,未连接;1,连接成功.*/u8 ESP8266_ConstaCheck(void){ u8 *p; u8 res; if(ESP8266_QuitTrans())return 0; //退出透传 ESP8266_SendCmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态 p=ESP8266_CheckCmd("+CIPSTATUS:"); res=*p; //得到连接状态 return res;}
/*函数功能:获取ip地址函数参数:ipbuf:ip地址输出缓存区*/void ESP8266_GetWanip(u8* ipbuf){ u8 *p,*p1; if(ESP8266_SendCmd("AT+CIFSR\r\n","OK",50))//获取WAN IP地址失败 { ipbuf[0]=0; return; } p=ESP8266_CheckCmd("\""); p1=(u8*)strstr((const char*)(p+1),"\""); *p1=0; sprintf((char*)ipbuf,"%s",p+1); }
/*函数功能:将收到的AT指令应答数据返回给电脑串口参 数:mode:0,不清零USART3_RX_STA; 1,清零USART3_RX_STA;*/void ESP8266_AtResponse(u8 mode){ if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 printf("%s",USART3_RX_BUF); //发送到串口 if(mode)USART3_RX_STA=0; } }
/*函数功能:ESP8266 AP模式+TCP服务器模式测试*/void ESP8266_APorServer(void){ u8 p[100]; u8 ipbuf[20]; while(ESP8266_SendCmd("AT\r\n","OK",20))//检查WIFI模块是否在线 { ESP8266_QuitTrans();//退出透传 ESP8266_SendCmd("AT+CIPMODE=0\r\n","OK",200); //关闭透传模式 printf("未检测到模块,正在尝试连接模块...\r\n"); DelayMs(800); } printf("ESP8266模块检测OK!\r\n"); while(ESP8266_SendCmd("ATE0\r\n","OK",20)); //关闭回显 printf("请用设备连接WIFI热点:%s,%s,%ss\r\n",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password); /*1. 设置WIFI AP模式 */ ESP8266_SendCmd("AT+CWMODE=2\r\n","OK",50); /*2. 重启模块 */ ESP8266_SendCmd("AT+RST\r\n","OK",20); /*3. 延时3S等待重启成功*/ DelayMs(1000); DelayMs(1000); DelayMs(1000); /*5. 配置模块AP模式无线参数*/ sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",wifiap_ssid,wifiap_password); ESP8266_SendCmd(p,"OK",1000); /*4. 设置多连接模式:0单连接,1多连接(服务器模式必须开启)*/ ESP8266_SendCmd("AT+CIPMUX=1\r\n","OK",20); /*5. 开启Server模式(0,关闭;1,打开),端口号为portnum */ sprintf((char*)p,"AT+CIPSERVER=1,%s\r\n",(u8*)portnum); ESP8266_SendCmd(p,"OK",50); /*6. 获取当前模块的IP*/ ESP8266_GetWanip(ipbuf);// printf("IP地址:%s 端口:%s",ipbuf,(u8*)portnum); USART3_RX_STA=0; //清空串口的接收标志位// while(1)// {// key=GetKeyVal(1);//退出测试// if(key==1)// { // printf("退出测试!\r\n"); // ESP8266_QuitTrans(); //退出透传// ESP8266_SendCmd("AT+CIPMODE=0","OK",20); //关闭透传模式// break; // }// else if(key==2) //发送数据 // {// ESP8266_SendCmd("AT+CIPSEND=0,12\r\n","OK",200); //设置发送数据长度为12个// ESP8266_SendData("ESP8266测试!","OK",100); //发送指定长度的数据// DelayMs(200);// }// t++;// DelayMs(10);// if(USART3_RX_STA&0X8000) //接收到一次数据了// { // rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度// USART3_RX_BUF[rlen]=0; //添加结束符 // printf("接收的数据: rlen=%d,%s",rlen,USART3_RX_BUF); //发送到串口 // USART3_RX_STA=0;// if(constate!=3)t=1000; //状态为还未连接,立即更新连接状态// else t=0; //状态为已经连接了,10秒后再检查// }// if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在.// {//// constate=ESP8266_ConstaCheck();//得到连接状态//// if(!constate)printf("连接失败!\r\n");// t=0;// }// if((t%20)==0)LED2=!LED2;// ESP8266_AtResponse(1);// }}
评论