你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
aimejia 发布时间:2018-5-31 11:05
本帖最后由 aimejia 于 2018-5-31 11:16 编辑


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

首先就是将命令以字符数组的形式表达出来:
  1. [plain] view plain copy
  2. u8 at_cwmode[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x4D, 0x4F, 0x44, 0x45, 0x3D,   
  3.                   0x33, 0x0D, 0x0A};//AT+CWMODE=3(回车)  
  4. u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};//AT+RST(回车)  
  5. u8 at_cwsap[] = {0x41, 0x54, 0x2B, 0x43, 0x57, 0x53, 0x41, 0x50, 0x3D, 0x22,   
  6.          0x45, 0x53, 0x50, 0x38, 0x32, 0x36, 0x36, 0x5F, 0x54, 0x45,   
  7.          0x53, 0x54, 0x22, 0x2C, 0x22, 0x31, 0x32, 0x33, 0x34, 0x35,   
  8.          0x36, 0x37, 0x38, 0x39, 0x30, 0x22, 0x2C, 0x31, 0x2C, 0x33,   
  9.          0x0D, 0x0A};//AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  
  10. u8 at_cipmux[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x4D, 0x55, 0x58,   
  11.           0x3D, 0x31, 0x0D, 0x0A};//AT+CIPMUX=1(回车)  
  12. u8 at_sipserver[] = {0x41, 0x54, 0x2B, 0x43, 0x49, 0x50, 0x53, 0x45, 0x52, 0x56,   
  13.              0x45, 0x52, 0x3D, 0x31, 0x2C, 0x38, 0x30, 0x38, 0x30, 0x0D,   
  14.              0x0A};//AT+CIPSERVER=1,8080(回车)  
复制代码
这些命令是初始化相关的命令,从上往下执行即可完成WIFI模块上电后的初始化。在第一章中说过,在第一次初始化完成后,无需进行模式及WIFI名称及密码的配置,但是方便起见每次上电都进行一次配置,就无需判断是否是第一次初始化了。

接下来就是写初始化的函数了,需要说明的是初始化非常简单,不需要通过返回值判断初始化是否完成,故只进行了延时的操作:
  1. [plain] view plain copy
  2. void ESP8266_Init(void){  
  3.     int i = 0;  
  4.     for(i = 0; i < 13; i++){  
  5.         USART1->DR = at_cwmode[i];//送出AT+CWMODE=3(回车)  
  6.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  7.     }  
  8.     my_delay_ms(1000);  
  9.     for(i = 0; i < 8; i++){  
  10.         USART1->DR = at_rst[i];//送出AT+RST(回车)  
  11.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  12.     }  
  13.     my_delay_ms(2000);  
  14.     for(i = 0; i < 42; i++){  
  15.         USART1->DR = at_cwsap[i];//送出AT+CWSAP="ESP8266_TEST","1234567890",1,3(回车)  
  16.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  17.     }  
  18.     my_delay_ms(1000);  
  19.     for(i = 0; i < 13; i++){  
  20.         USART1->DR = at_cipmux[i];//送出AT+CIPMUX=1(回车)  
  21.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  22.     }  
  23.     my_delay_ms(1000);  
  24.     for(i = 0; i < 21; i++){  
  25.         USART1->DR = at_cipserver[i];//送出AT+CIPSERVER=1,8080(回车)  
  26.         while((USART1->SR & 0x40) == 0);//直到发送成功  
  27.     }  
  28. }  
复制代码
简单的说一下串口的两个寄存器,USART是通用同步异步收发器,USART1->DR是数据寄存器,说明如下:

11.png

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

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


2.png

寄存器和0x40进行与运算,是判断第6位中的数,当它为1时,发送完成,可进行接下来的操作。
在初始化完成后,可以进行数据的收发,在该项目中,需求是手机向单片机请求数据,故由手机端建立链接,单片机负责接收手机端发送的命令及反馈数据。USART1->SR的第5位说明如下:

3.png

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




转载自codingindex



收藏 评论2 发布时间:2018-5-31 11:05

举报

2个回答
wolfgang2015 回答时间:2018-5-31 12:33:26
GOOD!
lisd70 回答时间:2019-3-23 17:59:25
谢谢,已经明白的

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版