這篇文章主要是寫(xiě)一下在ESP32這里的實(shí)現(xiàn),因?yàn)槭荌DF下開(kāi)發(fā)的,所以需要下載一下SDK.
SDK支持的芯片SDK
下載解壓,沒(méi)毛病
這個(gè)是項(xiàng)目里面的main函數(shù)
因?yàn)閷?shí)現(xiàn)了斷電存儲(chǔ)這個(gè)功能,所以第一步一定是關(guān)于這個(gè)已經(jīng)存儲(chǔ)的參數(shù)讀取。在ESP32,使用非易失性存儲(chǔ) (NVS) 庫(kù)主要用于在 flash 中存儲(chǔ)鍵值格式的數(shù)據(jù)。
第一個(gè)注解直接在代碼中就有了顯示
NVS 庫(kù)在其操作中主要使用兩個(gè)實(shí)體:頁(yè)面和條目。頁(yè)面是一個(gè)邏輯結(jié)構(gòu),用于存儲(chǔ)部分的整體日志。邏輯頁(yè)面對(duì)應(yīng) flash 的一個(gè)物理扇區(qū),正在使用中的頁(yè)面具有與之相關(guān)聯(lián)的序列號(hào)。序列號(hào)賦予了頁(yè)面順序,較高的序列號(hào)對(duì)應(yīng)較晚創(chuàng)建的頁(yè)面。頁(yè)面有以下幾種狀態(tài):
空或未初始化
頁(yè)面對(duì)應(yīng)的 flash 扇區(qū)為空白狀態(tài)(所有字節(jié)均為 0xff)。此時(shí),頁(yè)面未存儲(chǔ)任何數(shù)據(jù)且沒(méi)有關(guān)聯(lián)的序列號(hào)。
活躍狀態(tài)
此時(shí) flash 已完成初始化,頁(yè)頭部寫(xiě)入 flash,頁(yè)面已具備有效序列號(hào)。頁(yè)面中存在一些空條目,可寫(xiě)入數(shù)據(jù)。任意時(shí)刻,至多有一個(gè)頁(yè)面處于活躍狀態(tài)。
寫(xiě)滿(mǎn)狀態(tài)
Flash 已寫(xiě)滿(mǎn)鍵值對(duì),狀態(tài)不再改變。用戶(hù)無(wú)法向?qū)憹M(mǎn)狀態(tài)下的頁(yè)面寫(xiě)入新鍵值對(duì),但仍可將一些鍵值對(duì)標(biāo)記為已擦除。
擦除狀態(tài)
未擦除的鍵值對(duì)將移至其他頁(yè)面,以便擦除當(dāng)前頁(yè)面。這一狀態(tài)僅為暫時(shí)性狀態(tài),即 API 調(diào)用返回時(shí),頁(yè)面應(yīng)脫離這一狀態(tài)。如果設(shè)備突然斷電,下次開(kāi)機(jī)時(shí),設(shè)備將繼續(xù)把未擦除的鍵值對(duì)移至其他頁(yè)面,并繼續(xù)擦除當(dāng)前頁(yè)面。
損壞狀態(tài)
頁(yè)頭部包含無(wú)效數(shù)據(jù),無(wú)法進(jìn)一步解析該頁(yè)面中的數(shù)據(jù),因此之前寫(xiě)入該頁(yè)面的所有條目均無(wú)法訪(fǎng)問(wèn)。相應(yīng)的 flash 扇區(qū)并不會(huì)被立即擦除,而是與其他處于未初始化狀態(tài)的扇區(qū)一起等待后續(xù)使用。這一狀態(tài)可能對(duì)調(diào)試有用。
main參數(shù)在此
這個(gè)是esp_err_t的封裝定義
其中NVS 分區(qū)不包含任何空頁(yè)。如果 NVS 分區(qū)被截?cái)?,則可能會(huì)發(fā)生這種情況。擦除整個(gè)分區(qū)并再次調(diào)用 nvs_flash_init。
初始化函數(shù)
意思是我先看看flash這塊初始化的情況,如果沒(méi)有任何空頁(yè)就重新擦除
ESP_ERR_NVS_NO_FREE_PAGES :如果 NVS 存儲(chǔ)不包含空頁(yè)(如果 NVS 分區(qū)被截?cái)啵赡軙?huì)發(fā)生這種情況)
就是這樣
函數(shù)的定義
我們接下來(lái)看這個(gè)讀取設(shè)置的函數(shù)
在一開(kāi)始看見(jiàn)的句柄:
句柄就好像你炒菜使用的鍋把,你其實(shí)是操作了鍋把,但是你對(duì)鍋有了影響
先出現(xiàn)了open函數(shù),從默認(rèn) NVS 分區(qū)打開(kāi)具有給定命名空間的非易失性存儲(chǔ)。
參數(shù)
esp_err_tnvs_open(const char *name, nvs_open_mode_topen_mode, nvs_handle_t*out_handle)
第一個(gè)參數(shù)
第二個(gè)
返回值
先關(guān)
后擦
在初始化
在寫(xiě)入
在代碼里面頻繁出現(xiàn)這個(gè)宏
定義在此。里面使用了一個(gè)函數(shù)
看不清了?
里面其實(shí)最終執(zhí)行的是這個(gè)函數(shù)
真的,無(wú)底洞
一開(kāi)始會(huì)打印詳細(xì)的配置信息
下面就是寫(xiě)入配置了
看一個(gè)字符串
其他的一樣
再看main,在你打開(kāi)成功的情況下,寫(xiě)入設(shè)置,否則就是else了
也就是讀取設(shè)置
這些函數(shù)都是ESP自己實(shí)現(xiàn)的:它們包含 malloc() 和 realloc() 實(shí)現(xiàn)的業(yè)務(wù)邏輯。因?yàn)槎迅?包裝原因,我們不希望這些成為公共 api,但是,因此它們沒(méi)有公開(kāi)定義。
上面的代碼,在末尾的進(jìn)行掃尾的工作
接著是日志等級(jí)的設(shè)置
函數(shù)的定義
最后是傳入一個(gè)結(jié)構(gòu)體
這個(gè)是WiFi的init函數(shù),先初始化一下底層的協(xié)議棧,這些東西沒(méi)有什么地方教你,就自己研究吧,這里有個(gè)有趣的寫(xiě)法就是,每一個(gè)函數(shù)使用CHECK來(lái)包裹,會(huì)及時(shí)告知編程者函數(shù)的執(zhí)行情況。之后局部的創(chuàng)建一個(gè)循環(huán)的時(shí)間,接著創(chuàng)建一個(gè)默認(rèn)的AP,也就是熱點(diǎn),下面我應(yīng)該有函數(shù)的截圖。然后就是WiFi默認(rèn)的所有參數(shù),在下面也有,之后使用init_config來(lái)重新將數(shù)據(jù)重塑。
將初始化的參數(shù)給這個(gè)函數(shù)來(lái)開(kāi)啟WiFi
之后為事件注冊(cè)一個(gè)循環(huán)
初始化函數(shù)底層協(xié)議
創(chuàng)建的事件循環(huán)
WIFI的兩種模式
一個(gè)IP的配置文件,IP,網(wǎng)絡(luò)掩碼
這個(gè)是AP的配置
簡(jiǎn)單的追一下,就可以知道這個(gè)東西的具體意思
反正我也沒(méi)有啥事情干,就繼續(xù)追,還可以看見(jiàn)支持的WiFi加密模式
SoftAP的成對(duì)密碼,群密碼將用此導(dǎo)出。密碼值從 WIFI _ CYPER _ TYPE _ TK IP 開(kāi)始有效,之前的枚舉值將被視為無(wú)效,將使用默認(rèn)密碼套件( TK IP + CCMP )。在軟 AP 模式下,有效的密碼套件是 WIFI _ CYPER _ TYPE _ TK IP 、 Wifi _ CIFIER _ PYPY _ CKIP _ CCKMP 和 WIFi _ CEPIR _ Type _ TC IP _ CCMP
先記住我們這里幾個(gè)提前寫(xiě)好有意義的東西
這個(gè)函數(shù)其實(shí)你查IDF是沒(méi)有的
memcpy() 用來(lái)復(fù)制內(nèi)存,其原型為:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 會(huì)復(fù)制 src 所指的內(nèi)存內(nèi)容的前 num 個(gè)字節(jié)到 dest 所指的內(nèi)存地址上。
memcpy() 并不關(guān)心被復(fù)制的數(shù)據(jù)類(lèi)型,只是逐字節(jié)地進(jìn)行復(fù)制,這給函數(shù)的使用帶來(lái)了很大的靈活性,可以面向任何數(shù)據(jù)類(lèi)型進(jìn)行復(fù)制。
wifi的接口模式
下面就開(kāi)始設(shè)置WiFi的模式,很簡(jiǎn)單
WiFi在不同的國(guó)家里面對(duì)功率的要求是不一樣的,這里是寫(xiě)了這個(gè)
就像這樣
傳入后開(kāi)啟WiFi
memset是計(jì)算機(jī)中C/C++語(yǔ)言初始化函數(shù)。作用是將某一塊內(nèi)存中的內(nèi)容全部設(shè)置為指定的值, 這個(gè)函數(shù)通常為新申請(qǐng)的內(nèi)存做初始化工作。
看這個(gè)代碼
把這個(gè)寫(xiě)入
后面這個(gè)DHCP啥的都設(shè)置一下
就是純互聯(lián)網(wǎng)了
看在文檔的位置
接下來(lái)是開(kāi)啟mDNS服務(wù)
mdns 即多播dns(Multicast DNS),mDNS主要實(shí)現(xiàn)了在沒(méi)有傳統(tǒng)DNS服務(wù)器的情況下使局域網(wǎng)內(nèi)的主機(jī)實(shí)現(xiàn)相互發(fā)現(xiàn)和通信,使用的端口為5353,遵從dns協(xié)議,使用現(xiàn)有的DNS信息結(jié)構(gòu)、名語(yǔ)法和資源記錄類(lèi)型。并且沒(méi)有指定新的操作代碼或響應(yīng)代碼。在局域網(wǎng)中,設(shè)備和設(shè)備之前相互通信需要知道對(duì)方的ip地址的,大多數(shù)情況,設(shè)備的ip不是靜態(tài)ip地址,而是通過(guò)dhcp協(xié)議動(dòng)態(tài)分配的ip 地址,如何設(shè)備發(fā)現(xiàn)呢,就是要mdns大顯身手,例如:現(xiàn)在物聯(lián)網(wǎng)設(shè)備和app之間的通信,要么app通過(guò)廣播,要么通過(guò)組播,發(fā)一些特定信息,感興趣設(shè)備應(yīng)答,實(shí)現(xiàn)局域網(wǎng)設(shè)備的發(fā)現(xiàn),當(dāng)然mdns 比這強(qiáng)大。
目前為止,2222個(gè)字了
看這幾個(gè)函數(shù)
我們的文件系統(tǒng)的初始化,個(gè)人認(rèn)為是web網(wǎng)頁(yè)
這個(gè)是文件系統(tǒng)的結(jié)構(gòu)體
具體的意思
這是防御性的代碼,確保文件系統(tǒng)就是可以使用
最后的函數(shù)
這個(gè)寫(xiě)法和上面一樣
ESP32 設(shè)備的控制模塊實(shí)現(xiàn)。FC 和地面之間的雙向鏈路。能處理 MSPv1、MSPv2、LTM 和 MAVLink。MSP & LTM 被解析并逐幀發(fā)送到地面。MAVLink 通過(guò)(完全透明)??梢耘c任何協(xié)議一起使用。
但是這個(gè)任務(wù)好復(fù)雜。。。
看看這個(gè)頭是啥?
C99新增inline關(guān)鍵字時(shí),它時(shí)唯一的函數(shù)說(shuō)明符(關(guān)鍵字extern和static時(shí)存儲(chǔ)類(lèi)別說(shuō)明符,可應(yīng)用于數(shù)據(jù)對(duì)象和函數(shù))。C11新增了第二個(gè)函數(shù)說(shuō)明符_Noreturn,表明調(diào)用完成后函數(shù)不返回主調(diào)函數(shù)。exit()函數(shù)時(shí)_Noreturn函數(shù)的一個(gè)示例,一旦調(diào)用exit()它不會(huì)再返回主調(diào)函數(shù)。注意,這與void返回類(lèi)型不同。void類(lèi)型的函數(shù)再執(zhí)行完畢后返回主調(diào)函數(shù),只是它不提供返回值。
_Noreturn的目的是告訴用戶(hù)和編譯器,這個(gè)特殊的函數(shù)不會(huì)把控制返回主調(diào)程序,告訴用于以免濫用該函數(shù),通知編譯器可優(yōu)化一些代碼。
這個(gè)任務(wù)里面寫(xiě)了串口和TCP
寫(xiě)入的參數(shù)
8位
校驗(yàn)
停止碼
硬件流控
看看串口
結(jié)構(gòu)體的配置
串口2
這個(gè)是IO配置
具體的使用
定義可以自己改
安裝一個(gè)串行口的驅(qū)動(dòng)程序
安裝 UART 驅(qū)動(dòng)程序并將 UART 設(shè)置為默認(rèn)配置。UART ISR 處理程序?qū)⒏郊拥竭\(yùn)行此函數(shù)的同一 CPU 內(nèi)核。
就這樣
后面還要看看這個(gè)串口到底是不是可以使用的。如果不行就把驅(qū)動(dòng)卸載,,拋出錯(cuò)誤。
沒(méi)有小錯(cuò)誤就可以使用了
函數(shù)在此
TCP看不懂了。。。上面這些應(yīng)該是初始化的參數(shù)
建立一個(gè)入口
<0的時(shí)候是跑錯(cuò)誤
bind我忘了,好像是什么端口也重要
最后是監(jiān)聽(tīng)的口,反正都沒(méi)有錯(cuò)就會(huì)返回一個(gè)正確的IP和Port
。。。寫(xiě)不下去了,函數(shù)太長(zhǎng)了,我知道也沒(méi)有人看到這里,我明天考慮要不要把剩下的任務(wù)寫(xiě)了、
不過(guò)在文章的末尾我還是要罵,金鵬太拉了,憑什么我的行李就得托運(yùn),氣死我了,為啥深圳航空就可以,我的300米就沒(méi)了。
臨下飛機(jī),我還以為碰上密接了,突然就不讓動(dòng)了,你再看這個(gè)圖
遠(yuǎn)一點(diǎn)看,像不像大夫在等著拉人
-
芯片
+關(guān)注
關(guān)注
456文章
51241瀏覽量
427498 -
SDK
+關(guān)注
關(guān)注
3文章
1045瀏覽量
46297 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17543
原文標(biāo)題:Dronebridge-ESP32的數(shù)字遙測(cè)實(shí)現(xiàn)
文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用ESP32實(shí)現(xiàn)藍(lán)牙通信
ESP32模組的主要特性
ESP32開(kāi)發(fā)套件 ESP32-DevKitC
ESP32-WROOM-32E和ESP32-WROOM-32UE模組的區(qū)別
![<b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模組的區(qū)別](https://file.elecfans.com/web1/M00/F2/3F/pIYBAGC18tmAYxq8AADiulFRJMg224.png)
esp32和arduino的區(qū)別,esp32能否替代arduino
ESP32模組能實(shí)現(xiàn)什么功能
ESP32 開(kāi)發(fā)之旅② Arduino For ESP32說(shuō)明
![<b class='flag-5'>ESP32</b> 開(kāi)發(fā)之旅② Arduino For <b class='flag-5'>ESP32</b>說(shuō)明](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 SDIO 使用教程
![<b class='flag-5'>ESP32</b> SDIO 使用教程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
esp32 例程 藍(lán)牙_wifi&藍(lán)牙MCU 該不該選ESP32
![<b class='flag-5'>esp32</b> 例程 藍(lán)牙_wifi&藍(lán)牙MCU 該不該選<b class='flag-5'>ESP32</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32系列芯片的規(guī)格
ESP8266/ESP32自動(dòng)下載原理
使用ESP32實(shí)現(xiàn)UDP通信的方法
ESP32到ESP32通過(guò)Internet進(jìn)行通信
![<b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過(guò)Internet進(jìn)行通信](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論