#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);//等待500msreturn 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);//}}
评论