#include "esp8266.h"
#include "uart.h"
#include "string.h"
#define ESP8266_BUFF_SIZE 60 //接收緩存
#define ESP8266_RX_MAX 10 //接收數(shù)據(jù)最大個數(shù)
#define RSP8266_TX_MAX 30 //發(fā)送數(shù)據(jù)最大個數(shù)
data unsigned char ESP8266_RxBuf[ESP8266_BUFF_SIZE]={0}; //ESP8266接收緩存
unsigned char ESP8266_TxBuf[RSP8266_TX_MAX]={0}; //最大30個字節(jié) 可以自己修改大小
unsigned char ESP8266_RxData[ESP8266_RX_MAX]={0}; //接收的處理過的數(shù)據(jù)
unsigned char ESP8266_InitFlag=0; //ESP8266初始化標志0未完成初始化 1已完成初始化
unsigned char ESP8266_RxLock=0; //接收數(shù)據(jù)鎖
data unsigned char ESP8266_RxCon=0; //ESP8266接收計數(shù)
unsigned char LinkID=0; //客戶端的連接ID:字符'0','1','2','3','4'最多連接5個
unsigned char SendFlag=0; //發(fā)送標志 1發(fā)送成功 2發(fā)送失敗
//需要修改成ESP8266當前接的串口號
void ESP8266_SendChar(unsigned char sbyte)
{
UART1_SendByte(sbyte);
}
//ESP8266數(shù)據(jù)解鎖功能
//定時10-50ms執(zhí)行
void ESP8266_RxDataUnlock(void)
{
if(ESP8266_RxLock>0)
ESP8266_RxLock++;
}
//ESP8266發(fā)送一個字符串函數(shù)
void ESP8266_SendStr(unsigned char *str)
{
while(*str != '\0')
{
ESP8266_SendChar(*str);
str++;
}
}
//ESP8266接收數(shù)據(jù)函數(shù)
//將此函數(shù)放入串口中斷進行接收數(shù)據(jù)
void ESP8266_ReceiveData(unsigned char rxdata)
{
ESP8266_RxBuf[ESP8266_RxCon++]=rxdata;
if(ESP8266_RxCon>=ESP8266_BUFF_SIZE) //接收數(shù)組越限處理
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表示收到數(shù)據(jù),client_id:此數(shù)字表示連接的Client編號,len:此數(shù)字表示長度,:后邊表示收到的數(shù)據(jù)
*/
//接收的數(shù)據(jù)分析處理
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;
}
}
//-----檢測是否有新數(shù)據(jù)到來-------------//+IPD,0,5:Dfxd0
point = strstr((const char *)ESP8266_RxBuf,(const char *)"+IPD");
if(point!=NULL)//有新數(shù)據(jù)過來 +IPD,0,4:Anfn
{ // 0
/*--------------更新交互的ID--------------------*/
point=point+5;
if(*point>='0' && *point<'5')
LinkID=*point;
/*--------------計算有效數(shù)據(jù)長度-------------------*/
point=point+3; //+IPD,0,4:Anfn
if(*point==':') //1位數(shù)據(jù)
{
rxlen=*(point-1)-0x30;
}
else //兩位數(shù)據(jù)+IPD,0,14:Anfn
{
point=point+1;
if(*point==':')
{
rxlen=10*(*(point-2)-0x30)+(*(point-1)-0x30);
}
}
/*--------------讀取接收的數(shù)據(jù)--------------------*/
if(rxlen>0 && rxlen<ESP8266_RX_MAX)
{
point++;
if(*point=='\n'||*point=='\r') //如果接收到回車或者換行不做處理
return;
for(i=0;i<ESP8266_RX_MAX;i++) //清空數(shù)據(jù)接收
ESP8266_RxData[i]=0;
for(i=0;i<rxlen;i++) //接收數(shù)據(jù)
{
ESP8266_RxData[i]=*point;
point++;
}
}
/*-------------------------------------------------*/
}
}
//ESP8266接收緩存清空函數(shù)
void ESP8266_BufClr(void)
{
unsigned char i=0;
while(ESP8266_RxLock>0 &&(ESP8266_RxLock<3)); //如果正在接收數(shù)據(jù)則等待
ESP8266_RxLock=0;
ESP8266_ReceiveHandle(); //清空緩存之前需要先提取一下有用信息
for(i=0;i<ESP8266_BUFF_SIZE;i++)
ESP8266_RxBuf[i]=0;
ESP8266_RxCon=0;
}
//作為Server模式進行初始化步驟如下
//注意使用AT指令后邊需要加\r\n 載入發(fā)送數(shù)據(jù)的時候不用
//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任務函數(shù)
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等待數(shù)據(jù)裝入發(fā)送緩存
{
case 0: //檢測有沒有數(shù)據(jù)需要發(fā)送
{
/*----------------------------------------*/
if(time>=2)
{
time=0;
ESP8266_BufClr(); //檢測接收的數(shù)據(jù)
}
if(ESP8266_TxBuf[0]!=0) //發(fā)送緩存有數(shù)據(jù)載入 進行自動發(fā)送
{
//1:發(fā)送之前需要計算要發(fā)送數(shù)據(jù)的長度
for(len=0;len<RSP8266_TX_MAX;len++)
{
if(ESP8266_TxBuf[len]==0)//1230
break;
}
//2:請求發(fā)送數(shù)據(jù)+長度
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: //準備發(fā)送數(shù)據(jù)
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)">"); //接收到>表示可以發(fā)送數(shù)據(jù)
if(point!=NULL)//收到>表示可以發(fā)送數(shù)據(jù)
{
ESP8266_BufClr();
for(i=0;i<len;i++)
ESP8266_SendChar(ESP8266_TxBuf[i]); //載入需要發(fā)送的數(shù)據(jù)
for(i=0;i<RSP8266_TX_MAX;i++) //清空發(fā)送緩存
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; //發(fā)送失敗
}
step=0;
ESP8266_BufClr();
}
}
}break;
/*----------------------------------------*/
case 2: //發(fā)送數(shù)據(jù)反饋檢測
{
if(time>=2)
{
time=0;
point = strstr((const char *)ESP8266_RxBuf,(const char *)"link is not valid");//連接不可用
if(point!=NULL)
{
LinkID=0;
SendFlag=2; //發(fā)送失敗
}
point = strstr((const char *)ESP8266_RxBuf,(const char *)"OK");//連接不可用
if(point!=NULL)
{
SendFlag=1; //發(fā)送成功
}
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發(fā)送握手指令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;
}
}
}
|