以下代码是基于51单片机的ESP8266WIFI模块和HTTP通信,使用AT指令进行,因为需要设计和后端进行交接,所以还有 //get请求/post请求略,可参看截图写出。
为了更好的验证模块是否在接收指令之后能够正确返回,即OK,我加入了字符串检验,即与OK匹配,如果匹配,可以通过串口助手接收OK的返回,如果任意一条没有返回,就会重复发送指令,直到成功。实际运用时,可以省略。
#include <reg52.h>
#include <string.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char Usart_Receive[20]={0};
unsigned char Usart_Cnt=0;
bit Usart_AT_flage;
u8 dat;
void Init(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void delay5ms(void) //误差 -0.000000000001us
{
unsigned char a,b;
for(b=15;b>0;b--)
for(a=152;a>0;a--);
}
void delay1s(void) //误差 -0.000000000227us
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void Sent_ZF(u8 dat) //发送一个字节
{
ES = 0;
TI=0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void AT_Send_String(u8 *string) //发送字符串
{
while(*string)
{
Sent_ZF(*string++);
delay5ms();
}
}
void ESP8266_Init()
{
while(1)
{
AT_Send_String("AT\r\n");
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
if(strstr(Usart_Receive, "OK"))
{
Usart_AT_flage = 0;
AT_Send_String("OK\r\n");
break;
}
}
}
while(1)
{
AT_Send_String("AT+CWMODE=1\r\n"); //配置WiFi模组工作模式为单STA模式,并把配置保存在flash
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
if(strstr(Usart_Receive, "OK"))
{
Usart_AT_flage = 0;
AT_Send_String("OK\r\n");
break;
}
}
}
while(1)
{
AT_Send_String("AT+CWJAP=\"guazhou\",\"123456789\"\r\n"); //!连接网络
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
if(strstr(Usart_Receive, "OK"))
{
Usart_AT_flage = 0;
AT_Send_String("OK\r\n");
break;
}
}
}
while(1)
{
AT_Send_String("AT+CIPSTART=\"TCP\",\"192.168.43.119\",8080\r\n"); //连接服务器
delay1s();
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
if(strstr(Usart_Receive, "OK"))
{
Usart_AT_flage = 0;
AT_Send_String("OK\r\n");
break;
}
}
}
}
void main()
{
Init();
ESP8266_Init();
while(1);
}
void InterruptUART(void) interrupt 4
{
if(RI)
{
RI=0;
Usart_Receive[Usart_Cnt]=SBUF;
Usart_Cnt++;
if(Usart_Receive[Usart_Cnt-2]=='\r'&&Usart_Receive[Usart_Cnt-1]=='\n') //检测倒数一二位
{
Usart_Cnt=0;
Usart_AT_flage=1;
}
else if(Usart_Cnt>20)
{
Usart_Cnt=0;
}
}
else
TI=0;
}
大概如下: