/******************************************************************************/
//STA模式操作步骤:
//AT+CWMODE_CUR=1
//AT+CWJAP_CUR="wifiname","password"
//AT+CIFSR 查看路由器分配的IP
//AT+CCIPMUX=1
//AT+CIPSERVER=1,8888
//AT+CIPSEND
/******************************************************************************/
/******************************************************************************/
// 包含头文件
/******************************************************************************/
#include "config.h"
#include "esp8266.h"
#include "delay.h"
#include "uart.h"
/******************************************************************************/
// 定义接收数据数组和命令执行是否完成的标志位
/******************************************************************************/
uint8 rcvTable[50];
uint8 flag = 0;
/******************************************************************************/
// 函数名称:Uart_Cmd_Display
// 输入参数:str-发送的命令
// 输出参数:无
// 函数功能:串口打印单片机向ESP8266发送的命令,便于观察实现现象
/******************************************************************************/
void Uart_Cmd_Display(uint8 *str){
displayMode;
Uart_Send_String(str);
Uart_Send_String("\r\n");
cmdMode;
}
/******************************************************************************/
// 函数名称:Esp8266_Send_String
// 输入参数:str-发送的命令
// 输出参数:无
// 函数功能:向ESP8266模块发送命令
/******************************************************************************/
void Esp8266_Send_String(uint8 *str){
cmdMode;
Uart_Send_String(str);
Uart_Send_String("\r\n");
}
/******************************************************************************/
// 函数名称:Esp8266_Sta_Mode
// 输入参数:无
// 输出参数:无
// 函数功能:ESP8266模块设置为STA模式
// 注意:忙信号检查
// 每发送一条命令一定要等待ESP8266完成操作后,再发送下一条命令
/******************************************************************************/
void Esp8266_Sta_Mode(void){
Uart_Cmd_Display("setting sta mode...\r\n");
flag=0;
Uart_Cmd_Display("AT+RST"); //重启模块
Esp8266_Send_String("AT+RST");//返回ready
while(flag!=0x02);
flag=0;
Uart_Cmd_Display("AT+CWMODE_CUR=1"); //设置为sta模式
Esp8266_Send_String("AT+CWMODE_CUR=1");//返回OK
while(flag!=0x01);
flag = 0;
Uart_Cmd_Display("AT+CWJAP_CUR=\"wifiname\",\"password\""); //连接到网络
Esp8266_Send_String("AT+CWJAP_CUR=\"TP-LINK_ZT\",\"95279527\"");//返回OK
while(flag!=0x01);
flag = 0;
Uart_Cmd_Display("AT+CIPMUX=1"); //设置多连接
Esp8266_Send_String("AT+CIPMUX=1"); //返回OK
while(flag!=0x01);
flag = 0;
Uart_Cmd_Display("AT+CIPSERVER=1,8888"); //设置为服务器,端口为8888
Esp8266_Send_String("AT+CIPSERVER=1,8888");//返回OK
while(flag!=0x01);
flag = 0;
Uart_Cmd_Display("AT+CIFSR"); //查询路由器分配的IP地址
Esp8266_Send_String("AT+CIFSR");//返回OK
while(flag!=0x01);
flag = 0;
Uart_Cmd_Display("sta mode is ready...\r\n");
}
/******************************************************************************/
// 函数名称:Esp8266_Show_IP
// 输入参数:无
// 输出参数:无
// 函数功能:串口打印路由器分配的IP地址
/******************************************************************************/
void Esp8266_Show_IP(uint8 *ipData){
uint8 j;
for(j=10;j<28;j++){
displayMode;
Uart_Send_Char(*(ipData+j));
cmdMode;
}
displayMode;
Uart_Send_String("\r\n");
cmdMode;
}
/******************************************************************************/
// 函数名称:arryClear
// 输入参数:dataArry
// 输出参数:无
// 函数功能:数组元素清零
/******************************************************************************/
void arryClear(uint8 *dataArry){
uint8 i;
for(i=0;i<50;i++){
*(dataArry+i)=0;
}
}
/******************************************************************************/
// 函数名称:Uart_Int
// 输入参数:无
// 输出参数:无
// 函数功能:串口中断服务程序
// 主要两个功能:
// 1. 忙信号判断 - 单片机发送指令后,根据ESP8266反馈的信息判断指令是否完成
// 2. 任务判断 - 单片机根据从ESP8266模块收到的信息,执行相应的动作(ledOn/ledOff)
/******************************************************************************/
void Uart_Int(void) interrupt 4 {
static uint8 i = 0;
if(TI){
TI = 0;
led = ~led;
}
else{
RI = 0;
rcvTable[i]=SBUF;
if(i==50)i=0;
i++;
if(rcvTable[i-1]=='\n'){
i = 0;
if((rcvTable[0]=='O')&&(rcvTable[1]=='K')){
Uart_Cmd_Display("OK\r\n");
flag = 0x01;
}
else if((rcvTable[0]=='r')&&(rcvTable[1]=='e')&&(rcvTable[4]=='y')){
Uart_Cmd_Display("ready\r\n");
flag = 0x02;
}
else if((rcvTable[0]=='+')&&(rcvTable[10]=='I')&&(rcvTable[11]=='P')){
Esp8266_Show_IP(rcvTable);
}
else if((rcvTable[1]==',')&&(rcvTable[3]=='O')&&(rcvTable[4]=='N')){
displayMode;
Uart_Send_String("Link ");
Uart_Send_Char(rcvTable[0]);
Uart_Cmd_Display(":Connected"); //显示连接设备
}
else if((rcvTable[1]==',')&&(rcvTable[3]=='L')&&(rcvTable[4]=='O')){
displayMode;
Uart_Send_String("Link ");
Uart_Send_Char(rcvTable[0]);
Uart_Cmd_Display(" Closed"); //显示断开设备
}
}else{
if((rcvTable[0]=='+')&&(rcvTable[1]=='I')&&(rcvTable[2]=='P')&&(rcvTable[3]=='D')&&
(rcvTable[4]==',')&&(rcvTable[9]=='l')&&(rcvTable[10]=='e')&&(rcvTable[11]=='d')&&
(rcvTable[12]=='O')&&(rcvTable[13]=='f')&&(rcvTable[14]=='f')){
displayMode;
Uart_Send_String("Msg from Link ");
Uart_Send_Char(rcvTable[5]);
Uart_Cmd_Display(": ledOff"); //led off
led = 1;
arryClear(rcvTable);
i = 0;
}
if((rcvTable[0]=='+')&&(rcvTable[1]=='I')&&(rcvTable[2]=='P')&&(rcvTable[3]=='D')&&
(rcvTable[4]==',')&&(rcvTable[9]=='l')&&(rcvTable[10]=='e')&&(rcvTable[11]=='d')&&
(rcvTable[12]=='O')&&(rcvTable[13]=='n')){
displayMode;
Uart_Send_String("Msg from Link ");
Uart_Send_Char(rcvTable[5]);
Uart_Cmd_Display(": ledOn"); //led on
led = 0;
arryClear(rcvTable);
i = 0;
}
}
}
}