外设驱动库开发笔记27:ESP8266无线通讯驱动

【摘要】 我们的物联网产品所使用的平台都支持无线通讯,而且无线通讯本身更的成本较低,受到大家的欢迎。在本篇文章中,我们将详细讨论并实现ESP8266无线通讯模块的驱动。
1、功能概述
ESP8266是由乐鑫公司出品的一款物联网芯片,因为价格较低,性能稳定等收到很大关注。
该芯片可工作于三种WIFI模式下,分别是:station模式,AP模式以及混合模式,通过AT指令进行控制,显影…

我们的物联网产品所使用的平台都支持无线通讯,而且无线通讯本身更的成本较低,受到大家的欢迎。在本篇文章中,我们将详细讨论并实现ESP8266无线通讯模块的驱动。

1、功能概述

ESP8266是由乐鑫公司出品的一款物联网芯片,因为价格较低,性能稳定等收到很大关注。

该芯片可工作于三种WIFI模式下,分别是:station模式,AP模式以及混合模式,通过AT指令进行控制,显影的指令格式为:AT+CWMODE=<mode>mode的取值决定设定的模式:

mode1时,ESP8266工作于station 模式:ESP8266 模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。

mode2时,ESP8266工作于softAP 模式:ESP8266 模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制。

mode3时,ESP8266工作于softAP + station 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。

ESP8266拥有2种传输模式,即正常模式和透传模式。而传输模式的配置也是采用AT指令,具体格式为:AT+CIPMODE=<mode>。其中mode 取值0时,为普通传输模式;而mode 取值1时,为透传模式,仅支持TCP单连接和 UDP固定通信对端的情况。在正常模式下,每次发送数据前都必须先发送指令AT+CIPSEND=<param>。而在透传模式下,我们就不需要在每次发送数据前都发送指令AT+CIPSEND=<param>了,只需要发送一次AT+CIPSEND,之后发送的所有内容全部当成是数据了。但这又存在一个问题,我们想要发送命令该如何呢?那么就需要发送数据“+++”来退出透传模式。

ESP8266有几种不同的使用方式,最为常见的就是使用AT指令进行操作。ESP8266AT指令分为基础AT指令、WiFi功能AT指令和TCP/IP相关AT指令3个方面。这些指令从使用功能上讲可分为4类:

按照相应的格式发送不同的AT指令就可以实现ESP8266的数据通讯了。

2、驱动设计与实现

ESP8266无线通讯模块是常用的通讯模块,我们已经描述了其功能及通讯方式,接下来我们将设计并实现其驱动程序。

2.1、对象定义

在使用一个对象之前我们需要获得一个对象。同样的我们想要ESP8266无线通讯模块就需要先定义ESP8266无线通讯模块的对象。

2.1.1、对象的抽象

我们要得到ESP8266无线通讯模块对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下ESP8266无线通讯模块的对象。

先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑ESP8266无线通讯模块对象属性。我们考虑到ESP8266WIFI模式以及数据传输模式决定了其工作方式,在使用过程中有时我们也需要了解这两个模式的配置是什么,所以我们将其作为对象的属性已记录这两个模式配置。我们每一个ESP8266对象都需要接收数据,所以要有一个接受缓存区,我们定义了一个结构体变量来作为对象接收缓冲区。

接着我们还需要考虑ESP8266无线通讯模块对象的操作问题。我们想要使用ESP8266对象实现我们的功能,就需要发送命令或数据以及接收数据。串口接收数据我们一般使用中断方式,所以定义了缓冲区,不再需要特定的操作。串口发送消息需要实现,但这依赖于具体的硬件平台,所以我们将其作为对象的操作。此外,我们使用串口通讯时,需要控制时序就离不开延时函数,而延时操作一般都依赖于具体的软硬件平台,所以我们将延时函数作为对象的一个操作。

根据上述我们对ESP8266无线通讯模块的分析,我们可以定义ESP8266无线通讯模块的对象类型如下:


/*定义ESP8266对象*/
typedef struct Esp8266Object {
Esp8266CWModeType cwMode; //WIFI模式
Esp8266CIPModeType cipMode; //传输模式,正常或透传
struct EspRxBuffer{
uint8_t queue[Esp8266RxBufferLength]; //数据存储队列
uint8_t lengthRecieving; //正在接收的数据长度
uint8_t lengthRecieved; //已经接收的数据长度
}rxBuffer;
void (*SendData)(uint8_t *sData,uint16_t sSize);//数据发送函数指针
void (*Delayms)(volatile uint32_t nTime); //延时操作指针
}Esp8266ObjectObject;

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享