日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 外设驱动库开发笔记27:ESP8266无线通讯驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們的物聯網產品所使用的平臺都支持無線通訊,而且無線通訊本身更的成本較低,受到大家的歡迎。在本篇文章中,我們將詳細討論并實現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;

2.1.2、對象初始化

我們知道,一個對象僅作聲明是不能使用的,我們需要先對其進行初始化,所以這里我們來考慮ESP8266無線通訊模塊對象的初始化函數。一般來說,初始化函數需要處理幾個方面的問題。一是檢查輸入參數是否合理;二是為對象的屬性賦初值;三是對對象作必要的初始化配置。據此我們設計ESP8266無線通訊模塊對象的初始化函數如下:

/*ESP8266對象初始化*/ void Esp8266Initialization(Esp8266ObjectObject *esp,??? //ESP8266對象Esp8266CWModeType cwMode,??? //WIFI模式Esp8266CIPModeType cipMode,? //傳輸模式,正常或透傳char *wifiName,????????????? //WIFI名稱char *wifiPassword,????????? //WIFI密碼ESP8266SendDataType send,??? //發送函數指針ESP8266DelaymsType delayms?? //毫秒延時函數) {char cwjap[50];char cwsap[50];if((esp==NULL)||(send==NULL)||(delayms==NULL)){return;}esp->SendData=send;esp->Delayms=delayms;esp->cwMode=cwMode;esp->cipMode=cipMode;esp->rxBuffer.lengthRecieved=0;ClearReciveBuffer(esp);//設置工作模式 1:station模式?? 2:AP模式? 3:兼容 AP+station模式if(Esp8266SendCommmand(esp,cwModeCmd[esp->cwMode],"OK",50)==Esp8266_TxFial){return;}//讓Wifi模塊重啟的命令if(Esp8266SendCommmand(esp,"AT+RST","OK",20)==Esp8266_TxFial){return;}esp->Delayms(3000);???????? //延時3S等待重啟成功if(esp->cwMode==Esp8266_StationMode){sprintf(cwjap,"AT+CWJAP_CUR=\"%s\",\"%s\"\r\n",wifiName,wifiPassword);//讓模塊連接上自己的路由if(Esp8266SendCommmand(esp,cwjap,"OK",600)==Esp8266_TxFial){return;}if(esp->cipMode==Esp8266_TransMode){if(Esp8266EnterTrans(esp)==Esp8266_TxFial){return;}}else{//=0:單路連接模式???? =1:多路連接模式if(Esp8266SendCommmand(esp,"AT+CIPMUX=0\r\n","OK",20)==Esp8266_TxFial){return;}}}else if(esp->cwMode==Esp8266_SoftAPMode){sprintf(cwsap,"AT+CWSAP_CUR=\"%s\",\"%s\"\r\n",wifiName,wifiPassword);//設置模塊的WIFI名和密碼if(Esp8266SendCommmand(esp,cwsap,"OK",600)==Esp8266_TxFial){return;}}else if(esp->cwMode==Esp8266_MixedMode){//尚未使用,有待添加} }

2.2、對象操作

我們已經完成了ESP8266無線通訊模塊對象類型的定義和對象初始化函數的設計。但我們的主要目標是獲取對象的信息,接下來我們還要實現面向ESP8266無線通訊模塊的各類操作。

對于ESP8266來說,發送命令主要是AT命令,這是與發送數據完全不同的操作,所以我們設計了一個專用于命令發送的操作函數。

/*ESP8266發送命令*/ static Esp8266TxStatusType Esp8266SendCommmand(Esp8266ObjectObject *esp,char *cmd,char *ack,uint16_t timeOut) {esp->SendData((unsigned char *)cmd, strlen((const char *)cmd));?????? //寫命令到網絡設備if(ack&&timeOut){while(timeOut--)????? //等待超時{if(ChecRecieveFinished(esp) == Esp8266_RxFinish)??? //如果數據接收完成{if(strstr((const char *)esp->rxBuffer.queue,ack) != NULL)?????? //如果檢索到關鍵詞{ClearReciveBuffer(esp);return Esp8266_RxSucceed;}}esp->Delayms(10);}}return Esp8266_TxFial; }

ESP8266在發送數據時,因發送模式的不同會有一定區別。在透傳模式下只需要發送數據就好了。而在普通模式下,需要先發送AT命令再發送發送數據。所以我們可設計數據發送函數如下:

/*ESP8266發送數據*/ void Esp8266SendData(Esp8266ObjectObject *esp,uint8_t *sData,uint16_t sSize) {if(esp->cipMode==Esp8266_TransMode){esp->SendData(sData,sSize);}else{char cmd[32];esp->Delayms(50);ClearReciveBuffer(esp);sprintf(cmd,"AT+CIPSEND=%d\r\n",sSize);if(Esp8266SendCommmand(esp,cmd, ">", 1)==Esp8266_RxSucceed)???? //收到‘>’時可以發送數據{esp->SendData(sData,sSize);}} }

3、驅動的使用

我們已經設計并實現了ESP8266無線通訊模塊的驅動程序。接下來我們將設計一個簡單的應用以驗證驅動的設計是否符合要求。

3.1、聲明并初始化對象

使用基于對象的操作我們需要先得到這個對象,所以我們先要使用前面定義的ESP8266無線通訊模塊對象類型聲明一個ESP8266無線通訊模塊對象變量,具體操作格式如下:

Esp8266ObjectObject esp;

聲明了這個對象變量并不能立即使用,我們還需要使用驅動中定義的初始化函數對這個變量進行初始化。這個初始化函數所需要的輸入參數如下:

?????? Esp8266ObjectObject *esp,??? //ESP8266對象

Esp8266CWModeType cwMode,??? //WIFI模式

Esp8266CIPModeType cipMode,? //傳輸模式,正常或透傳

char *wifiName,????????????? //WIFI名稱

char *wifiPassword,????????? //WIFI密碼

ESP8266SendDataType send,??? //發送函數指針

ESP8266DelaymsType delayms?? //毫秒延時函數

對于這些參數,對象變量我們已經定義了。而WIFI模式與傳輸模式均為枚舉,根據實際情況選擇就好了。同樣WIFI名稱和WIFI密碼更具實際使用情況輸入,注意時字符串就可以了。最主要的是我們需要定義幾個函數,并將函數指針作為參數。這幾個函數的類型如下:

/*定義ESP8266數據發送指針類型*/ typedef void (*ESP8266SendDataType)(uint8_t *sData,uint16_t sSize);/*延時操作指針*/ typedef void (*ESP8266DelaymsType)(volatile uint32_t nTime);???

對于這幾個函數我們根據樣式定義就可以了,具體的操作可能與使用的硬件平臺有關系。實際上我們主要需要關注的是串口發送函數。具體函數定義如下:

/*串口數據發送*/ static void SendDataForEsp8266(uint8_t *txData,uint16_t length) {HAL_UART_Transmit(&esp8266huart,txData,length,1000); }

對于延時函數我們可以采用各種方法實現。我們采用的STM32平臺和HAL庫則可以直接使用HAL_Delay()函數。于是我們可以調用初始化函數如下:

/*ESP8266對象初始化*/Esp8266Initialization(&esp,?????????????????? //ESP8266對象Esp8266_StationMode,??? //WIFI模式Esp8266_TransMode,????? //傳輸模式,正常或透傳wifiName,?????????????? //WIFI名稱wifiPassword,?????????? //WIFI密碼SendDataForEsp8266,???? //發送函數指針HAL_Delay?????????????? //毫秒延時函數);

3.2、基于對象進行操作

我們定義了對象變量并使用初始化函數給其作了初始化。接著我們就來考慮操作這一對象獲取我們想要的數據。我們在驅動中已經將獲取數據并轉換為轉換值的比例值,接下來我們使用這一驅動開發我們的應用實例。

/*ESP8266數據通訊*/ void Esp8266DataCommunication(void) {uint8_t sData[16]={0x10,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};Esp8266SendData(&esp,sData,16); }

4、應用總結

在這一篇中我們設計并實現了ESP8266無線模塊的驅動,并基于次驅動程序設計了一個簡單的驗證應用。測試結果是符合我們的預期的,說明我們設計的驅動沒有問題。

?????? 在使用驅動程序時需要注意,這一驅動只是實現了ESP8266的基本功能,所以要想實現更復雜的功能是可以在驅動基礎上擴展的。后續我們也會根據使用的需要進一步擴充驅動。當然這個驅動是基于AT指令來實現操作的,擴充這個驅動程序的功能也需要使用AT指令來實現。

?????? 本驅動程序在設計時,考慮使用串口中斷來接收數據,所以我們為對象設計了一個接收數據緩存結構。在設計應用時需在串口中斷服務函數中向緩存種添加數據。

歡迎關注:

?

總結

以上是生活随笔為你收集整理的外设驱动库开发笔记27:ESP8266无线通讯驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人成人在线 | 日韩区欧美区 | 中文字幕免费在线播放 | 1024欧美 | 日韩av网站在线播放 | 国产明星换脸xxxx色视频 | 久久久成 | 欧美日韩精品一区二区在线播放 | 看全黄大色黄大片美女人 | 亚洲无打码 | 日本少妇bbwbbw精品 | 日本在线黄色 | 日韩精品二区在线观看 | 欧美日日骚 | 欧美xxxx×黑人性爽 | 在线观看亚洲成人 | 亚洲精品高清视频 | 青青99 | 国产超碰人人 | 国产一区二区三区四 | 国产精品久久综合青草亚洲AV | 国产av第一区| 91丨porny丨在线| 小泽玛利亚在线 | av免费大全 | 久夜精品| 天天躁日日躁aaaaxxxx | 成长快手短视频在线观看 | av中字 | 精品视频在线观看一区 | 黄色精品在线 | 久久久久爱 | 国产日产精品一区二区三区 | 一级片在线观看视频 | 亚洲爽爽网 | 久久久精品久久久久久 | 国产一区二区在线观看免费 | 国产二三区| 很色的网站 | 内射国产内射夫妻免费频道 | 国偷自拍第113页 | 91中文字幕在线播放 | 成人 黄 色 免费播放 | 国产精品一区视频 | 91av色| 动漫精品一区一码二码三码四码 | 91成人小视频 | jizz韩国 | 性一交一乱一伧国产女士spa | 国产精品污www在线观看 | 国产伦人伦偷精品视频 | 亚洲av片一区二区三区 | 成人在线短视频 | 亚洲激情视频小说 | 国产一区二区三区免费看 | 另类专区欧美 | 18禁免费无码无遮挡不卡网站 | 日韩一区二区三区四区五区六区 | 亚洲欧美一区二区三区四区 | 成人爱爱视频 | 黑人操亚洲人 | 精品人妻人人做人人爽夜夜爽 | 一区二区天堂 | 在线免费观看黄网站 | 成人一级影视 | 国产精品国产三级国产在线观看 | 国产情侣激情 | 久久噜| 中文有码在线观看 | 依人成人综合网 | 欧美日本一区 | 日本精品在线一区 | 国产精品极品白嫩 | 这里只有久久精品 | 亚洲毛片在线看 | 人人人妻人人澡人人爽欧美一区 | 91亚洲一区二区 | 欧美高清二区 | 激情黄色小说网站 | 欧美一区二区三区在线播放 | 国产综合无码一区二区色蜜蜜 | 亚洲综合在线五月 | 国产精品边吃奶边做爽 | 色婷婷国产精品视频 | 免费一级特黄特色毛片久久看 | 国产拍拍拍 | 欧美精品v国产精品v日韩精品 | 中文字幕三级 | 天天干天天操天天操 | 麻豆乱淫一区二区三区 | 97久久人人 | 欧美做爰性生交视频 | 欧美在线一二三区 | 亚洲成人第一页 | 欧美日本在线播放 | 亚洲tv在线观看 | 一及黄色大片 | 欧美v日本| 在线一区二区三区四区 |