衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ESP32的數字遙測實現

云深之無跡 ? 來源:云深之無跡 ? 作者:云深之無跡 ? 2022-08-08 16:20 ? 次閱讀

這篇文章主要是寫一下在ESP32這里的實現,因為是IDF下開發的,所以需要下載一下SDK.

356bed7c-1654-11ed-ba43-dac502259ad0.png

SDK支持的芯片SDK

359a6b20-1654-11ed-ba43-dac502259ad0.png

下載解壓,沒毛病

35c7941a-1654-11ed-ba43-dac502259ad0.png

這個是項目里面的main函數

因為實現了斷電存儲這個功能,所以第一步一定是關于這個已經存儲的參數讀取。在ESP32,使用非易失性存儲 (NVS) 庫主要用于在 flash 中存儲鍵值格式的數據。

35ed3fa8-1654-11ed-ba43-dac502259ad0.png

第一個注解直接在代碼中就有了顯示

NVS 庫在其操作中主要使用兩個實體:頁面和條目。頁面是一個邏輯結構,用于存儲部分的整體日志。邏輯頁面對應 flash 的一個物理扇區,正在使用中的頁面具有與之相關聯的序列號。序列號賦予了頁面順序,較高的序列號對應較晚創建的頁面。頁面有以下幾種狀態:

空或未初始化

頁面對應的 flash 扇區為空白狀態(所有字節均為 0xff)。此時,頁面未存儲任何數據且沒有關聯的序列號。

活躍狀態

此時 flash 已完成初始化,頁頭部寫入 flash,頁面已具備有效序列號。頁面中存在一些空條目,可寫入數據。任意時刻,至多有一個頁面處于活躍狀態。

寫滿狀態

Flash 已寫滿鍵值對,狀態不再改變。用戶無法向寫滿狀態下的頁面寫入新鍵值對,但仍可將一些鍵值對標記為已擦除。

擦除狀態

未擦除的鍵值對將移至其他頁面,以便擦除當前頁面。這一狀態僅為暫時性狀態,即 API 調用返回時,頁面應脫離這一狀態。如果設備突然斷電,下次開機時,設備將繼續把未擦除的鍵值對移至其他頁面,并繼續擦除當前頁面。

損壞狀態

頁頭部包含無效數據,無法進一步解析該頁面中的數據,因此之前寫入該頁面的所有條目均無法訪問。相應的 flash 扇區并不會被立即擦除,而是與其他處于未初始化狀態的扇區一起等待后續使用。這一狀態可能對調試有用。

3614ff52-1654-11ed-ba43-dac502259ad0.png

main參數在此

363f5e78-1654-11ed-ba43-dac502259ad0.png

這個是esp_err_t的封裝定義

其中NVS 分區不包含任何空頁。如果 NVS 分區被截斷,則可能會發生這種情況。擦除整個分區并再次調用 nvs_flash_init。

365497e8-1654-11ed-ba43-dac502259ad0.png

初始化函數

368173d0-1654-11ed-ba43-dac502259ad0.png

意思是我先看看flash這塊初始化的情況,如果沒有任何空頁就重新擦除

ESP_ERR_NVS_NO_FREE_PAGES :如果 NVS 存儲不包含空頁(如果 NVS 分區被截斷,可能會發生這種情況)

36a04ba2-1654-11ed-ba43-dac502259ad0.png

就是這樣

36bf2fb8-1654-11ed-ba43-dac502259ad0.png

函數的定義

36e33854-1654-11ed-ba43-dac502259ad0.png

我們接下來看這個讀取設置的函數

在一開始看見的句柄:

370bbd4c-1654-11ed-ba43-dac502259ad0.png

句柄就好像你炒菜使用的鍋把,你其實是操作了鍋把,但是你對鍋有了影響

372acb1a-1654-11ed-ba43-dac502259ad0.png

先出現了open函數,從默認 NVS 分區打開具有給定命名空間的非易失性存儲。

375a842c-1654-11ed-ba43-dac502259ad0.png

參數

esp_err_tnvs_open(const char *name, nvs_open_mode_topen_mode, nvs_handle_t*out_handle)

378c02fe-1654-11ed-ba43-dac502259ad0.png

第一個參數

37a5c8e2-1654-11ed-ba43-dac502259ad0.png

第二個

37c70746-1654-11ed-ba43-dac502259ad0.png

返回值

37e5a4c6-1654-11ed-ba43-dac502259ad0.png

380d2866-1654-11ed-ba43-dac502259ad0.png

先關

后擦

在初始化

在寫入

382814d2-1654-11ed-ba43-dac502259ad0.png

在代碼里面頻繁出現這個宏

384b4d62-1654-11ed-ba43-dac502259ad0.png

定義在此。里面使用了一個函數

386ff9b4-1654-11ed-ba43-dac502259ad0.png

看不清了?

388a46fc-1654-11ed-ba43-dac502259ad0.png

里面其實最終執行的是這個函數

38b7822a-1654-11ed-ba43-dac502259ad0.png

真的,無底洞

38e002d6-1654-11ed-ba43-dac502259ad0.png

390188fc-1654-11ed-ba43-dac502259ad0.png

391ddbba-1654-11ed-ba43-dac502259ad0.png

一開始會打印詳細的配置信息

3946cea8-1654-11ed-ba43-dac502259ad0.png

下面就是寫入配置了

398a9b10-1654-11ed-ba43-dac502259ad0.png

看一個字符串

39c019c0-1654-11ed-ba43-dac502259ad0.png

其他的一樣

39d76490-1654-11ed-ba43-dac502259ad0.png

再看main,在你打開成功的情況下,寫入設置,否則就是else了

也就是讀取設置

3a0e2980-1654-11ed-ba43-dac502259ad0.png

3a2be83a-1654-11ed-ba43-dac502259ad0.png

這些函數都是ESP自己實現的:它們包含 malloc() 和 realloc() 實現的業務邏輯。因為堆跟蹤 包裝原因,我們不希望這些成為公共 api,但是,因此它們沒有公開定義。

3a4a2f52-1654-11ed-ba43-dac502259ad0.png

上面的代碼,在末尾的進行掃尾的工作

3a63ee06-1654-11ed-ba43-dac502259ad0.png

接著是日志等級的設置

3a7c2fa2-1654-11ed-ba43-dac502259ad0.png

函數的定義

3a97db12-1654-11ed-ba43-dac502259ad0.png

最后是傳入一個結構體

3abc6630-1654-11ed-ba43-dac502259ad0.png

這個是WiFi的init函數,先初始化一下底層的協議棧,這些東西沒有什么地方教你,就自己研究吧,這里有個有趣的寫法就是,每一個函數使用CHECK來包裹,會及時告知編程者函數的執行情況。之后局部的創建一個循環的時間,接著創建一個默認的AP,也就是熱點,下面我應該有函數的截圖。然后就是WiFi默認的所有參數,在下面也有,之后使用init_config來重新將數據重塑。

3ae30b82-1654-11ed-ba43-dac502259ad0.png

將初始化的參數給這個函數來開啟WiFi

3b02e29a-1654-11ed-ba43-dac502259ad0.png

之后為事件注冊一個循環

3b3a22d2-1654-11ed-ba43-dac502259ad0.png

初始化函數底層協議

3b5ef468-1654-11ed-ba43-dac502259ad0.png

創建的事件循環

3b7ec536-1654-11ed-ba43-dac502259ad0.png

WIFI的兩種模式

3ba349f6-1654-11ed-ba43-dac502259ad0.png

一個IP的配置文件,IP,網絡掩碼

3bc5ebd2-1654-11ed-ba43-dac502259ad0.png

這個是AP的配置

3beb8324-1654-11ed-ba43-dac502259ad0.png

簡單的追一下,就可以知道這個東西的具體意思

3c10b7a2-1654-11ed-ba43-dac502259ad0.png

反正我也沒有啥事情干,就繼續追,還可以看見支持的WiFi加密模式

3c3b2a82-1654-11ed-ba43-dac502259ad0.png

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

3c646b68-1654-11ed-ba43-dac502259ad0.png

先記住我們這里幾個提前寫好有意義的東西

3c855c2e-1654-11ed-ba43-dac502259ad0.png

這個函數其實你查IDF是沒有的

memcpy() 用來復制內存,其原型為:

void * memcpy ( void * dest, const void * src, size_t num );

memcpy() 會復制 src 所指的內存內容的前 num 個字節到 dest 所指的內存地址上。

memcpy() 并不關心被復制的數據類型,只是逐字節地進行復制,這給函數的使用帶來了很大的靈活性,可以面向任何數據類型進行復制。

3ca72aa2-1654-11ed-ba43-dac502259ad0.png

wifi的接口模式

3cb98be8-1654-11ed-ba43-dac502259ad0.png

下面就開始設置WiFi的模式,很簡單

3cde7818-1654-11ed-ba43-dac502259ad0.png

WiFi在不同的國家里面對功率的要求是不一樣的,這里是寫了這個

3cff50ba-1654-11ed-ba43-dac502259ad0.png

就像這樣

3d1c7b5e-1654-11ed-ba43-dac502259ad0.png

傳入后開啟WiFi

memset是計算機中C/C++語言初始化函數。作用是將某一塊內存中的內容全部設置為指定的值, 這個函數通常為新申請的內存做初始化工作。

3d37ee34-1654-11ed-ba43-dac502259ad0.png

看這個代碼

3d5dbc90-1654-11ed-ba43-dac502259ad0.png

把這個寫入

3d87f24e-1654-11ed-ba43-dac502259ad0.png

后面這個DHCP啥的都設置一下

3d9d44c8-1654-11ed-ba43-dac502259ad0.png

就是純互聯網了

3dc634d2-1654-11ed-ba43-dac502259ad0.png

看在文檔的位置

3de64646-1654-11ed-ba43-dac502259ad0.png

接下來是開啟mDNS服務

mdns 即多播dns(Multicast DNS),mDNS主要實現了在沒有傳統DNS服務器的情況下使局域網內的主機實現相互發現和通信,使用的端口為5353,遵從dns協議,使用現有的DNS信息結構、名語法和資源記錄類型。并且沒有指定新的操作代碼或響應代碼。在局域網中,設備和設備之前相互通信需要知道對方的ip地址的,大多數情況,設備的ip不是靜態ip地址,而是通過dhcp協議動態分配的ip 地址,如何設備發現呢,就是要mdns大顯身手,例如:現在物聯網設備和app之間的通信,要么app通過廣播,要么通過組播,發一些特定信息,感興趣設備應答,實現局域網設備的發現,當然mdns 比這強大。

3e0f9e74-1654-11ed-ba43-dac502259ad0.png

目前為止,2222個字了

3e28e83e-1654-11ed-ba43-dac502259ad0.png

看這幾個函數

3e4a67e8-1654-11ed-ba43-dac502259ad0.png

我們的文件系統的初始化,個人認為是web網頁

3e612a1e-1654-11ed-ba43-dac502259ad0.png

這個是文件系統的結構體

3e7e12fa-1654-11ed-ba43-dac502259ad0.png

具體的意思

3ea898ea-1654-11ed-ba43-dac502259ad0.png

3ecdacac-1654-11ed-ba43-dac502259ad0.png

這是防御性的代碼,確保文件系統就是可以使用

3eeafdf2-1654-11ed-ba43-dac502259ad0.png

最后的函數

3f10429c-1654-11ed-ba43-dac502259ad0.png

這個寫法和上面一樣

ESP32 設備的控制模塊實現。FC 和地面之間的雙向鏈路。能處理 MSPv1、MSPv2、LTM 和 MAVLink。MSP & LTM 被解析并逐幀發送到地面。MAVLink 通過(完全透明)。可以與任何協議一起使用。

但是這個任務好復雜。。。

3f342716-1654-11ed-ba43-dac502259ad0.png

看看這個頭是啥?

C99新增inline關鍵字時,它時唯一的函數說明符(關鍵字extern和static時存儲類別說明符,可應用于數據對象和函數)。C11新增了第二個函數說明符_Noreturn,表明調用完成后函數不返回主調函數。exit()函數時_Noreturn函數的一個示例,一旦調用exit()它不會再返回主調函數。注意,這與void返回類型不同。void類型的函數再執行完畢后返回主調函數,只是它不提供返回值。

_Noreturn的目的是告訴用戶和編譯器,這個特殊的函數不會把控制返回主調程序,告訴用于以免濫用該函數,通知編譯器可優化一些代碼。

3f4c3bbc-1654-11ed-ba43-dac502259ad0.png

這個任務里面寫了串口和TCP

3f6ab1aa-1654-11ed-ba43-dac502259ad0.png

寫入的參數

3f83156a-1654-11ed-ba43-dac502259ad0.png

8位

3fa33746-1654-11ed-ba43-dac502259ad0.png

校驗

3fca8fbc-1654-11ed-ba43-dac502259ad0.png

停止碼

3fe7d5ae-1654-11ed-ba43-dac502259ad0.png

硬件流控

400ff282-1654-11ed-ba43-dac502259ad0.png

看看串口

402a4c2c-1654-11ed-ba43-dac502259ad0.png

結構體的配置

40500b56-1654-11ed-ba43-dac502259ad0.png

串口2

4071aa72-1654-11ed-ba43-dac502259ad0.png

這個是IO配置

40945996-1654-11ed-ba43-dac502259ad0.png

具體的使用

40b2d92a-1654-11ed-ba43-dac502259ad0.png

定義可以自己改

40cf9ede-1654-11ed-ba43-dac502259ad0.png

安裝一個串行口的驅動程序

安裝 UART 驅動程序并將 UART 設置為默認配置。UART ISR 處理程序將附加到運行此函數的同一 CPU 內核。

40eee140-1654-11ed-ba43-dac502259ad0.png

就這樣

412005a4-1654-11ed-ba43-dac502259ad0.png

后面還要看看這個串口到底是不是可以使用的。如果不行就把驅動卸載,,拋出錯誤。

41441674-1654-11ed-ba43-dac502259ad0.png

沒有小錯誤就可以使用了

41616224-1654-11ed-ba43-dac502259ad0.png

函數在此

4183b9a0-1654-11ed-ba43-dac502259ad0.png

TCP看不懂了。。。上面這些應該是初始化的參數

41ac79da-1654-11ed-ba43-dac502259ad0.png

建立一個入口

41cc56ec-1654-11ed-ba43-dac502259ad0.png

<0的時候是跑錯誤

41e64a16-1654-11ed-ba43-dac502259ad0.png

bind我忘了,好像是什么端口也重要

42052ba2-1654-11ed-ba43-dac502259ad0.png

最后是監聽的口,反正都沒有錯就會返回一個正確的IP和Port

。。。寫不下去了,函數太長了,我知道也沒有人看到這里,我明天考慮要不要把剩下的任務寫了、

422b8e82-1654-11ed-ba43-dac502259ad0.jpg

不過在文章的末尾我還是要罵,金鵬太拉了,憑什么我的行李就得托運,氣死我了,為啥深圳航空就可以,我的300米就沒了。

4251831c-1654-11ed-ba43-dac502259ad0.png

臨下飛機,我還以為碰上密接了,突然就不讓動了,你再看這個圖

428bc1a8-1654-11ed-ba43-dac502259ad0.jpg

遠一點看,像不像大夫在等著拉人

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51170

    瀏覽量

    427215
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1045

    瀏覽量

    46265
  • ESP32
    +關注

    關注

    18

    文章

    978

    瀏覽量

    17524

原文標題:Dronebridge-ESP32的數字遙測實現

文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用ESP32實現藍牙通信

    上次給大家分享了如何使用ESP32實現UDP通信,今天跟大家聊聊如何使用ESP32實現藍牙通信。
    發表于 11-21 09:31 ?1.6w次閱讀

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf進行esp32開發的教程
    的頭像 發表于 06-03 09:39 ?4615次閱讀
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf進行esp32開發的教程
    的頭像 發表于 06-13 09:04 ?7056次閱讀
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    ESP32模組的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型開發板,集WIFI+藍牙方案于一體,板上模組絕大部分管腳均已引出,開發人員可根據實際需求,輕松通過跳線連接多種外圍器件,或將開發板直接
    發表于 11-04 14:54 ?4133次閱讀

    ESP32開發套件 ESP32-DevKitC

    ,具備豐富的外設和優化的引腳布局,助力用戶快速實現產品開發,它有4MB Flash,有I/O,USB以及按鍵、LED ? 支持 Wi-Fi 藍牙連接 ESP32-DevKitC 是一款基于 ESP32
    的頭像 發表于 01-06 16:55 ?8533次閱讀

    ESP32-WROOM-32E和ESP32-WROOM-32UE模組的區別

    ESP32-WROOM系列模組基于 ESP32-D0WD 雙核芯片設計,適用于基于 Wi-Fi 和藍牙連接的應用場景,具備強大的雙核性能。而其中的ESP32
    發表于 06-01 16:41 ?1.9w次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模組的區別

    esp32和arduino的區別,esp32能否替代arduino

    很多創客愛好者甚至有些技術工程師在理解esp32和arduino的時候總是問一句這兩塊板子哪個更好用?他們可能潛意識中就覺得arduino和esp32是競品的關系,但實際是這樣嗎?今天我們就深入
    發表于 06-24 17:11 ?2.7w次閱讀

    ESP32模組能實現什么功能

    將兩顆ESP32 SoC串行連接,各自安裝一個外部(Wi-Fi)天線后再套上一個漂亮的外殼。該設備將能夠實現許多有趣的功能。基于功能強的ESP32,設計實現了ESPGateway網關設
    發表于 08-10 15:09 ?5074次閱讀

    ESP32 開發之旅② Arduino For ESP32說明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫3.與ESP8266庫類比3.1 WiFi —— ESP
    發表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開發之旅② Arduino For <b class='flag-5'>ESP32</b>說明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在說明如何使用標準的 ESP32-WROOM-32D 開發板進行 SDIO 的通信。本文檔適用于所有需要與 ESP32 SDIO slave 通信的方案
    發表于 11-23 17:51 ?233次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    esp32 例程 藍牙_wifi&amp;藍牙MCU 該不該選ESP32

    ESP32 將天線開關、RF balun、功率放大器、接收低噪聲放大器、濾波器、電源管理模塊等功能集于一體。ESP32 只需極少的外圍器件,即可實現強大的處理性能、可靠的安全性能,和 Wi-Fi &am...
    發表于 12-06 20:06 ?31次下載
    <b class='flag-5'>esp32</b> 例程 藍牙_wifi&amp;藍牙MCU  該不該選<b class='flag-5'>ESP32</b>

    ESP32系列芯片的規格

    ESP32是一款2.4GHz Wi-Fi和藍牙組合芯片,采用TSMC超低功耗40nm設計技術它旨在實現最佳功率和射頻性能,顯示出魯棒性、多功能性和靈活性在各種應用和電源場景中的可靠性。ESP32系列芯片包括
    發表于 04-25 16:21 ?7次下載

    ESP8266/ESP32自動下載原理

    前一段時間需要自己制作一片ESP32單板,成本和封裝考慮,計劃選擇CH340E作為USB轉串口芯片,ESP8266/ESP32的單板一般都有自動下載電路,用戶無需按鈕即可令單板自動進入下載模式
    的頭像 發表于 10-10 15:06 ?4823次閱讀

    使用ESP32實現UDP通信的方法

    前面給大家分享了ESP32使用miropython編程環境搭建,今天給大家分享如何使用ESP32實現UDP通信。
    的頭像 發表于 11-14 10:21 ?6579次閱讀

    ESP32ESP32通過Internet進行通信

    電子發燒友網站提供《ESP32ESP32通過Internet進行通信.zip》資料免費下載
    發表于 06-15 09:58 ?4次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過Internet進行通信
    百家乐平台有什么优惠| 百家乐官网出牌规| 威尼斯人娱乐城开户地址| 百家乐官网怎么看大小| 大发888娱乐城主页| 百家乐如何投注| 百家乐官网流水打法| 百家乐看| 澳门百家乐官网破解方法| 大发888优惠红利代码| 线上百家乐官网平玩法| 霸州市| 免费百家乐缩水软件| 鼎盛娱乐城开户| 百家乐合法| 百家乐官网龙虎扑克| 百家乐官方网站| 总统百家乐的玩法技巧和规则 | 百家乐官网庄闲分布概率| 大发888网页游戏平台| 博E百百家乐娱乐城| 百家乐官网家居| 海立方百利宫娱乐城| 威尼斯人娱乐场 五星| 金城百家乐玩法| 星港城百家乐官网娱乐城| 真人娱乐城送体验金18| 试玩百家乐的玩法技巧和规则| 星河百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城佣金| 百家乐路单用处| 视频百家乐官网破解| 安西县| 大发888娱乐场菲律宾| 迪威百家乐娱乐网| 娱乐百家乐官网可以代理吗| 娱乐城百家乐官网规则| 鼎丰娱乐城开户| 百家乐网站那个诚信好| 百家乐投注平台信誉排名| 广发百家乐官网的玩法技巧和规则|