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