毕业设计之远程通信模块 ESP8266

本模块很多都是 从博客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发送信息
具体可参考博客

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/105615817