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

远一点看,像不像大夫在等着拉人

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    455

    文章

    50832

    浏览量

    423813
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1037

    浏览量

    45964
  • ESP32
    +关注

    关注

    18

    文章

    971

    浏览量

    17284

原文标题:Dronebridge-ESP32的数字遥测实现

文章出处:【微信号:TT1827652464,微信公众号:云深之无迹】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用ESP32实现蓝牙通信

    上次给大家分享了如何使用ESP32实现UDP通信,今天跟大家聊聊如何使用ESP32实现蓝牙通信。
    发表于 11-21 09:31 1.6w次阅读

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-03 09:39 4503次阅读
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-13 09:04 6799次阅读
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    ESP32模组的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型开发板,集WIFI+蓝牙方案于一体,板上模组绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板直接
    发表于 11-04 14:54 4015次阅读

    ESP32开发套件 ESP32-DevKitC

    ,具备丰富的外设和优化的引脚布局,助力用户快速实现产品开发,它有4MB Flash,有I/O,USB以及按键、LED   支持 Wi-Fi 蓝牙连接 ESP32-DevKitC 是一款基于 ESP32
    的头像 发表于 01-06 16:55 8424次阅读

    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 4933次阅读

    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 4642次阅读

    使用ESP32实现UDP通信的方法

    前面给大家分享了ESP32使用miropython编程环境搭建,今天给大家分享如何使用ESP32实现UDP通信。
    的头像 发表于 11-14 10:21 6402次阅读

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 4次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet进行通信