基于STM32的ESP8266使用教程(三)


写在前面:ESP8266的使用教程还剩一点,更完收工!上一节讲了通过十六进制显示得知发送数据的方式和接收数据的格式,本节将会说明通过单片机如何实现数据的收发,相关的代码和手册请看“基于STM32的ESP8266使用教程(四)(短篇)”。

首先就是将命令以字符数组的形式表达出来:

 

  1. u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D,   
  2.                   0x33, 0x0D, 0x0A};//AT+CWMODE=3(回车)  
  3. u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回车)  
  4. u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22,   
  5.          0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45,   
  6.          0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35,   
  7.          0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33,   
  8.          0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  
  9. u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58,   
  10.           0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回车)  
  11. u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56,   
  12.              0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D,   
  13.              0x0A};//AT+CIPSERVER=1,8080(回车)  
u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D, 
                  0x33, 0x0D, 0x0A};//AT+CWMODE=3(回车)
u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回车)
u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22, 
		 0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45, 
		 0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35, 
		 0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33, 
		 0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)
u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58, 
		  0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回车)
u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56, 
		     0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D, 
		     0x0A};//AT+CIPSERVER=1,8080(回车)

这些命令是初始化相关的命令,从上往下执行即可完成WIFI模块上电后的初始化。在第一章中说过,在第一次初始化完成后,无需进行模式及WIFI名称及密码的配置,但是方便起见每次上电都进行一次配置,就无需判断是否是第一次初始化了。

接下来就是写初始化的函数了,需要说明的是初始化非常简单,不需要通过返回值判断初始化是否完成,故只进行了延时的操作:

 

  1. void ESP8266_Init(void){  
  2.     int i = 0;  
  3.     for(i = 0; i < 13; i++){  
  4.         USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回车)  
  5.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  6.     }  
  7.     my_delay_ms(1000);  
  8.     for(i = 0; i < 8; i++){  
  9.         USART1->DR = at_rst[i];//送出AT+RST(回车)  
  10.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  11.     }  
  12.     my_delay_ms(2000);  
  13.     for(i = 0; i < 42; i++){  
  14.         USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  
  15.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  16.     }  
  17.     my_delay_ms(1000);  
  18.     for(i = 0; i < 13; i++){  
  19.         USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回车)  
  20.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  21.     }  
  22.     my_delay_ms(1000);  
  23.     for(i = 0; i < 21; i++){  
  24.         USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回车)  
  25.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  26.     }  
  27. }  
void ESP8266_Init(void){
	int i = 0;
	for(i = 0; i < 13; i++){
		USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回车)
		while((USART1->SR & 0x40) == 0);//直到发送成功
	}
	my_delay_ms(1000);
	for(i = 0; i < 8; i++){
		USART1->DR = at_rst[i];//送出AT+RST(回车)
		while((USART1->SR & 0x40) == 0);//直到发送成功
	}
	my_delay_ms(2000);
	for(i = 0; i < 42; i++){
		USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)
		while((USART1->SR & 0x40) == 0);//直到发送成功
	}
	my_delay_ms(1000);
	for(i = 0; i < 13; i++){
		USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回车)
		while((USART1->SR & 0x40) == 0);//直到发送成功
	}
	my_delay_ms(1000);
	for(i = 0; i < 21; i++){
		USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回车)
		while((USART1->SR & 0x40) == 0);//直到发送成功
	}
}

简单的说一下串口的两个寄存器,USART是通用同步异步收发器,USART1->DR是数据寄存器,说明如下:

将要发送的数据放在数据寄存器中即可。

USART1->SR是状态寄存器,说明如下:

 

  1. while((USART1->SR & 0x40) == 0);//直到发送成功  
while((USART1->SR & 0x40) == 0);//直到发送成功

寄存器和0x40进行与运算,是判断第6位中的数,当它为1时,发送完成,可进行接下来的操作。

 

在初始化完成后,可以进行数据的收发,在该项目中,需求是手机向单片机请求数据,故由手机端建立链接,单片机负责接收手机端发送的命令及反馈数据。USART1->SR的第5位说明如下:

于是通过以下代码判断接收到了数据:

 

  1. USART1->SR & 0x20  
USART1->SR & 0x20

再读取USART1->DR中的值即可。这里有一点要特别说明:WIFI收到的是字符串,若想要完整的接收字符串的内容,比较好的方法是通过USART1->SR的第5位产生中断,每产生一个中断意味着收到一个字符,将其保存到字符数组中。因为我的命令是一个字符,故在USART1->SR的第五位置高后进行延时,然后读取,根据收到数据的格式可知,最后一位就是我需要的命令。但是如果收到的是字符串,请各位通过前述方法获取完整字符串。

 

最后,通过“AT+CIPCLOSE=0”关闭链接。关于如何从单片机端建立链接请参考命令手册,将会在整理后上传至网盘。预告:接下来将会说明如何通过手机与单片机进行通信,时间未定。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM