#include "esp8266.h"
#include "uart.h"
#include "string.h"
#define ESP8266_BUFF_SIZE 60 //接收缓存
#define ESP8266_RX_MAX 10 //接收数据最大个数
#define RSP8266_TX_MAX 30 //发送数据最大个数
data unsigned char ESP8266_RxBuf[ESP8266_BUFF_SIZE]={0}; //ESP8266接收缓存
unsigned char ESP8266_TxBuf[RSP8266_TX_MAX]={0}; //最大30个字节 可以自己修改大小
unsigned char ESP8266_RxData[ESP8266_RX_MAX]={0}; //接收的处理过的数据
unsigned char ESP8266_InitFlag=0; //ESP8266初始化标志0未完成初始化 1已完成初始化
unsigned char ESP8266_RxLock=0; //接收数据锁
data unsigned char ESP8266_RxCon=0; //ESP8266接收计数
unsigned char LinkID=0; //客户端的连接ID:字符'0','1','2','3','4'最多连接5个
unsigned char SendFlag=0; //发送标志 1发送成功 2发送失败
//需要修改成ESP8266当前接的串口号
void ESP8266_SendChar(unsigned char sbyte)
{
UART1_SendByte(sbyte);
}
//ESP8266数据解锁功能
//定时10-50ms执行
void ESP8266_RxDataUnlock(void)
{
if(ESP8266_RxLock>0)
ESP8266_RxLock++;
}
//ESP8266发送一个字符串函数
void ESP8266_SendStr(unsigned char *str)
{
while(*str != '\0')
{
ESP8266_SendChar(*str);
str++;
}
}
//ESP8266接收数据函数
//将此函数放入串口中断进行接收数据
void ESP8266_ReceiveData(unsigned char rxdata)
{
ESP8266_RxBuf[ESP8266_RxCon++]=rxdata;
if(ESP8266_RxCon>=ESP8266_BUFF_SIZE) //接收数组越限处理
ESP8266_RxCon=0;
ESP8266_RxLock=1;
}
/*
//设置好之后等待客户端的连接,如果有客户端连接成功,则会收到这样的语句
0,CONNECT
前面是LinkID:0-4 //因为ESP8266作为Server最多可以连接5个Client
//客户端主动断开连接
0,CLOSED
//前面是LinkID:0-4
+IPD,0,4:Anfn
+PID表示收到数据,client_id:此数字表示连接的Client编号,len:此数字表示长度,:后边表示收到的数据
*/
//接收的数据分析处理
void ESP8266_ReceiveHandle(void)
{
char *point=NULL;
unsigned char rxlen=0;
unsigned char i=0;
//-------检测是否有客户端连接---------------//
point = strstr((const char *)ESP8266_RxBuf,(const char *)",CONNECT");
if(point!=NULL)//有客户端连接
{
point=point-1;
if(*point>='0' && *point<'5')
LinkID=*point;
}
//-------检测是否有客户端断开-------------//
point = strstr((const char *)ESP8266_RxBuf,(const char *)",CLOSED");
if(point!=NULL)//客户端主动断开连接
{
point=point-1;
if(*point>='0' && *point<'5')
{
if(LinkID==*point) //是当前连接的客户端断开
LinkID=0;
}
}
//-----检测是否有新数据到来-------------//+IPD,0,5:Dfxd0
point = strstr((const char *)ESP8266_RxBuf,(const char *)"+IPD");
if(point!=NULL)//有新数据过来 +IPD,0,4:Anfn
{ // 0
/*--------------更新交互的ID--------------------*/
point=point+5;
if(*point>='0' && *point<'5')
LinkID=*point;
/*--------------计算有效数据长度-------------------*/
point=point+3; //+IPD,0,4:Anfn
if(*point==':') //1位数据
{
rxlen=*(point-1)-0x30;
}
else //两位数据+IPD,0,14:Anfn
{
point=point+1;
if(*point==':')
{
rxlen=10*(*(point-2)-0x30)+(*(point-1)-0x30);
}
}
/*--------------读取接收的数据--------------------*/
if(rxlen>0 && rxlen<ESP8266_RX_MAX)
{
point++;
if(*point=='\n'||*point=='\r') //如果接收到回车或者换行不做处理
return;
for(i=0;i<ESP8266_RX_MAX;i++) //清空数据接收
ESP8266_RxData[i]=0;
for(i=0;i<rxlen;i++) //接收数据
{
ESP8266_RxData[i]=*point;
point++;
}
}
/*-------------------------------------------------*/
}
}
//ESP8266接收缓存清空函数
void ESP8266_BufClr(void)
{
unsigned char i=0;
while(ESP8266_RxLock>0 &&(ESP8266_RxLock<3)); //如果正在接收数据则等待
ESP8266_RxLock=0;
ESP8266_ReceiveHandle(); //清空缓存之前需要先提取一下有用信息
for(i=0;i<ESP8266_BUFF_SIZE;i++)
ESP8266_RxBuf[i]=0;
ESP8266_RxCon=0;
}
//作为Server模式进行初始化步骤如下
//注意使用AT指令后边需要加\r\n 载入发送数据的时候不用
//1:AT 握手测试
//2:ATE0 关闭回显
//3:AT+CWMODE=2 设置成AP模式
//5:AT+RST //一定要重启生效
//4:AT+CIPMUX=1 多连接
//5:AT+CIPAP="192.168.4.1"设置IP地址
//6:AT+CIPSERVER=1,9000设置端口号
//ESP8266任务函数
void ESP8266_Task(void)
{
unsigned char i=0;
static unsigned char len=0;
static unsigned char step=0; //初始化步骤
static unsigned int time=0; //间隔时间
char *point=NULL;
if(ESP8266_InitFlag==1) //0的时候没有进行初始化
{
time++;
if(LinkID>0) //有客户端连接了
{
switch(step) //0等待数据装入发送缓存
{
case 0: //检测有没有数据需要发送
{
/*----------------------------------------*/
if(time>=2)
{
time=0;
ESP8266_BufClr(); //检测接收的数据
}
if(ESP8266_TxBuf[0]!=0) //发送缓存有数据载入 进行自动发送
{
//1:发送之前需要计算要发送数据的长度
for(len=0;len<RSP8266_TX_MAX;len++)
{
if(ESP8266_TxBuf[len]==0)//1230
break;
}
//2:请求发送数据+长度
ESP8266_SendStr((unsigned char *)"AT+CIPSEND=");
ESP8266_SendChar(LinkID);
ESP8266_SendChar(',');
if(len>9)
ESP8266_SendChar(len/10+0x30);
ESP8266_SendChar(len%10+0x30);
ESP8266_SendStr((unsigned char *)"\r\n");
step=1;
}
}break;
/*----------------------------------------*/
case 1: //准备发送数据
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)">"); //接收到>表示可以发送数据
if(point!=NULL)//收到>表示可以发送数据
{
ESP8266_BufClr();
for(i=0;i<len;i++)
ESP8266_SendChar(ESP8266_TxBuf[i]); //载入需要发送的数据
for(i=0;i<RSP8266_TX_MAX;i++) //清空发送缓存
ESP8266_TxBuf[i]=0;
step=2;
}
else //没有收到> 则进行LinkID检测
{
point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid"); //连接不可用
if(point!=NULL)
{
LinkID=0;
SendFlag=2; //发送失败
}
step=0;
ESP8266_BufClr();
}
}
}break;
/*----------------------------------------*/
case 2: //发送数据反馈检测
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid");//连接不可用
if(point!=NULL)
{
LinkID=0;
SendFlag=2; //发送失败
}
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");//连接不可用
if(point!=NULL)
{
SendFlag=1; //发送成功
}
ESP8266_BufClr();
step=0;
}
}break;
/*----------------------------------------*/
default: step=0; break;
}//end of switch
}
else //没有客户端连接
{
if(time>2)
{
time=0;
step=0;
ESP8266_BufClr();
}
}
}
else //初始化没有完成进行初始化操作
{
time++;
switch(step)
{
/*--------------------step0发送握手指令AT----------------------------------*/
case 0:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT\r\n");
step=1;
time=0;
}break;
case 1:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=2;
else
step=0;
}
}break;
/*--------------------step1关闭回显----------------------------------*/
case 2:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"ATE0\r\n");
step=3;
time=0;
}break;
case 3:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=4;
else
step=0;
}
}break;
/*--------------------step2设置成AP模式----------------------------------*/
case 4:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CWMODE=2\r\n");
step=5;
time=0;
}break;
case 5:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=6;
else
step=0;
}
}break;
/*--------------------重启生效---------------------------------*/
case 6:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+RST\r\n");
step=7;
time=0;
}break;
case 7:
{
if(time>15)
{
time=0;
step=8;
}
}break;
/*--------------------step3设置多连接AT+CIPMUX=1---------------------------------*/
case 8:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPMUX=1\r\n");
step=9;
time=0;
}break;
case 9:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=10;
else
step=0;
}
}break;
/*--------------------step4设置IP地址AT+CIPAP=\"192.168.4.1\"----------------------*/
case 10:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPAP=\"192.168.4.1\"\r\n");
step=11;
time=0;
}break;
case 11:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
step=12;
else
step=0;
}
}break;
/*--------------------step5设置Port:AT+CIPSERVER=1,9000----------------------*/
case 12:
{
ESP8266_BufClr(); //清空接收缓存
ESP8266_SendStr((unsigned char *)"AT+CIPSERVER=1,9000\r\n");
step=13;
time=0;
}break;
case 13:
{
if(time>=6)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");
if(point!=NULL)//接收到OK
ESP8266_InitFlag=1; //初始化成功
else
ESP8266_InitFlag=0; //初始化失败
step=0;
}
}break;
default: step=0; ESP8266_InitFlag=0; break;
}
}
}
|