文章目录
一、esp8266初探
1、esp8266简介:
ESP8266EX,由乐鑫公司开发,提供了⼀套⾼度集成的 Wi-Fi SoC解决方案,其低功耗、紧凑设计和⾼稳定性可以满⾜⽤户的需求。ESP8266EX 拥有完整的且⾃成体系的 Wi-Fi ⽹络功能,既能够独⽴应⽤,也可以作为从机搭载于其他主机 MCU 运⾏。
说人话就是,ESP8266EX是一款WIFI芯片,同时,由于它内部集成了处理器之类的,所以它也可以作为一块单片机来使用(可以理解为低配版STM32)。
而我们平常聊起WIFI模块时提到的esp8266,则是这个:ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的超低功耗的UART-WiFi芯片的模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。
说人话就是,esp8266是利用ESP8266EX芯片加上外围电路做成的一块WIFI模块,可以直接拿来开发使用。
总结一下,esp8266无非就是块WIFI模块,有了它,我们的单片机设备就有了连入WIFI网络的能力,从而实现网络通信以及数据的无线传输。关于esp8266的介绍到此结束,后文提到的esp8266均指esp8266模组,即成品WIFI模块。
2、esp8266使用方式:
既然它是WIFI模块,那我们怎么用呢?怎么初始化?怎么配置?怎么和单片机建立连接进行通信?怎么与WIFI建立连接呢?伴随着一大串的问题,耐心往下看:
首先我们要知道一点,esp8266(以下简称8266)是没办法直接拿来就用的(你总不能指望它聪明到一通上电就自动破解你家WIFI密码然后连入WIFI),它需要配置工作模式,需要设置要连接的WIFI热点,需要提前告知它WIFI密码,之类的。总之,拿到8266的第一步就是,配置。
那么,8266如何配置呢?它有三种开发方式:AT指令、SDK开发、Arduino开发。
正如上文简介提到的,8266本身也可以作为单片机,所以自然而然的,我们可以通过“往单片机里烧录程序”的方式来实现8266的开发,这就要用到官方提供的专门的SDK进行开发,然后把自己写好的代码烧录进去(大家一般都把要烧录进去的东西叫做固件,具体我也不是很懂)。另外,由于SDK开发的不方便,于是有了Arduino开发的方式,更为简便。
而这两种开发方式我们这里都不讲,8266作为WIFI模块来使用的话,用AT指令来开发就足够了,而另两种开发方式适用于“除了实现WIFI功能本身还需要实现其他单片机功能”的情况。
于是我们进入正题,通过AT指令来配置8266。
什么是AT指令?
这里就不讲太官方的定义了,简单来说,AT指令就是与esp8266交流的语言,以AT作为开头,后面加上具体的指令。比如 AT+RST 就是一个重启的指令。前面我们提到,8266其实也是一块单片机,通电后其内部程序执行,就一直在等待我们向它发送AT指令,一旦受到指令,它就会执行相应的操作并返回相应的值。
通过何种方式发送AT指令?
我们已经知道向8266发送AT指令就能够与之进行交互,进而实现配置了。那么,我们要用什么通信方式发送AT指令呢?串口通信。
串口通信不熟的赶紧去补补!
这里我们先不用单片机与8266进行串口通信,我们直接使用usb转ttl用电脑与8266直接连接,然后通过串口调试助手来发送AT指令。(电脑usb采用的是usb电平,而所有的主控制芯片引脚(包括串口的RX,TX,普通IO口)都是TTL电平,所以我们要用到usb转ttl)
串口的连接方式就是RX连TX,TX连RX,GND连GND,VCC连VCC(我们给8266选择3.3v的供电就足够了),连接完成后插上电脑就可以通过操作串口调试助手来发送AT指令了。
喂,说了这么久,AT指令都有些啥?倒是告诉我们啊!
这里po一部分AT指令上来,具体更多AT指令请移步乐鑫公司AT指令的相关手册文档。
废话不多说,让我们直接动手操作一下,向串口发送 AT ,看看什么情况。
可以看到,8266返回“OK”,和表格里写明的反馈一致,说明模块运转正常。同样的我们可以尝试其它指令,比如AT+RESTORE指令,让8266恢复出厂设置(因为有一些设置会被写入flash里面,重启模块也会生效,所以我们能够通过恢复出厂设置来清除那些写入flash的操作)
可以看到,我们发送AT+RESTORE之后,模块返回一大堆的数据,并在最后返回ready,表明恢复出厂设置完成,随时准备好接受AT指令。
至此,我们已经了解了如何通过usb转ttl的方式用串口向8266发送AT指令了,而我们所讲的只是零碎的几个AT指令,并没有提到具体某种工作模式需要怎么配置,这个我们留到后面再讲。
.
.
.
二、STM32串口通信再探
前面一章节我们提到如何通过AT指令配置模块,方法是电脑用usb转ttl直接与模块相连实现串口通信。但是,实际开发过程中,我们不可能每次配置模块的时候都要通过串口调试助手逐次发送每条配置指令去初始化模块。高效的方法应该是把要发送的AT指令预先写入单片机,然后通过单片机与8266模块进行串口通信,来实现模块的配置。即:单片机→串口→esp8266
串口通信还没搞熟的赶紧再去补补!!这里再补充一点关于串口的知识,不需要的可以跳过。
1、printf()函数与串口中断函数
学过STM32串口通信的朋友,应该都知道我们能够通过printf()函数将一些提示信息打印到串口,进而由电脑端的串口调试助手接收到并显示到电脑屏幕上,方便我们调试程序。但是这具体是怎么实现的呢?那个printf()和串口通信有怎样的关联呢?
在usart.c文件中,我们经常会重定义fputc()函数,这段代码的作用就是,把c语言中的fputc()函数重新定义,并且把它的方向改向串口1。(printf是c语言标准化输出函数,在学c语言的时候,我们经常用printf函数来向电脑屏幕打印数据,最终在那个“小黑框”里输出打印信息。而这里的重定向,就是把信息输出的方向改为串口1,使得printf最终不再是向“小黑框”输出,而是把数据传输到串口。而我们的串口调试助手由于接到printf传输过去的信息,便显示到电脑屏幕上)
也就是说,在单片机中,printf函数是往串口发送数据的变相做法,其实质就是往串口发送数据。而从串口接收数据,我们知道要通过串口中断函数结合一定的判断可以实现,如下:
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u16 USART_RX_STA=0; //接收状态标记
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res = USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000)==