本模块很多都是 从博客ESP8266 WIFI模块学习之路
学习来的,在这里非常感谢这位博主博客技术的分享,非常感谢
原文链接:https://blog.csdn.net/XiaoCaiDaYong/article/details/82289276
局域网通信(只能在局域网中,不可以用GPRS)
编写一个手机APP,通过socket编程,与WIFI ESP8266进行通信
首先介绍AT指令,什么是AT指令?
AT指令就是控制WIFI模块进行相应操作的指令
AT+RST 重启WIFI模块
AT+CWMODE=3 ,将WIFI模块设置为station+ap模式
AT+CIPSERVER=1,8080 ,在该WIFI模块创建一个服务器
AT+CIOBAUD = 9600 , 设置波特率为9600
以下为单片机连上ESP8266模块下,手机与Android App的通信流程:
总结上图,App与51d单片机通信时,有四次数据流向:
①单片机通过引脚TXD给ESP8266发送数据,使ESP8266初始化,并让ESP8266处于服务器模式
②ESP8266也可通过AT+CIPSEND = id , length,id为连接的序号,length为发送的数据长度
>“通过串口获得单片机想往app发送的数据”
③app 使用socket给服务器(ESP8266)发送数据
④ESP8266通过TXD发送数据到RXD引脚上,此时RI置1,SBUF收到一个字节数据,便要执行中断服务程序,使得SBUF存放再已经定义好的数组中。
直接使用自己编写的Android App与单片机通信的过程:
①首先单片机先与WIFI模块建立连接,将TXD与WIFI模块的RXD,RXD与TXD连接
②在main函数中,对定时器进行初始化,要设置定时器定时器1,模式2,采用8位自动重装,TH1 = 0xfd;TL1 = 0xfd;设置9600波特率,
串口模式采用模式1,采用10位异步收发,波特率有定时器1产生
③当RI为1时,表明SBUF中已经收到一帧数据,在中断服务程序中,可以将该数据取出,并将RI清零
/**
void Uart_Init(void)用于在main函数中,先设置定时器1,用于产生波特率,设置串口中断模式1是,接收10位异步中断
**/
void Uart_Init(void)
{
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 =1;
EA = 1;
ES = 1;
}
/**
void WIFI_Init(void)用于在main函数中,用于对ESP8266模块发送初始化命令,让ESP8266作为一个服务器,等待来自Android通过socket发送过来的数据。
**/
void WIFI_Init(void)
{
ES = 0;
TI = 1;
printf("AT+RST\r\n");//将Esp8266进行置0
//printf("ABCDEFG");ABCDEFG这个的数据会直接通过TXD串口发送发到WIFI模块
LED();
ms_delay(1000) ;
printf("AT+CWMODE=3\r\n");//设置为Station+Ap模式
LED();
ms_delay(1000) ;
printf("AT+CIPMUX=1\r\n");//设置多连接模式
LED();
ms_delay(1000) ;
printf("AT+CIPSERVER=1,8080\r\n"); //设置为服务器模式,端口为8080
LED();
ms_delay(1000) ;
printf("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率
LED();
ms_delay(1000) ;
while(!TI);
TI = 0;
ES = 1;
}
/*
void Uart_Interrupt() interrupt 4,中断向量标号4,代表者串口中断
串口中断函数的作用:
每次RI = 1,说明单片机接收到一帧数据,已经放在了SBUF中,利用静态变量i,分别将SBUF中的数据放在一个数组中
若RI 不为0,说明单片已发送完数据,此时已被硬件置1,TI=1,在中断服务程序中需要将,TI = 0,清零
*/
void Uart_Interrupt() interrupt 4
{
static u8 i = 0;
if(RI == 1)
{
ES = 0; //关闭串口中断
RI = 0; //软件清零,收到是数据帧中的停止位,立马置1
Recive_table[i] = SBUF;//将数据缓冲寄存器中的数据放在Recive中
i++;
if(Recive_table[i-1] == '\n')
{
Recive_table[i] = '\0';
i = 0;
Recive_state =1 ;
}
ES = 1;// 打开串口中断
}
else
TI = 0;
}
/**
Wifi_ship()该函数根据已经从WIFI模块接收到的数据进行判断,当Recive_state为1时,说明已经把数据放到了全局变量数组Recive_table[]中,可以通过Recive_table[]中的数据进行控制单片机上做出响应的操作
由于ESP8266作为上位机(给单片机发送数据)时,给单片机发送的数据中前面包括的0~8没用的数据,所以从第9位开始,data才是有效数据,所以从第9位开始判断
“+IPD,x,x:data"
**/
void Wifi_ship()
{
delay1ms(10);
if(1 == Recive_state)
{
ES = 0;
if(Recive_table[9]=='1')//表明WIFI模块发送过来了一个“1”
{
to_state = 1;
}
else if(Recive_table[9]=='0')//表明WIFI模块发送过来了一个“0”
{
to_state = 0;
}
memset(Recive_table,'\0',20);
Recive_state = 0;
ES =1;
}
}
Android如何向WIFI8266发送信息呢:
java.net.socket已经封装好了接口:
①写一个线程类,继承thread类
在线程类中运行run方法中,通过socket类建立msocket连接
②使用输出流,往ESP8266发送信息
具体可参考博客