STM32实战——ESP8266 WIFI模块
ESP8266
硬件介绍
ESP8266系列模组有哪些:


在本实验中,ESP8266与ESP-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,确保为自己的WIFIAT+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
输出:
AT
OK
ATE0
OK
OK
WIFI CONNECTED
WIFI GOT IP
OK
OK
ERROR
CLOSED
ERROR
CLOSED
ERROR
CLOSED
CONNECT
OK
OK
OK
>
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博客
STM32实战——ESP8266 WIFI模块的更多相关文章
- 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯
最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...
- ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据到 OneNet 服务器
简述 原来写了一个C++的wifi库但是发现用c++ arduino这小身板有点扛不住,代码比较大,使用String类型数据处理速度慢,而且很容易无缘无故跑飞.而且封装成库后使用还需要修改arduin ...
- 【stm32】基于hal库使用野火指南者esp8266 WIFI模块进行TCP传输
UART.c #include "stm32f1xx_it.h" #include "LED.h" #include "UART.h" #i ...
- ESP8266 wifi 模块配置,Wechat+APP控制实现
首先刷入安信可的AiCloud 2.0 SDK文件,AiCloud 2.0具体信息参见AiCloud 1.0 和AiCloud 2.0对比 APP见如下二维码下载. 1.安信可AiCloud 2.0 ...
- ESP8266串口模块的基本使用【转】
本文转载自:http://www.shaoguoji.cn/2017/01/15/ESP8266-usage/ ESP8266是一款超低功耗的UART-WiFi 透传模块,拥有业内极富竞争力的封装尺寸 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块(ESP8266)AT指令TCP透传方式,MQTT通信控制升级(加入数据校验)
前言 这节演示下,上两节写的利用MQTT来控制STM32控制的程序 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootLoader程序(请自行下载) 首先BootLo ...
- Beaglebone Black– 智能家居控制系统 LAS - 刷 WiFi 模块 ESP8266 Firmware 和 ESP8266 直接收发 GPIO 信号
用 Windows 来刷 ESP8266 固件有很多中文教程,来试试直接用 BBB 刷吧.目标是 NodeMCU,ESP-01 可用,就是我买的那个. 接线方式在上一篇.当 echo ‘BB-UART ...
- 玩转X-CTR100 l STM32F4 l ESP8266串口WIFI模块
我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]- ESP8266是一款非常火的WIFI模块,性价 ...
- 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP非透传模式传输数据流步骤
测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...
- 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP透传模式传输数据流步骤
测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...
随机推荐
- [AI回答]Java中Long和long的区别,为什么在Springboot项目中一般使用Long
Long 和 long 的区别 在Java中,Long 和 long 是两个不同的概念,它们分别代表不同的数据类型: long: 这是一个 基本数据类型 (primitive type). 它用于存储 ...
- 判断移动终端类型安卓苹果鸿蒙、查看设备详细信息、跳转到各手机应用商店、判断APP是否已安装
案例1:判断移动终端类型,微信扫描二维码链接可以区分华为(荣耀).安卓.苹果手机.华为及荣耀会跳到华为应用商店.安卓会提示浏览器打开.苹果跳到苹果商店. <!DOCTYPE html> ...
- Qt编写视频监控系统75-计算实时码率并显示
一.前言 做监控摄像头的实时视频显示,一般还会要求统计实时码率显示在通道画面上,一个是为了测试下整个软件的性能,同时也看下当前到底是主码流还是子码流,设备到底是不是真的按照设定的码流大小来传输视频数据 ...
- Qt编写物联网管理平台40-类型种类
一.前言 为了增强本系统的拓展性,做成通用的物联网管理平台,特意将控制器主设备类型.探测器子设备类型.对应种类符号等信息,全部做成表格可自定义添加和修改,这样在控制器信息表和探测器信息表管理的时候,可 ...
- 开源 Material Design WPF UI 控件库,易用且功能强大
前言 Material Design 是由 Google 开发的一套设计指南,提供统一的设计语言,使用户界面更加直观.美观和一致. Material Design In XAML Toolkit 是一 ...
- FileGDB代码示例
FileGDB代码示例 1. 读取FileGDB图层 1.1 实现思路 graph TD A[注册OGR] --> B[设置中文路径支持] B --> C[打开数据驱动] C --> ...
- (九).NET6.0搭建基于Redis的Hangfire定时器
1.首先创建新的类库项目 Wsk.Core.Hangfire,然后在Wsk.Core.Package包项目下引用hangfire有关的组件,包括 Hangfire.Hangfire.Core.Hang ...
- Solution -「LNOI 2022」「洛谷 P8367」盒
\(\mathscr{Desription}\) Link. 有 \(n\) 个盒子排成一排,第 \(i\) 个盒子内有 \(a_i\) 个球.球可以在相邻盒子间传递,\(i\) 与 \(i+ ...
- Collection的子接口之一:List 接口
List 接口概述: 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中 元素有序.且可重复,集合中的每个元素都有其对应的顺序索引. List容器中的元素都对 ...
- Object类是所有Java类的根父类