STM32实战——ESP8266 WIFI模块

news/2025/3/4 11:19:19/文章来源:https://www.cnblogs.com/penggeon/p/18750132

ESP8266

硬件介绍

ESP8266系列模组有哪些:

在本实验中,ESP8266ESP-01不做区分。

ESP-01引脚介绍:

引脚 功能
3.3 3.3V供电,避免使用5V供电
RX UART_RXD,异步串口接受端
RST 外部复位引脚,低电平有效,默认高电平
IO0 GPIO_0引脚:状态:1.悬空:Flash下载模式和工作模式:2.下拉:串口下载模式
EN 使能端口,高电平工作,低电平模块不工作
IO2 GPIO_2引脚,开机上电时禁止下拉,默认高电平
TX UART_TXD,异步串口发送端
GND GND接地引脚

实物图如下(某些板子没有丝印端口说明,可以参照下图):

引脚连接如下:

引脚 连接
3.3V 3.3V
RST 3.3V
EN 3.3V
IO2 3.3V
GND GND
IO0 GND
TXD RXD
RXD TXD

硬件连接图(2)

使用ESP串口工具

某宝上有现成的调试ESP8266模块的串口工具,已将各个引脚接好,还带有RST按键,烧录固件库或者调试程序使用很方便。

本次实验测试时使用该串口工具。

三种模式

ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三种。

利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。

提示
SoftAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。

Station:即无线终端,是一个无线网络的终端端。

AT命令

此外,在AT+CIPSEND输入模式下发送+++(不需要换行),即可退出输入模式。

ATE1开启回显,ATE0关闭回显。

AT+CIOBAUD=115200将波特率修改为115200。

ESP8266 TCP通信测试

网络环境准备

手机开启流量,开启热点,设置热点名称(最好是6位字母以下)和密码。

将电脑连接到手机热点。

电脑端准备

1、网络调试

win+R 输入cmd进入DOS窗口,之后输入ipconfig查看当前电脑IP地址,例如我的IP为192.168.41.242

打开网络调试工具(任意工具即可,例如野火网络调试助手),将电脑配置为TCP Server,输入刚刚的IP192.168.41.242,端口号自己决定(需要与下一步相匹配),例如8080。

点击开始监听。

2、串口

将"ESP8266模块的串口工具"插入电脑USB口,打开串口调试工具(任意串口调试工具均可),设置波特率115200(ESP8266默认波特率),数据位8位,停止位1位,校验位无。

接收与发送均为"文本模式",编码为GBK编码。

ESP8266连接流程

依次利用串口向ESP8266输入以下命令。

  • AT\r\n
    检查ESP8266模块连接是否正常
  • AT+CWMODE=1\r\n
    配置模块为Sta模式
  • AT+CWJAP="WIFI名称","WIFI密码"\r\n
    连接指定WIFI,确保为自己的WIFI
  • AT+CIPMUX=0\r\n
    设置成单连接
  • AT+CIPSTART="TCP","192.168.41.242",8080\r\n
    创建TCP连接,IP地址为电脑的IP,串口为电脑监听的端口号
  • AT+CIPMODE=1\r\n
    进入透传模式,进入到透传模式后AT指令就会失效,需要退出后才能生效
  • AT+CIPSEND\r\n
    准备向服务器发送请求,前面都成功的前提下发送完这个指令后会出现一个>,此时输入发送信息即可

如果前面的命令均正确,则发送Hello后,此时电脑网络调试工具会接收Hello

电脑网络调试工具发送123,ESP8266也会收到123

至此,单独对ESP8266的设置和测试完成。接下来可以编写STM32代码。

附:完整的输入输出信息(\r\n表示按一次回车)

输入:

AT\r\n
ATE0\r\n
AT+CWMODE=1\r\n
AT+CWJAP="bwifyt","123456789"\r\n
AT+CIPMUX=0\r\n
AT+CIPSTART="TCP","192.168.41.242",8080\r\n
AT+CIPMODE=1\r\n
AT+CIPSEND\r\n

输出:

ATOK
ATE0OKOK
WIFI CONNECTED
WIFI GOT IPOKOKERROR
CLOSEDERROR
CLOSEDERROR
CLOSED
CONNECTOKOKOK>

ESP8266 HTTP测试

HTTP协议

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

ESP8266发送HTTP请求

这里使用心知天气进行测试。

服务器的IP地址可以使用ping api.seniverse.com命令获得。

端口号一般为80端口,如果是其他端口,请先使用网络调试助手确保可行。

使用正确的AT命令,重新设置ESP8266连接的IP地址(或者重启模块,重新设置,参照上一小节内容)。

发送格式

GET /v3/weather/now.json?key=你的密钥&location=beijing&language=zh-Hans&unit=c

响应:服务器返回的数据

{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"16"},"last_update":"2024-03-31T20:24:29+08:00"}]}

也可以使用完整的GET请求:

GET /v3/weather/now.json?key=你的密钥&location=beijing&language=zh-Hans&unit=c HTTP/1.1
Content-Type: application/json;charset=utf-8
Host: www.liefyuan.top
Connection: Keep Alive

注意
GET之后有一空格,HTTP/1.1之前有一空格。最后需要以两行换行表示结束。

响应信息
发送完整的GET请求,可以得到完整的响应信息

使用简略的GET请求,可以得到简略的响应信息

至于POST请求,需要与后端进行沟通,才能够确定具体的发送格式。

ESP8266接收响应

提示
以下内容与我目前所做的项目高度相关,因此有部分其他代码不做解释,只讲解关键点代码

发送HTTP请求之后,需要接收相关的响应,并对数据进行解析。

C语言有类似于CJSON的库可以能够实现数据解析做这件事,但是我们这里依旧采用自编代码实现。

优点是不需要导入CJSON的代码,对于单片机要求不高。缺点是需要手动编写,但是我们请求的次数不多,也就显得不是很麻烦了。

1、初始化

首先进行初始化,开启串口接收数据的中断。

// USART相关配置/*中断输出配置*/
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接收数据的中断
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); // 开启串口接收数据的中断// NVIC相关配置

这里的“两个”中断都需要打开,不然无法正常接收到数据。

2、中断函数

之后编写我们需要的中断函数,即将ESP8266接收到的数据保存下来。

/*** @brief  串口3接收到数据中断回调函数* @param  None* @retval None*/
static void ESP8266_FrameFinish_CallBack(void) {Serial_Printf("\r\n中断回调函数串口输出:\r\n%s", ESP8266_Buffer.Body);
}/*** @brief  串口3中断函数* @param  None* @retval None*/
void USART3_IRQHandler(void) {if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){// 当接收没有结束时,将源源不断的接收到的字符存入缓冲区if (ESP8266_Buffer.Length < (USART_RX_BUF_SIZE - 1)){ESP8266_Buffer.Body[ESP8266_Buffer.Length++] = (char)USART_ReceiveData(USART3);}}if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET){// 当接收结束时,向缓冲区尾端添加结束符ESP8266_Buffer.FinishFlag = 1;ESP8266_Buffer.Body[ESP8266_Buffer.Length] = '\0';// 清除串口空闲中断标志位volatile uint16_t temp;temp = USART3->SR;temp = USART3->DR;ESP8266_FrameFinish_CallBack();}
}

3、发送HTTP接收数据

/*** @brief  清空ESP8266_Buffer结构体* @param  None* @retval None*/
void ESP8266_ClearBuffer(void)
{memset(ESP8266_Buffer.Body, 0, USART_RX_BUF_SIZE);  // 清空缓存区数据ESP8266_Buffer.FinishFlag = 0;  // 清空FinishFlag, 表示没有接收完成ESP8266_Buffer.Length = 0;      // 清空Length, 表示接收长度为0
}/*** @brief  HTTP GET类型请求* @param  address 请求地址* @param  timeout 超时时间(单位:100ms)* @retval char* 字符数组*/
char* ESP8266_HTTP_Get(char* address, uint8_t timeout)
{ESP8266_ClearBuffer();  // 清空ESP8266缓存ESP8266_Printf("GET %s HTTP/1.1\r\n\r\n", address);while(timeout--){Delay_ms(100);if(ESP8266_Buffer.FinishFlag){return ESP8266_GetBuffer();}}return "HTTP Send Failed.";
}

4、解析数据

由于我的接收响应是这样的

{"status": "1","msg": [{"id": 7,"name": "temperature","value": "26.0"},{"id": 8,"name": "humidity","value": "100.0"},{"id": 9,"name": "concentration","value": "200.9"}]
}

所以我的解析数据函数如下(添加了注释,相信大家能够明白)

/*** @brief  从res中提取信息, 数据类型为uint8_t* @param  res: 响应字符串* @param  name: 数据名称temperature: 温度humidity: 湿度concentration: 浓度* @param  integer_part: 整数部分* @param  decimal_part: 小数部分* @retval 无*/
void GetInformation(char *res, char *name, uint8_t *integer_part, uint8_t *decimal_part) {char *key_start = strstr(res, name);              // 寻找name开头char *result_start = strstr(key_start, "value") + 9;  // 寻找数据开头char *dot = strchr(result_start, '.');                // 寻找小数点char *result_end = strchr(result_start, '\"');    // 寻找数据结尾char string_integer_part[5];char string_decimal_part[5];strncpy(string_integer_part, result_start, dot - result_start); // 整数部分字符串strncpy(string_decimal_part, dot + 1, result_end - dot - 1);    // 小数部分字符串*integer_part = atoi(string_integer_part);      // 整数部分*decimal_part = atoi(string_decimal_part);      // 小数部分
}

5、示例代码

// ESP8266_HTTP_Get是请求HTTP的参数,将返回一个字符串指针
char* res = ESP8266_HTTP_Get("/your_site", 100);
char* res_end;
do
{res = ESP8266_GetBuffer();res_end = strstr(res, "}]}");Delay_ms(100);
}while(res_end == NULL);// 获取温度, 湿度, PM2.5浓度值
char* name = "temperature";
GetInformation(res, name, &temp.Temp_H_Threshold, &temp.Temp_L_Threshold);

参考链接

STM32外设系列—ESP8266(WIFI)_stm32 esp8266-CSDN博客

esp8266学习记录_stm32+esp8266测试方法-CSDN博客

STM32-连接wifi模块(esp8266)_stm32wifi模块-CSDN博客

ESP8266-01引脚说明与连接_esp01引脚定义-CSDN博客

HTTP 消息结构 | 菜鸟教程

ESP8266——AT指令发送POST请求

ESP8266使用AT指令发送GET方式HTTP请求

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一招学会Prometheus对接三方监控平台

文章来源:乐维社区 通过将Prometheus与不同的监控工具和服务集成,企业可以实现对更广泛资源和服务的监控,包括那些不由Prometheus原生支持的系统。这种集成不仅有助于获取更全面、深入的监控数据,还能提升故障排查和性能优化的效率,从而确保系统的稳定性和可靠性。 环境说…

Motoman机器人XRC控制柜维修

在现代工业生产中,YASKAWA机器人扮演着至关重要的角色。然而,如同所有的机械设备一样,YASKAWA机器人也会出现故障,尤其是其控制柜部分。因此,安川机器人维修工作对于保障机器人的正常运行意义非凡,这其中安川机器人控制柜维修更是关键环节。一、常见故障及解决方法1. 电源…

【域攻击】无文件落地攻击:msiexec

msiexec.exe属于系统进程,是Windows Installer的一部分,用于安装Windows Installer安装包(MSI),对系统的正常运行非常重要,一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大,我们亦可以使用其作为无文件落地的媒介,下面举例说明: Step 1:使…

c# hosting 和 AppDomain

前言 简单介绍一下hosting 和 appdomain。 这两个东西。 正文 我们经常听说寄宿,这个寄宿是什么东西呢? 也就是我们这里要介绍的hosting。 什么是寄宿呢? 想一个问题,一个c# 的exe 程序,为啥能够启动呢?我们记得dll中是il代码。 那么肯定要加载运行时对吧。 那么为什么叫…

Dapr 简介 - 分布式应用运行时

Dapr 简介-分布式应用运行时 简介 Whats Dapr? Dapr = Distributed Application Runtime (分布式应用运行时)看到这个词,不知道大家想到了什么?是不是类似于 java runtime,c runtime 这类词汇。网上找到了一个 应用程序、运行时库和 OS 之间的关系图,其中 Runtime 库处于…

Mac脚本发布PHP开发项目到线上

环境 服务器: CentOS Linux release 7.6.1810 (Core) 客户端: macOS Sonoma 14.1.2 (23B92) 测试环境:开发使用ftp自动上传到/www/wwwroot/dirDev文件夹自动备份并发布程序 备份/www/wwwroot/dirOnline文件夹,并将开发项目/www/wwwroot/dirDev自动同步到线上环境/www/wwwro…

Mac发布PHP开发项目到线上项目

环境 服务器: CentOS Linux release 7.6.1810 (Core) 客户端: macOS Sonoma 14.1.2 (23B92) 开发使用ftp自动上传到/www/wwwroot/dirDev文件夹自动备份并发布程序 备份/www/wwwroot/dirOnline文件夹,并将开发项目/www/wwwroot/dirDev自动同步到线上环境/www/wwwroot/dirOnli…

Windows使用技巧——查看本地ip地址

我在windows上双击一个文件,就可以直接查看我的ip地址,这是怎么做到的?步骤一:在文件夹右击,新建一个文本文档; 步骤二:双击此文档,输入以下字符:“ipconfigpause”,然后保存;步骤三:把文件重命名,把后缀更改为“bat”如下,再点“是”; 之后双击该文档,就可以…

触想对话2025智能控制与驱动发展论坛,共探中国智造新未来!

近日,由中国工控网联合SPS广州展共同举办的“2025智能控制与驱动发展论坛”在广州珠海顺利召开,触想受邀出席并发表专题演讲,围绕公司在工业物联网(IIoT)技术应用与电子制造数字化转型中的创新实践展开分享,与国内外技术专家、行业领袖及产业链代表,共同探讨中国制造的未来…

B150平台的最后一舞 CC150上机作业

简单介绍一下CC150 大船靠岸,CC150也从24年4月的五百多元逐步降价到8月的310元(个别有299),价格基本稳定了下来,性价比日益凸显。 网传这颗CC150是NVIDIA用在GeForceNow云游戏平台上的专门向Intel定制的处理器,猜测是用在虚拟化场景。这颗处理器优劣很鲜明:优点是核心数…

Qt/C++地图组件在视频监控系统中的应用/显示设备点/弹出视频画面/调整设备位置

一、前言说明 监控系统中一般有很多的摄像头点位,除了在平面图中展示位置以外,有些工地和集团,在集中管理的地方,还希望在电子地图中展示,电子地图可以缩放和拖动,切换设备点自动放大高亮,地图自动移动到设备居中的位置,双击设备可以预览实时画面。设备的经纬度信息,在…