亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ESP32的無線數(shù)據(jù)采集系統(tǒng)設(shè)計 ①

        2021-01-15 03:27:58何棟煒
        關(guān)鍵詞:系統(tǒng)

        高 培, 何棟煒

        (1.福建商學(xué)院,福建 福州 350012;2.福建工程學(xué)院,福建 福州 350118)

        0 引 言

        無線數(shù)據(jù)采集是現(xiàn)代信息通信研究的重要組成部分。在很多領(lǐng)域,比如人員無法到達(dá)的偏僻環(huán)境、高腐蝕性及現(xiàn)場無法利用有線連接的環(huán)境,選擇有線數(shù)據(jù)采集傳輸系統(tǒng)顯然己無法滿足數(shù)據(jù)采集和傳輸?shù)男枰o線數(shù)據(jù)采集方式就成為了一種有效的替代方式,它與傳感器網(wǎng)絡(luò)、信息處理等作為現(xiàn)代數(shù)據(jù)監(jiān)測控制的基本技術(shù),在物聯(lián)網(wǎng)、工業(yè)控制、環(huán)境監(jiān)測等方面得到了越來越廣泛的應(yīng)用[1-2]。

        ESP32是樂鑫繼ESP8266后推出的一款集成Wifi功能的藍(lán)牙系統(tǒng)級芯片,基于ESP32的強大的處理能力、低功耗及高速穩(wěn)定的Wifi通信等特點。設(shè)計一套以ESP32主控芯片為核心的無線數(shù)據(jù)采集系統(tǒng),系統(tǒng)通過ESP32連接芯片STM32F407進(jìn)行數(shù)據(jù)采集,再使用無線Wifi模塊連接指定網(wǎng)絡(luò),通過Socket接口與上位機進(jìn)行通訊,將采集的數(shù)據(jù)傳輸給上位機系統(tǒng)。

        1 系統(tǒng)硬件設(shè)計

        無線數(shù)據(jù)采集系統(tǒng)硬件結(jié)構(gòu)如圖1所示,主要由數(shù)據(jù)源模塊(本設(shè)計中使用STM32F407ZG)、ESP32模塊及上位機三部分構(gòu)成。其中ESP32與數(shù)據(jù)源模塊通過SPI接口連接,本設(shè)計中ESP32模塊作為SPI Slave(被動式SPI設(shè)備),數(shù)據(jù)源模塊作為SPI Master(SPI主動設(shè)備);ESP32通過AP(無線訪問接入點),與上位機建立以太網(wǎng)絡(luò)連接。系統(tǒng)運行時,數(shù)據(jù)源模塊周期性地將數(shù)據(jù)發(fā)送給ESP32模塊,ESP32系統(tǒng)對所采集到的數(shù)據(jù)進(jìn)行緩存,在與上位機保持連接的同時將所采集到的數(shù)據(jù)通過WiFi網(wǎng)絡(luò)發(fā)送給上位機,上位機則對數(shù)據(jù)進(jìn)行存儲及實時顯示。

        圖1 無線數(shù)據(jù)采集系統(tǒng)硬件結(jié)構(gòu)圖

        ESP32作為SPI Slave使用時,只能等待SPI Master發(fā)起通信連接,并根據(jù)主機提供的時鐘信號接收數(shù)據(jù)。STM32F407是由ST(意法半導(dǎo)體)開發(fā)的一種高性能微控制器,作為SPI Master使用時,每個SPI 控制器可以使用多個片選信號(CS0~CS2)來連接多個被動式SPI設(shè)備。圖2為ESP32與STM32F407設(shè)備的通信電氣連接圖,其中CS為片選信號,SCK為時鐘信號,MOSI為主設(shè)備數(shù)據(jù)輸出線,MISO為從設(shè)備數(shù)據(jù)輸出。

        2 系統(tǒng)主程序設(shè)計

        ESP32的主程序設(shè)計主要包括兩個模塊,Wifi網(wǎng)絡(luò)配置模塊和線程與隊列模塊。其中Wifi網(wǎng)絡(luò)配置模塊負(fù)責(zé)網(wǎng)絡(luò)配置,線程與隊列模塊負(fù)責(zé)實現(xiàn)無線數(shù)據(jù)采集系統(tǒng)的主要功能,即:SPI數(shù)據(jù)采集與網(wǎng)絡(luò)數(shù)據(jù)發(fā)送[3]。主程序設(shè)計流程圖見圖3所示,具體包括以下幾個步驟:

        1.程序初始化:初始化NVS存儲和Wifi模式配置。

        2.連接網(wǎng)絡(luò),由Wifi網(wǎng)絡(luò)配置模塊連接到指定AP,并獲得AP分配的IP。

        3.創(chuàng)建三個線程:SPI數(shù)據(jù)接收線程用于調(diào)用SPI底層驅(qū)動來接收STM32F407發(fā)送的數(shù)據(jù)并進(jìn)行緩存;數(shù)據(jù)發(fā)送線程則創(chuàng)建Socket與上位機PC建立無線通信連接,并與SPI接收線程協(xié)同將數(shù)據(jù)發(fā)送到上位機;WEB服務(wù)器線程模塊為上位機提供信息查詢,使上位機可以通過瀏覽器獲取ESP32系統(tǒng)上的運行信息。

        圖2 ESP32與STM32F407設(shè)備的通信電氣連接圖

        圖3 系統(tǒng)主程序設(shè)計框圖

        下面具體介紹每個模塊的功能及程序設(shè)計。

        2.1 WIFI網(wǎng)絡(luò)配置模塊程序設(shè)計

        2.1.1 WIFI模式選擇

        ESP32芯片支持高速穩(wěn)定的WIFI通信,并支持三種模式:“AP”、“STA”、”AP + STA”。本設(shè)計采用STA模式,使用WIFI_init_sta()函數(shù)進(jìn)行STA模式配置[4]。進(jìn)入STA模式之前,需要配置WIFI賬號和密碼才能連接到指定AP。

        圖4 STA模式配置流程圖

        2.1.2 STA模式配置

        STA模式的配置總體流程如圖4所示,使用函數(shù)WIFI_init_sta()完成STA模式配置,具體包括以下工作:

        1.創(chuàng)建事件組標(biāo)志,用于識別WIFI連接過程中的各種標(biāo)志位。

        2.初始化硬件/軟件:使用“tcpip_adapter_init()”函數(shù)初始化TCP/IP適配層,清空之前保存的IP信息;使用“esp_event_loop_init()”初始化事件調(diào)度器,使事件回調(diào)函數(shù)能夠從初始位置判斷標(biāo)志位。使用“WIFI_init_config_t cfg=WIFI_INIT_CONFIG_DEFAULT()”語句初始化WIFI模塊的底層參數(shù)信息;使用“esp_WIFI_init(&cfg)”初始化WIFI驅(qū)動。

        3.對STA模式參數(shù)進(jìn)行配置,把路由器的WIFI賬號、密碼數(shù)據(jù)放入標(biāo)準(zhǔn)變量中。

        4.使“esp_WIFI_set_mode(WIFI_MODE_STA)”用來設(shè)置STA模式;esp_WiFi_set_config(ESP_IF_WIFI_STA, &WiFi_config)設(shè)置STA模式的配置信息;“esp_WIFI_start()”語句啟動WIFI狀態(tài)機。

        2.2 線程與隊列模塊程序設(shè)計

        線程與隊列模塊的程序設(shè)計框圖如圖5所示,主要包括三個線程和一個隊列的程序設(shè)計。三個線程分別是SPI數(shù)據(jù)采集線程、數(shù)據(jù)發(fā)送線程和WEB服務(wù)線程,另外為保證ESP32系統(tǒng)及時有效地進(jìn)行數(shù)據(jù)接收和發(fā)送,需要采用隊列來保持SPI數(shù)據(jù)采集線程和數(shù)據(jù)發(fā)送線程之間的數(shù)據(jù)同步[5]。

        圖5 線程與隊列模塊的程序設(shè)計框圖

        2.2.1 隊列設(shè)計

        使用FreeRTOS的隊列“queue”實現(xiàn)SPI數(shù)據(jù)采集線程和數(shù)據(jù)發(fā)送線程之間數(shù)據(jù)同步。

        隊列的基本原理是不同的線程任務(wù)或者中斷程序都能夠使用隊列將數(shù)據(jù)寫入,或者讀取數(shù)據(jù)。隊列實際上是一個固定大小的空間,任何線程任務(wù)都可以對它進(jìn)行讀寫。

        主程序中語句“queue = xQueueCreate(BLOCK_NUM, sizeof(char *));”用來創(chuàng)建隊列,F(xiàn)reeRTOS會分配固定的空間供線程讀寫數(shù)據(jù)。其中BLOCK_NUM設(shè)置可存儲的數(shù)據(jù)單元個數(shù)與緩沖區(qū)存儲空間個數(shù)一致。參數(shù)2設(shè)置數(shù)據(jù)單元的大小,線程間只需傳遞存儲空間的首地址即可。

        2.2.2 SPI數(shù)據(jù)采集線程程序設(shè)計

        ESP32通過SPI協(xié)議與STM32F407進(jìn)行數(shù)據(jù)傳輸,STM32F407間隔一定的時間向ESP32發(fā)送數(shù)據(jù)字節(jié)[6]。

        為實現(xiàn)SPI數(shù)據(jù)采集及兩個線程間的數(shù)據(jù)傳遞,同時考慮到ESP32有限的內(nèi)存及SPI底層驅(qū)動機制,程序設(shè)計采用一個環(huán)形緩沖區(qū)來存儲從SPI信號線上接收到的數(shù)據(jù),環(huán)形存儲器的大小為M * N Bytes,其中M是單個存儲空間的大小,N代表存儲空間個數(shù)。本次設(shè)計中ESP32的SPI底層驅(qū)動采用DMA機制,因此所建立的環(huán)形緩沖空間需要向系統(tǒng)申請DMA訪問用的內(nèi)存空間,需要用到heap_caps_malloc函數(shù), MALLOC_CAP_DMA,單個存儲空間大小的選擇最好根據(jù)每個周期SPI發(fā)送數(shù)據(jù)的長度選擇,即M為每個周期SPI發(fā)送數(shù)據(jù)長度的整數(shù)倍,同時為了保證網(wǎng)絡(luò)發(fā)送效率,M需要選擇盡量接近MTU大小1300(ESP32不支持分片,且分片影響效率),每次發(fā)送長度為64Bytes,因此選擇M為64*20=1280Bytes,存儲空間個數(shù)N方面,理論上選擇越大的N,系統(tǒng)運行中緩存空間越大,SPI接收出現(xiàn)錯誤的概率越小,但由于ESP32的內(nèi)存空間有限,N過大會影響其他線程,通過實驗選擇N為5。

        SPI數(shù)據(jù)采集程序主要包括:SPI驅(qū)動初始化,環(huán)形緩沖區(qū)初始化,SPI Slave讀取程序。SPI Slave驅(qū)動程序通過操作DMA和SPI控制器與SPI Master進(jìn)行通信,同時對應(yīng)用程序提供訪問接口,詳細(xì)的數(shù)據(jù)結(jié)構(gòu)及程序設(shè)計可參考文獻(xiàn)[7]。

        SPI Slave讀取程序流程為:

        1.循環(huán)調(diào)用spi_slave_transmit將當(dāng)前緩沖區(qū)以及接收數(shù)據(jù)信息通過spi_slave_interface_config_t結(jié)構(gòu)體指定給底層驅(qū)動,并啟動SPI接收,線程進(jìn)入掛起狀態(tài)等待接收結(jié)束。

        2.接收結(jié)束后,線程繼續(xù)運行,將接收到的數(shù)據(jù)所在存儲空間的首地址通過xQueueSendToBack加入隊列。

        3.將當(dāng)前緩沖區(qū)切換為環(huán)形緩沖區(qū)的下一存儲空間,重復(fù)1。

        2.2.3 數(shù)據(jù)發(fā)送線程程序設(shè)計

        在STA模式下,Socket接口與上位機有兩種建立通信連接的方式,即“TCP模式”和“UDP模式”。由于TCP模式傳輸?shù)臄?shù)據(jù)不容易丟失,而UDP模式傳輸?shù)臄?shù)據(jù)容易出現(xiàn)錯誤丟失情況,因此本次連接采用TCP模式。

        當(dāng)ESP32連接上WIFI并獲取到AP分配的IP后,即可通過Socket接口與上位機建立通訊,發(fā)送獲取到的數(shù)據(jù)。Socket是ESP32和上位機之間建立通訊的接口。ESP32主動對上位機發(fā)起連接請求,上位機在連接前開啟監(jiān)聽的Socket接口,以實時監(jiān)聽客戶端的請求,連接建立完成后,ESP32和上位機即可進(jìn)行通信。ESP32與上位機通信連接建立流程如圖6所示:

        主要步驟及具體程序描述如下[8]:

        1.定義以下套接字描述符:“sock_fd”監(jiān)聽套接口描述符;“client_fd”數(shù)據(jù)傳輸套接口描述符;“bind_fd”綁定IP/端口套接口描述符。定義本地地址變量“my_addr”,用于保存本地IP與端口號;定義目標(biāo)地址變量“client_addr”,用于保存目標(biāo)機IP及端口號。

        2. 使用socket(AF_INET, SOCK_STREAM, 0)語句創(chuàng)建Socket監(jiān)聽。

        圖6 ESP32與上位機通信連接建立流程圖

        3. 將本地的IP、端口號、協(xié)議類型與Socket綁定,主要程序如下:

        my_addr.sin_family = AF_INET;

        my_addr.sin_port = htons(PORT);

        my_addr.sin_addr.s_addr=htonl(INADDR_ANY);

        bind_fd = bind(sock_fd,(struct sockaddr *)&my_addr,sizeof(my_addr));

        4. 開啟監(jiān)聽Socket使系統(tǒng)處于監(jiān)聽狀態(tài),等待上位機的連接請求,使用語句為“l(fā)isten(sock_fd,10)”進(jìn)行監(jiān)聽。

        5. 接受上位機的連接請求,使用accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size)語句建立通信socket。

        6. 確定連接建立后,調(diào)用xQueueReceive讀取隊列,如果隊列為空,線程掛起直至隊列非空。如果隊列為非空,從隊列中獲取數(shù)據(jù)存儲空間首地址。

        7. 使用write(newconn, (char *)tmp, BUF_SIZE)向上位機發(fā)送數(shù)據(jù)。如果發(fā)送失敗就會返回-1,程序進(jìn)入報錯停止發(fā)送程序;如果發(fā)送數(shù)據(jù)成功會將實際發(fā)送出的字符數(shù)返回,程序回到6。

        2.2.4 Web服務(wù)器線程程序設(shè)計

        Web 是一種網(wǎng)絡(luò)通信協(xié)議,是一種在單個 TCP 連接上進(jìn)行全雙工通訊的協(xié)議。如圖7所示,ESP32連接上WIFI后,會創(chuàng)建一個WEB服務(wù)器線程,該線程用于為上位機提供信息查詢。當(dāng)上位機發(fā)送HTTP請求時,系統(tǒng)會將從SPI接收的數(shù)據(jù)和發(fā)送成功的數(shù)據(jù)信息返回到上位機的瀏覽器中,方便用戶查詢在數(shù)據(jù)通信過程中是否存在報文丟失。

        圖7 WEB服務(wù)線程工作過程示意圖

        圖8 硬件設(shè)備連接圖

        圖9 ESP32連接至WIFI過程圖

        WEB服務(wù)線程程序設(shè)計主要步驟如下[9]:

        1.創(chuàng)建Socket連接,并綁定本地IP地址和80端口,用于監(jiān)聽上位機的連接請求。當(dāng)上位機發(fā)出連接請求后,系統(tǒng)會與上位機建立連接,并建立通信socket。創(chuàng)建Socket和建立連接的具體程序設(shè)計可參考3.2.3節(jié)。

        2.ESP32讀取上位機發(fā)送的請求數(shù)據(jù),將其放在recv_buffer的字符型數(shù)組中,通過語句strncmp((char *)recv_buffer, "GET", 3) == 0判斷請求報文前三個字符是否為“GET”,如果是的話會執(zhí)行如下命令:

        sprintf(disp,"spi:%d;tcp:%d! ",spi_count,tcp_count);

        strcpy(htmldata,htmldata_h); strcat(htmldata,disp); strcat(htmldata,htmldata_t);

        write(conn, htmldata, strlen(htmldata));

        其中disp為自定義的字符型數(shù)組,用于存放返回的數(shù)據(jù);spi_count為系統(tǒng)統(tǒng)計接收到的SPI數(shù)據(jù),tcp_count為系統(tǒng)發(fā)送給上位機的數(shù)據(jù);htmldata為長度為200的字符型數(shù)組;htmldata_h和htmldata_t定義如下:

        char

        charhtmldata_t[] ="《/html>";

        最后通過write函數(shù)將加上HTML標(biāo)簽的數(shù)據(jù)返回到上位機的瀏覽器中顯示出來。對于需要返回的其它信息也可以由用戶自行定義。

        圖10 上位機接收數(shù)據(jù)繪圖

        圖11 上位機接收數(shù)據(jù)圖

        3 實驗驗證

        本次實驗主要通過兩個開發(fā)板進(jìn)行系統(tǒng)搭建,一塊是ESP32-DevKitC,開發(fā)環(huán)境是Ai-ThinkerIDEV1.0,另一塊是STM32F407,兩個開發(fā)板之間的SPI連接原理如圖2所示。由于我們只需要進(jìn)行單向發(fā)送,所以除去VCC和接地線,只需要連接三條線。用杜邦線根據(jù)電路接線圖連接好實物圖,完成后的硬件設(shè)備連接如圖8所示。

        圖中每種顏色的杜邦線對應(yīng)條接線,黑色為地線,綠色為串行時鐘信號線,橙色為MOSI數(shù)據(jù)信號線,黃色為片選信號線。

        圖12 WEB查詢系統(tǒng)信息圖

        實驗主要驗證ESP32與Wifi的連接是否正常,以及是否能正常接收SPI數(shù)據(jù)并通過WiFi發(fā)送數(shù)據(jù)到上位機,同時計算數(shù)據(jù)在傳輸?shù)倪^程中的速率及丟包率。

        首先測試ESP32與WiFi的連接,可以采用串口調(diào)試工具打印ESP32輸出的信息,明確ESP32當(dāng)前的運行連接狀態(tài);系統(tǒng)連接上電后即進(jìn)入了準(zhǔn)備狀態(tài),按下ESP32 RST鍵,ESP32會自動連接WiFi。通過串口調(diào)試工具可以看到整個WiFi連接過程,如圖9所示

        通過圖9可以看到ESP32系統(tǒng)首先會進(jìn)行STA模式配置,當(dāng)完成STA模式配置后會輸出當(dāng)前的用戶名和密碼,接下來AP會為其分配IP地址。當(dāng)打印獲取到IP地址的時候表示ESP32連接AP成功,AP分配的IP地址是192.168.2.30。通過串口打印的提示信息可以看到ESP32系統(tǒng)的準(zhǔn)備過程,其中spi_task on表示SPI數(shù)據(jù)接收線程開啟;Data_trans_task on表示數(shù)據(jù)發(fā)送線程開啟;Data_trans_task listen和Initial_SPI Done表示ESP32系統(tǒng)開啟了SPI的監(jiān)聽端口并完成SPI初始化配置;Http_task on表示W(wǎng)EB服務(wù)線程開啟; Data_trans_task accept表示ESP32系統(tǒng)與上位機已經(jīng)建立了TCP連接并且可以開始進(jìn)行數(shù)據(jù)傳輸。

        通過圖10可以看到上位機接收的數(shù)據(jù)總字節(jié)數(shù)為38400Bytes,并且數(shù)據(jù)從0開始遞增到2后又重置為0。上位機將接收到的數(shù)據(jù)以后綴為.dat的文件進(jìn)行存儲,打開文件可以看到具體的接收數(shù)據(jù),如圖11所示,在不考慮浮點數(shù)存儲誤差的情況下,每個數(shù)據(jù)間隔0.001。 最后,為了驗證發(fā)送過程中的成功率,可以通過瀏覽器訪問ESP32系統(tǒng)獲取接收和發(fā)送的數(shù)據(jù)量,如圖12所示:

        其中spi:384000Bytes表示ESP32系統(tǒng)從STM32F407系統(tǒng)接收到的SPI數(shù)據(jù)為384000Bytes。tcp:384000Bytes表示ESP32系統(tǒng)從TCP連接發(fā)送給上位機的數(shù)據(jù),ESP32系統(tǒng)接收的數(shù)據(jù)量和發(fā)送出去的數(shù)據(jù)量一致,并且通過圖10上位機軟件可以看到上位機接收到的數(shù)據(jù)總量也為384000Bytes,ESP32系統(tǒng)通過Wifi發(fā)送給上位機的數(shù)據(jù)與上位機接收到的數(shù)據(jù)一致,說明數(shù)據(jù)在無線傳輸?shù)倪^程中不存在丟包,丟包率為0%。另外從圖中可以看到數(shù)據(jù)接收時間為6.01S,通過計算可知數(shù)據(jù)傳輸速率為62.5KB/s(500Kbps)。實驗結(jié)果表明本設(shè)計的系統(tǒng)可行有效。

        4 結(jié) 論

        以STM32F407連接ESP32,ESP32通過WIFE連接上位機為例,針對ESP32無線網(wǎng)絡(luò)配置、數(shù)據(jù)接收和發(fā)送程序進(jìn)行了詳細(xì)的設(shè)計與說明,同時對ESP32系統(tǒng)的WEB服務(wù)程序進(jìn)行設(shè)計,以方便上位機進(jìn)行信息查詢。最后通過硬件平臺測試來驗證應(yīng)用程序有效性和驅(qū)動性能。實驗結(jié)果表明,基于ESP32的無線數(shù)據(jù)采集傳輸系統(tǒng)程序設(shè)計合理,易于使用,但性能有待進(jìn)一步優(yōu)化和改進(jìn)。未來將進(jìn)一步優(yōu)化硬件及軟件設(shè)計,提高抗干擾及數(shù)據(jù)傳輸效率,提高系統(tǒng)性能。

        猜你喜歡
        系統(tǒng)
        Smartflower POP 一體式光伏系統(tǒng)
        WJ-700無人機系統(tǒng)
        ZC系列無人機遙感系統(tǒng)
        北京測繪(2020年12期)2020-12-29 01:33:58
        基于PowerPC+FPGA顯示系統(tǒng)
        基于UG的發(fā)射箱自動化虛擬裝配系統(tǒng)開發(fā)
        半沸制皂系統(tǒng)(下)
        FAO系統(tǒng)特有功能分析及互聯(lián)互通探討
        連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
        一德系統(tǒng) 德行天下
        PLC在多段調(diào)速系統(tǒng)中的應(yīng)用
        人妻无码ΑV中文字幕久久琪琪布| 日本精品一区二区高清| 亚洲精一区二区三av| 日韩乱码人妻无码系列中文字幕| 国模冰莲自慰肥美胞极品人体图 | 久久亚洲av成人无码电影| 老妇女性较大毛片| 69久久夜色精品国产69| 亚洲AV无码一区二区三区人| 国产精品无码久久AⅤ人妖| 日日麻批免费高清视频| 亚洲麻豆视频免费观看| 无码丰满熟妇一区二区| 国产第一草草影院| 91精品日本久久久久久牛牛| 亚洲一区二区三区99区| 偷拍一区二区盗摄视频| 人妻丰满熟妇aⅴ无码| 夜夜揉揉日日人人青青| 国产成人亚洲精品无码mp4| 这里只有久久精品| 亚洲国产色图在线视频| 人妻少妇偷人精品视频| 国产成人亚洲综合| 日韩av高清无码| 国产aⅴ丝袜旗袍无码麻豆| 毛片在线播放亚洲免费中文网| 亚洲人成在线播放网站| 被群cao的合不拢腿h纯肉视频| 97久久综合区小说区图片专区| 精品人妻一区二区三区狼人| 人妻精品视频一区二区三区| 手机福利视频| 午夜一级韩国欧美日本国产 | 中文无码人妻有码人妻中文字幕 | 青草久久婷婷亚洲精品| 男女上下猛烈啪啪免费看| 人妻丰满av无码中文字幕| 人妻av在线一区二区三区| 97精品国产一区二区三区| 中字幕久久久人妻熟女 |