基于stm32单片机的ESP-01S模块(wifi模块)的使用

news2024/11/13 21:25:24

一、开发环境

开发板:野火stm32f407开发板

wifi模块:ESP-01S(核心处理器 ESP8266 ),固件版本(MQTT固件)

操作系统:rt-thread操作系统

二、ESP-01S模块介绍

    ESP-01S 是由安信可科技开发的 Wi-Fi 模块,该模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA。

    ESP-01S Wi-Fi 模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。

    ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能。

6b16b610eaa9cfe3e419c177dc967d5c.png

连接方式:开发板和ESP-01S模块通过串口2连接。单片机引脚是PA2和PA3。

供电方式:3.3V供电。

三、工程创建

基于rt-thread系统bsp工程创建,bsp工程使用的是stm32f407-atk-explorer。

使用env工具配置工程,使能usart2和增加at-device软件包。

fa051b6d09463962dc8a96cd8d904f38.png

81be0040a26582937d8d9232344e2744.png

保存,下载软件包,重新生成工程。

9b8467cbde3da6de63f3eef76094f68a.png

四、工程修改

1、时钟修改;

2、增加串口2的初始化配置

8e63608f447f182f7e164886611d8739.png

适配固件信息,如果不修改的话会提示不支持AT+CIPDNS_CUR?命令。

代码修改如下:

static void esp8266_get_netdev_info(struct rt_work *work, void *work_data)
{
#define AT_ADDR_LEN          32
#define AT_ERR_DNS_SERVER    "255.255.255.255"
#define AT_DEF_DNS_SERVER    "114.114.114.114"


    at_response_t resp = RT_NULL;
    char ip[AT_ADDR_LEN] = {0}, mac[AT_ADDR_LEN] = {0};
    char gateway[AT_ADDR_LEN] = {0}, netmask[AT_ADDR_LEN] = {0};
    char dns_server1[AT_ADDR_LEN] = {0}, dns_server2[AT_ADDR_LEN] = {0};
    const char *resp_expr = "%*[^\"]\"%[^\"]\"";
    const char *resp_dns = "+CIPDNS:1,%s";//
    ip_addr_t ip_addr;
    rt_uint32_t mac_addr[6] = {0};
    rt_uint32_t num = 0;
    rt_uint32_t dhcp_stat = 0;
    struct at_device *device = (struct at_device *)work_data;
    struct netdev *netdev = device->netdev;
    struct at_client *client = device->client;


    if (work != RT_NULL)
    {
        rt_free(work);
    }


    resp = at_create_resp(512, 0, rt_tick_from_millisecond(300));
    if (resp == RT_NULL)
    {
        LOG_E("no memory for resp create.");
        return;
    }


    /* send mac addr query commond "AT+CIFSR" and wait response */
    if (at_obj_exec_cmd(client, resp, "AT+CIFSR") < 0)
    {
        goto __exit;
    }


    if (at_resp_parse_line_args_by_kw(resp, "STAMAC", resp_expr, mac) <= 0)
    {
        LOG_E("%s device parse \"AT+CIFSR\" cmd error.", device->name);
        goto __exit;
    }


    /* send addr info query commond "AT+CIPSTA?" and wait response */
    if (at_obj_exec_cmd(client, resp, "AT+CIPSTA?") < 0)
    {
        LOG_E("%s device send \"AT+CIPSTA?\" cmd error.", device->name);
        goto __exit;
    }


    if (at_resp_parse_line_args_by_kw(resp, "ip", resp_expr, ip) <= 0 ||
            at_resp_parse_line_args_by_kw(resp, "gateway", resp_expr, gateway) <= 0 ||
            at_resp_parse_line_args_by_kw(resp, "netmask", resp_expr, netmask) <= 0)
    {
        LOG_E("%s device prase \"AT+CIPSTA?\" cmd error.", device->name);
        goto __exit;
    }


    /* set netdev info */
    inet_aton(gateway, &ip_addr);
    netdev_low_level_set_gw(netdev, &ip_addr);
    inet_aton(netmask, &ip_addr);
    netdev_low_level_set_netmask(netdev, &ip_addr);
    inet_aton(ip, &ip_addr);
    netdev_low_level_set_ipaddr(netdev, &ip_addr);
    sscanf(mac, "%x:%x:%x:%x:%x:%x",
            &mac_addr[0], &mac_addr[1], &mac_addr[2], &mac_addr[3], &mac_addr[4], &mac_addr[5]);
    for (num = 0; num < netdev->hwaddr_len; num++)
    {
        netdev->hwaddr[num] = mac_addr[num];
    }


    /* send dns server query commond "AT+CIPDNS?" and wait response */
    if (at_obj_exec_cmd(device->client, resp, "AT+CIPDNS?") < 0)
    {
        LOG_W("please check and update %s device firmware to support the \"AT+CIPDNS?\" cmd.", device->name);
        goto __exit;
    }


    if (at_resp_parse_line_args(resp, 1, resp_dns, dns_server1) <= 0 &&
            at_resp_parse_line_args(resp, 2, resp_dns, dns_server2) <= 0)
    {
        LOG_E("%d device prase \"AT+CIPDNS?\" cmd error.", device->name);
        goto __exit;
    }


    /* set primary DNS server address */
    if (rt_strlen(dns_server1) > 0 &&
            rt_strncmp(dns_server1, AT_ERR_DNS_SERVER, rt_strlen(AT_ERR_DNS_SERVER)) != 0)
    {
        //inet_aton(dns_server1, &ip_addr);
        if(inet_aton(dns_server1, &ip_addr) == 0)
        {
            sscanf(dns_server1,"\"%[^\"]\"",dns_server1);
            if(rt_strcmp(dns_server1,"8.8.8.8")==0)
            {
                inet_aton(dns_server1, &ip_addr);
            }
            else if(rt_strcmp(dns_server1,"\"8.8.8.8\"")==0)
            {
                inet_aton(dns_server1, &ip_addr);
            }
        }
        netdev_low_level_set_dns_server(netdev, 0, &ip_addr);
    }
    else
    {
        inet_aton(AT_DEF_DNS_SERVER, &ip_addr);
        esp8266_netdev_set_dns_server(netdev, 0, &ip_addr);
    }


    /* set secondary DNS server address */
    if (rt_strlen(dns_server2) > 0 )
    {
        inet_aton(dns_server2, &ip_addr);
        netdev_low_level_set_dns_server(netdev, 1, &ip_addr);
    }


    /* send DHCP query commond " AT+CWDHCP?" and wait response */
    if (at_obj_exec_cmd(client, resp, "AT+CWDHCP?") < 0)
    {
        goto __exit;
    }


    /* parse response data, get the DHCP status */
    if (at_resp_parse_line_args_by_kw(resp, "+CWDHCP:", "+CWDHCP:%d", &dhcp_stat) < 0)
    {
        LOG_E("%s device prase DHCP status error.", device->name);
        goto __exit;
    }


    /* Bit0 - SoftAP DHCP status, Bit1 - Station DHCP status */
    netdev_low_level_set_dhcp_status(netdev, dhcp_stat & 0x02 ? RT_TRUE : RT_FALSE);


__exit:
    if (resp)
    {
        at_delete_resp(resp);
    }
}

五、测试

将编译后的程序下载到开发板,调试信息如下:

a382ee94daae30493fa6722d3fd505f4.png

ifconfig指令查看信息,如下

807f7ba8e2dfafb00b56131de3495041.png

电脑ping设备,如下:

5de222d493c063f31d3af3cda27c3e80.png

欢迎关注个人公众号:嵌入式学习与实践

参考:

https://docs.espressif.com/projects/esp-at/zh_CN/release-v2.2.0.0_esp8266/AT_Command_Set/AT_Command_Set_Comparison.html?highlight=AT%20CIPDNS_CUR#esp-at

file:///E:/work/DTU/wifi%E6%A8%A1%E5%9D%97/esp-01s_product_specification_zh_v1.0.pdf

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/components/at/an0014-at-client?id=%e7%ae%80%e4%bb%8b

https://club.rt-thread.org/ask/question/fa060e1514b657a1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】Vue3使用Element-plus按需加载时消息弹框ElMessage没有样式

Vue3使用Element-plus时消息弹框ElMessage没有样式 问题描述 Element-plus在使用ElMessage消息弹框的时候没有样式&#xff0c;按照官方的按需加载的方式引入的 1、Element-plus使用了自动按需导入&#xff0c;vite.config.js配置如下&#xff1a; plugins: [vue(),AutoImpo…

【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(通用语言体系)

一文带领你透视DDD领域驱动模型的本质和设计原理分析指南&#xff08;通用语言体系&#xff09; 前言介绍降低沟通成本问题&#xff1a;各自建立属于自己领域/层面的语言标准解决方案1&#xff1a;专业术语转换为接地气的话术解决方案2&#xff1a;用简单的案例和背景信息进行描…

【无监督学习】1、MOCOv1 | 用于提升无监督学习效果的动量对比学习

文章目录 一、背景二、方法2.1 对比学习&#xff08;字典查表&#xff09;2.2 动量对比函数2.3 Pretext Task 三、效果3.1 数据集3.2 训练细节3.3 实验 论文&#xff1a;Momentum Contrast for Unsupervised Visual Representation Learning 代码&#xff1a;https://github.c…

【Java|多线程与高并发】wait和notify方法详解

文章目录 1.前言2.wait和notify的基本使用3. notifyAll方法4. wait和sleep方法的对比5. 总结 1.前言 在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法 2.wait和…

Java——《面试题——MySQL篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 目录 前文 1、数据库的三范式是什么&#xff1f; 2、MySQL数据库引擎有哪些 3、说说…

【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法

【五子棋实战】第2章 博弈树极大极小值alpha-beta剪枝算法 博弈树 极大极小值搜索Minimax 负值极大法Negamax alpha-beta剪枝 博弈树负值极大alpha-beta剪枝算法代码实现 ## 初始化输入、确定输出 ## 开始回溯 ## 判赢 ## 评估-计算分数 总结 继续学习下一篇实战&…

注解和异常的详细笔记

注解的理解 注解(Annotation)也被称为元数据(Metadata)&#xff0c;用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。和注释一样&#xff0c;注解不影响程序逻辑&#xff0c;但注解可以被编译或运行&#xff0c;相当于嵌入在代码中的补充信息。在 JavaSE 中&am…

OpenMMLab-AI实战营第二期——相关1. COCO数据集格式和pycocotools使用(目标检测方向)

文章目录 1. COCO数据集1.1 COCO数据集介绍1.2 COCO数据集格式1.2.1 常见目标检测数据格式1.2.2 COCO数据集文件结构及标注文件说明1.2.3 COCO的evaluation指标 1.3 其他 2. pycocotools2.1 pycocotools简介和安装2.2 基本使用 3. 图像的EXIF使用3.1 图像的EXIF3.1.1 基本介绍3…

车载以太网MACsec

车载以太网MACsec 1.概述 MACsec&#xff08;Media Access Control Security&#xff09;定义了基于 IEEE 802 局域网络的数据安全通信的方法。MACsec 可为用户提供安全的 MAC 层数据发送和接收服务&#xff0c;包括用户数据加密&#xff08;Confidentiality&#xff09;、数…

新浪股票接口获取历史数据

这两天做了一个调用新浪股票接口获取实时以及历史股票数据的应用&#xff0c;因为新浪没有公开关于其接口的官方文档&#xff0c;所以通过各种百度差了很多关于新浪股票接口的使用&#xff0c;不过大家基本都是转载或者直接复制&#xff0c;对于实时数据的获取讲的很详细&#…

Linux【系统学习】(shell篇)

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 Ubuntu 使用的是dash 2&#xff09;bash 和 sh 的关系 3&#xff09;Centos 默认的解析器是 bash 第 2 章 Shell 脚本入门 1&#xff09;脚本格式 &#xff08;结尾不是必须以 .sh 结尾&#xff0c;只是为了区…

《网络安全0-100》VPN 讲解

1、前言 VPN虽好可不要贪玩哦 2、VPN的概念和结构 VPN:虚拟专用网(virtual personal network)是利用internet等公共网络的基础设施&#xff0c;通过隧道技术&#xff0c;为用户提供的专用网络具有相同通信功能的安全数据通道。 ‘虚拟’是指用户无需建立各逻辑上的专用物理线…

​AVS3支持下的8K内容生产和传输应用实践

AVS标准经过20年发展&#xff0c;到AVS3这一代实现了国产标准从跟跑到领跑的突破。博雅睿视团队深度参与AVS3标准制定&#xff0c;开发的8K AVS3实时、离线编解码设备有力支持了我国8K超高清视频产业的落地和推广。 本次分享将会分为三个部分&#xff0c;第一部分重点介绍AVS标…

MusicGen配乐工具开源,教你怎么给抖音短视频配乐,助你涨粉1000!

大家好&#xff0c;我是千与千寻&#xff0c;好久不见了&#xff0c;很多粉丝私信我说&#xff0c;千寻哥这是去哪了&#xff1f;难道被野外捕捉了。 哈哈哈&#xff0c;当然不是了&#xff0c;千寻依然在学习ChatGPT的道路上和大家一起学习&#xff0c;一起搞钱&#xff01; 但…

TC8:TCP_MSS_OPTIONS_05-09

TCP_MSS_OPTIONS_05: Illegal option length for MSS in a SYN-ACK segment 目的 TCP能够处理SYN+ACK报文段中MSS选项的长度非法,而不会崩溃 可以正常地响应,就是不崩溃,这里指的应该是DUT发送ACK 测试步骤 Tester:让DUT侧的应用程序发起主动open调用DUT:发送SYNTester:…

C++类和对象--构造函数和析构函数

0.前言 在我们写某些需要动态开辟内存空间的函数时候&#xff0c;会经常忘记初始化、销毁&#xff0c;而且有时候程序返回的情况很多&#xff0c;那么销毁函数写起来就会很繁琐&#xff0c;那么有没有什么办法解决这个问题呢&#xff1f;答案是&#xff1a;当然有&#xff01;在…

Java类 继承

Java是一种面向对象的编程语言&#xff0c;类是Java中最基本的编程单元。一个类可以包含变量、方法和构造函数等。类的定义需要使用关键字class&#xff0c;例如&#xff1a; public class Person { private String name; private int age; public Person(St…

文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题

一、在高度为h的堆中&#xff0c;元素个数最多和最少分别是多少? 文心一言&#xff1a; 在高度为 h 的二叉搜索树&#xff08;BST&#xff09;中&#xff0c;元素个数最多和最少的情况分别如下&#xff1a; 1.最多情况&#xff1a;当每个节点都包含两个子节点时&#xff0c…

CSS3-盒子模型-边距问题

1 清除默认内外边距 场景&#xff1a;浏览器会默认给部分标签设置默认的margin和padding&#xff0c;但一般在项目开始前需要先清除这些标签默认的margin和padding&#xff0c;后续自己设置 比如&#xff1a;body标签默认有margin&#xff1a;8px、p标签默…

一句提示词生成整个代码库——Gpt Engineer神级项目开源(附演示视频)

近日&#xff0c;一个名为Gpt Engineer神级项目开源&#xff0c;并迅速火爆全网。 短短几天内&#xff0c;该项目已经得到了25K的星星。 使用GPT-engineer进行人工智能软件开发&#xff0c;可以改变软件开发的未来。 在软件开发领域&#xff0c;一场巨大的革命正在开始。这一转…