#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);
// }
}
评论