零基础入门 STM32 驱动 ESP01s 完成串口通讯与 HTTP 服务器请求(POST)
技术支持:
百色市联芯创研电子工作室
1.介绍
本文将介绍基于 STM32 单片机通过串口通讯控制 ESP01s 模块实现 HTTP 请求后台服务器的功能。该功能通过 STM32 向 ESP01s 发送一系列 AT 命令,首先复位模块并配置为 Station 模式,随后连接指定 WiFi(SSID 为 "创研微电子",密码为 "11111111");获取液体数据后,建立与目标服务器(IP:8.13x.1xx.6,端口:8652)的 HTTP(这里需要注意在命令TCP,但是配置的是HTTP通讯) 连接,最后构造并发送包含 JSON 格式数据的 POST 请求到服务器的 / PostData 接口,实现将采集到的液体数据上传至后台服务器的功能。
1.ESP01S模块图片

2.ESP01S 模块介绍
ESP01S 是由乐鑫(Espressif)推出的一款低成本、小尺寸的 WiFi 无线通信模块,基于ESP8266EX 芯片设计,是物联网(IoT)开发中连接嵌入式设备与网络的常用组件,尤其适合 STM32 等无自带 WiFi 功能的单片机扩展联网能力。
一、核心硬件特性
ESP01S 模块的硬件设计紧凑,核心参数与功能适配低功耗、小空间的嵌入式场景,具体特性如下:
- 核心芯片:搭载 ESP8266EX,集成 32 位 Tensilica L106 微处理器(最高主频 80MHz)、WiFi 射频电路(支持 IEEE 802.11 b/g/n 协议),兼具 “通信” 与 “简易控制” 能力(可单独运行固件,也可通过 AT 指令由外部 MCU 控制)。
- 引脚与尺寸:采用 8Pin 直插 / 贴片封装,实际可用引脚仅 4 个核心功能脚(VCC、GND、TX、RX),尺寸约 24mm×16mm,适合空间受限的硬件设计(如传感器节点、小型控制板)。
- 供电要求:典型工作电压 3.3V(需注意:不支持 5V 供电,直接接 5V 会烧毁模块),工作电流约 70mA(发射时峰值电流可达 200mA),建议搭配 3.3V 稳压电路(如 AMS1117-3.3)确保供电稳定。
- 通信接口:仅支持UART 串口通信(默认波特率 115200bps,可通过 AT 指令修改),通过 TX/RX 引脚与 STM32 等单片机的串口引脚交叉连接(ESP01S_TX 接 STM32_RX,ESP01S_RX 接 STM32_TX),即可实现指令与数据交互。
- 天线设计:采用板载 PCB 天线,无需外接天线,通信距离约 10-30 米(空旷环境,受遮挡影响较大)。
二、核心工作模式
ESP01S 支持 3 种 WiFi 工作模式,可通过AT+CWMODE指令配置,适配不同物联网场景,其中Station 模式(STA 模式) 是本文与 STM32 配合的核心模式:
| 模式 | 指令参数 | 功能说明 | 适用场景 |
|---|---|---|---|
| Station 模式(STA) | AT+CWMODE=1 | 模块作为 “WiFi 客户端”,连接外部路由器 / 热点,获取局域网 IP 后接入互联网,可与后台服务器通信 | 嵌入式设备(如 STM32)需上传数据到云端 / 后台服务器(本文场景) |
| SoftAP 模式(AP) | AT+CWMODE=2 | 模块作为 “WiFi 热点”,其他设备(如手机、电脑)可连接模块的 WiFi,实现设备间本地通信 | 无路由器场景下,手机直接与模块交互(如本地调试、控制) |
| STA+AP 混合模式 | AT+CWMODE=3 | 同时开启 STA 和 AP 模式,既可以连接外部路由器联网,也可以作为热点供其他设备本地连接 | 需同时实现 “联网上传” 和 “本地调试” 的场景 |
三、与 STM32 的配合优势
在本文 “STM32+ESP01S 实现 HTTP 请求” 的场景中,ESP01S 的核心价值是为 STM32 “补充 WiFi 能力”,配合优势显著:
- 开发门槛低:无需深入研究 WiFi 协议栈,仅需通过 STM32 串口发送标准化 AT 指令(如复位
AT+RST、连 WiFiAT+CWJAP、建 TCP 连接AT+CIPSTART),即可控制模块完成联网与数据传输,降低嵌入式联网开发难度。 - 硬件成本低:ESP01S 模块单价通常仅 5-10 元,远低于自带 WiFi 功能的单片机(如 STM32H743),适合低成本物联网项目。
- 适配性强:仅需 STM32 的一个 UART 串口(如 USART1、USART2)即可与模块通信,对 STM32 型号无特殊要求(从入门级 STM32F103 到高性能 STM32F4 均可支持),硬件接线简单(仅需 4 根线:VCC、GND、TX、RX)。
- 支持 TCP/IP 协议:ESP01S 内置 TCP/IP 协议栈,可直接建立 TCP 连接、发送 HTTP 请求(POST/GET),无需 STM32 处理复杂的协议封装(如 HTTP 头构造仅需 STM32 按格式通过串口发送字符串即可)。
四、使用注意事项
- 供电稳定性:ESP01S 在发送数据时电流波动较大,若供电不足(如仅用 STM32 的 3.3V 引脚供电),会导致模块频繁复位、通信中断,建议单独为模块提供 3.3V/500mA 以上的稳压电源,并在 VCC 与 GND 之间并联 100nF 电容滤波。
- 串口波特率匹配:模块默认波特率为 115200bps,需确保 STM32 的串口初始化波特率与模块一致(若不一致,需通过
AT+UART_SET指令修改模块波特率,或重新配置 STM32 串口)。 - AT 指令格式:所有 AT 指令需以
(回车 + 换行)结尾(如本文中printf("AT+CWJAP="K80","11111111" ");),否则模块无法识别指令。 - 数据长度匹配:发送 HTTP 请求时,
Content-Length字段需与实际 JSON 数据长度严格一致(如本文中Content-Length: 150),否则服务器可能无法正确解析数据。
3.模块资料获取
通过网盘分享的文件:ESP01S模块资料
链接: https://pan.baidu.com/s/1cPHplzC_eNXwORpWQcrSYA 提取码: pa4q
--来自百度网盘超级会员v5的分享
2.AT设备注册配置网络指令
printf ("AT+RST
");
Delay_Ms (500);
printf ("AT+CWMODE=1
");
Delay_Ms (100);
printf ("AT+CWJAP="创研微电子","11111111"
");
Delay_Ms (1000); // WiFi连接需要更长时间
Delay_Ms (1000); // WiFi连接需要更长时间
Delay_Ms (1000); // WiFi连接需要更长时间
Delay_Ms (1000); // WiFi连接需要更长时间
Delay_Ms (1000); // WiFi连接需要更长时间
Delay_Ms (500);
// 2. TCP连接(端口号必须在同一行)
printf ("AT+CIPSTART="TCP","8.13x.1xx.6",8652
");
Delay_Ms (100);
3.ESP01S模块数据提交
这里请注意需要加上delay,给芯片一点响应时间防止数据发不过去
// 1. 建立TCP连接
WATER_Data(); // 获取液体数据
printf("AT+CIPSTART="TCP","8.13x.1xx.6",8652
"); // 修改IP和端口
Delay_Ms(100);
// 2. 准备发送数据
printf("AT+CIPSEND=296
");
Delay_Ms(100); // 等待">"提示符
// 3. 发送HTTP头部
printf("POST /PostData HTTP/1.1
"); // 修改路径
Delay_Ms(100);
printf("Host: 8.13x.1xx.6:8652
"); // 修改Host
Delay_Ms(100);
printf("Content-Type: application/json
");
Delay_Ms(100);
printf("Connection: close
");
Delay_Ms(100);
printf("Content-Length: 150
"); // 确保与实际JSON长度匹配
Delay_Ms(100);
printf("
");
Delay_Ms(100);
// 4. 发送JSON数据
printf("{"waterLevel1":%d,"waterLevel2":%d,"waterLevel3":%d,"indoorTemp":%d.%d,"waterTemp":%d.%d,"humidity":%d.%d,"battery":%d,"speed":%d}
",
WATER_Data20, WATER_Data50, WATER_Data80,
at_indoorTemp, at_indoorTemp_xiao,
at_waterTemp, at_waterTemp_xiao,
at_humidity1, at_humidity1_xiao,
battery_percent,diandi
);
Delay_Ms(100);
printf("
");
Delay_Ms(100);
printf("{"waterLevel1":%d,"waterLevel2":%d,"waterLevel3":%d,"indoorTemp":%d.%d,"waterTemp":%d.%d,"humidity":%d.%d,"battery":%d,"speed":%d}
",
WATER_Data20, WATER_Data50, WATER_Data80,
at_indoorTemp, at_indoorTemp_xiao,
at_waterTemp, at_waterTemp_xiao,
at_humidity1, at_humidity1_xiao,
battery_percent,diandi);








