STM32 通过 ESP8266 通信详解
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料
一、引言
在物联网应用中,STM32 作为性能强大的微控制器,具备丰富的外设和较高的处理能力,但缺乏直接的网络通信能力。而 ESP8266 是一款低成本、高性能的 Wi-Fi 模块,能实现与互联网的连接。将 STM32 与 ESP8266 结合使用,可以让 STM32 设备轻松接入网络,实现远程数据传输和控制等功能。本文将详细介绍 STM32 如何通过 ESP8266 进行通信,包括硬件连接、软件配置和代码实现。
二、硬件连接
2.1 所需硬件
- STM32 开发板(以 STM32F103C8T6 为例)
- ESP8266 Wi-Fi 模块
- 杜邦线若干
- 电源模块(为 ESP8266 提供稳定的 3.3V 电源)
2.2 连接方式
通常,STM32 与 ESP8266 通过串口进行通信。以下是一种常见的连接方式:
STM32 | ESP8266 |
---|---|
TX(USART) | RX |
RX(USART) | TX |
GND | GND |
3.3V | VCC |
需要注意的是,ESP8266 的工作电压为 3.3V,而 STM32 的部分引脚输出为 5V,为避免损坏 ESP8266,需要进行电平转换。如果 STM32 的引脚支持 3.3V 输出,则可以直接连接。
三、软件配置
3.1 STM32 串口配置
在 STM32 中,需要配置串口以与 ESP8266 进行通信。以下是使用 CubeMX 和 HAL 库进行串口配置的步骤:
- 打开 CubeMX,选择对应的 STM32 芯片型号。
- 配置 RCC 时钟,选择外部晶振作为时钟源,并配置系统时钟频率。
- 使能所需的串口(如 USART1),设置波特率为 115200(与 ESP8266 默认波特率一致)。
- 生成代码并导入到 Keil 或其他开发环境中。
3.2 ESP8266 初始化
ESP8266 在使用前需要进行一些初始化操作,如设置工作模式、连接 Wi-Fi 网络等。可以通过向 ESP8266 发送 AT 指令来完成这些操作。常见的 AT 指令如下:
AT+RST
:复位 ESP8266AT+CWMODE=1
:设置为 STA 模式(客户端模式)AT+CWJAP="SSID","PASSWORD"
:连接到指定的 Wi-Fi 网络
四、代码实现
4.1 STM32 代码
以下是一个使用 STM32 HAL 库实现与 ESP8266 通信的示例代码:
#include "stm32f1xx_hal.h"UART_HandleTypeDef huart1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);// 发送 AT 指令到 ESP8266
void send_AT_command(const char* command) {HAL_UART_Transmit(&huart1, (uint8_t*)command, strlen(command), HAL_MAX_DELAY);HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();// 复位 ESP8266send_AT_command("AT+RST");HAL_Delay(2000);// 设置为 STA 模式send_AT_command("AT+CWMODE=1");HAL_Delay(1000);// 连接到 Wi-Fi 网络send_AT_command("AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"");HAL_Delay(5000);while (1){// 主循环}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}static void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();
}void Error_Handler(void)
{while(1){}
}
4.2 代码解释
send_AT_command
函数:用于向 ESP8266 发送 AT 指令,并在指令末尾添加换行符。main
函数:初始化 STM32 的硬件资源,然后依次发送复位、设置工作模式和连接 Wi-Fi 网络的 AT 指令。
五、数据传输
在 STM32 与 ESP8266 建立连接后,可以进行数据传输。例如,通过 TCP 或 UDP 协议与服务器进行通信。以下是一个使用 TCP 协议发送数据的示例代码:
// 连接到 TCP 服务器
send_AT_command("AT+CIPSTART=\"TCP\",\"your_server_IP\",your_server_port");
HAL_Delay(3000);// 发送数据
send_AT_command("AT+CIPSEND=5"); // 发送 5 个字节的数据
HAL_Delay(1000);
send_AT_command("Hello");
HAL_Delay(2000);// 关闭 TCP 连接
send_AT_command("AT+CIPCLOSE");
六、注意事项
- 波特率匹配:确保 STM32 与 ESP8266 的串口波特率一致,否则会导致通信失败。
- AT 指令响应:在发送 AT 指令后,需要等待 ESP8266 的响应,以确保指令执行成功。可以通过读取串口接收缓冲区来获取响应信息。
- 电源稳定性:ESP8266 在工作时对电源稳定性要求较高,建议使用稳压电源模块为其供电。
通过以上步骤,你可以实现 STM32 与 ESP8266 的通信,让 STM32 设备具备网络通信能力,实现更多的物联网应用。
相关文章:
STM32 通过 ESP8266 通信详解
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关注我的知乎:对error视而不见 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 🍎获取更多嵌入式资料可点击链接进群领…...

Qt/C++开发监控GB28181系统/sip协议/同时支持udp和tcp模式/底层协议解析
一、前言说明 在gb28181-2011协议中,只有udp要求,从2016版本开始要求支持tcp,估计也是在多年的实际运行过程中,发现有些网络环境差的场景下,一些udp交互指令丢失导致功能异常,所以后面修订的时候增加了tcp…...

晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册
晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册 CK-FR03-TCP是一款基于射频识别技术的高频RFID标签读卡器,读卡器工作频率为13.56MHZ,支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协…...
山海鲸轻 3D 渲染技术深度解析:预渲染如何突破多终端性能瓶颈
在前期课程中,我们已系统讲解了山海鲸两大核心渲染模式——云渲染与端渲染的技术特性及配置方法。为满足复杂场景下的差异化需求,山海鲸创新推出轻3D渲染功能,本文将深度解析该技术的实现原理与操作实践。 一、轻3D功能研发背景 针对多终端协…...

t014-项目申报管理系统 【springBoot 含源码】
项目演示视频 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,项目信息因为其管理内容繁杂,管理数量繁多导致手工进行…...
阻止H5页面中键盘收起的问题
在移动端H5开发中,当输入框失去焦点时,键盘会自动收起,但有时我们需要阻止这种行为。以下是几种解决方案: 常见原因 输入框失去焦点触发键盘收起页面滚动或触摸其他区域导致键盘收起某些浏览器(特别是iOS Safari)的默认行为 解…...
将 AI 解答转换为 Word 文档
相关说明 DeepSeek 风靡全球的2025年,估计好多人都已经试过了,对于理科老师而言,有一个使用痛点,就是如何将 AI 输出的 mathjax 格式的符号转化为我们经常使用的 mathtype 格式的,以下举例说明。 温馨提示࿱…...
AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?
一、引言:技术细节与系统工程的本质分野 在 AI 产品开发的战场中,Prompt 工程与产品工程的边界模糊正在引发深刻的认知革命。当工程师们沉迷于优化 “请用三段式结构分析用户需求” 这类提示词时,产品经理却在思考如何通过用户行为数据验证 …...

Go语言开发的GMQT物联网MQTT消息服务器(mqtt Broker)支持海量MQTT连接和快速低延时消息传输-提供源码可二次开发定制需求
关于GMQT物联网MQTT消息平台 GoFly社区推出《GMQT物联网MQTT消息平台》,完全使用高性能的Go语言编写,内嵌数据库(不依赖三方库), 全面支持MQTT的v3.0.0、v3.1.1以及完全兼容 MQTT v5 功能。利用Go语言高并发性、高效利用服务器资源、跨平台支…...
JavaScript es6 语法 map().filter() 链式调用,语法解析 和常见demo
摘要: map:遍历数组并对每个元素执行回调函数,返回一个新数组 filter:对 map 返回的数组进行过滤,返回满足条件的元素组成的新数组 1.数字数组处理 const numbers [1, 2, 3, 4, 5];// 先平方,再筛选偶数…...

leetcode2221. 数组的三角和-medium
1 题目:数组的三角和 官方标定难度:中 给你一个下标从 0 开始的整数数组 nums ,其中 nums[i] 是 0 到 9 之间(两者都包含)的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值: nums 初始…...

Express教程【001】:Express创建基本的Web服务器
文章目录 1、初识express1.1 什么是Express1.2 主要特点1.3 Express的基本使用1.3.1 安装1.3.2 创建基本的Web服务器 1、初识express 目标: 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创…...

asio之async_result
简介 async_result用来表示异步处理返回类型 async_result 是类模板 type:为类模板中声明的类型,对于不同的类型,可以使用类模板特例化,比如针对use_future...

代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法
图论 题目 94. 城市间货物运输 I Bellmen_ford 队列优化算法 SPFA 大家可以发现 Bellman_ford 算法每次松弛 都是对所有边进行松弛。 但真正有效的松弛,是基于已经计算过的节点在做的松弛。 本图中,对所有边进行松弛,真正有效的松弛&#…...

独立机构软件第三方检测:流程、需求分析及电商软件检验要点?
独立机构承担着对软件进行第三方检测的任务,这一环节对于提升软件的质量和稳定性起到了极其关键的作用。检测过程拥有一套完善的流程,目的在于确保检测结果的精确性,并保障软件达到高标准。 需求分析 确保软件测试需求清晰十分关键。我们需…...
Java构建Tree并实现节点名称模糊查询
乐于学习分享… 大家加油努力 package com.tom.backtrack;import lombok.Data; import lombok.Getter;import java.util.ArrayList; import java.util.List; import java.util.Objects;/*** 树节点** author zx* date 2025-05-27 19:51*/ Data public class TreeNode {private …...
shadcn/ui
文章目录 前言✅ 核心特点📦 支持组件(常用)🚀 安装使用(框架支持)初始化(Next.js 项目为例)添加一个组件 🧠 对比其他组件库📘 官方资源✅ 总结✅ 功能特性&…...

华为FreeArc能和其他华为产品共用充电线吗?
最近刚买的FreeArc终于到手啦,看到网上有朋友说,这次的耳机是不附带充电线,开箱后发现果真如此,那FreeArc到底用什么规格的充电线,能不能和华为的Type-C数据线通用,我来给大家解答一下吧! Free…...

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结
文章目录 创建房间类创建房间类实现房间管理器 实现匹配器(3)验证匹配功能问题:匹配按钮不改变验证多开 小结 创建房间类 LOL,通过匹配的方式,自动给你加入到一个房间,也可手动创建游戏房间 这一局游戏,进行的“场所…...

实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.7 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第3章单因子实验:方差分析3.11思考题3.7 R语言解题。主要涉及单因子方差分析,正态性假设检验,残差与拟合值的关系图,平方根变换。 X<-c(…...

【知识点】第2章:Python程序实例解析
文章目录 知识点整理Python程序语法元素分析 练习题判断题填空题选择题 知识点整理 Python程序语法元素分析 Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。 程序的格式框架 Python语言采用严格的 “缩进” 来表明程序的格式框架。缩进…...
从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理
问题背景 最近在项目中遇到一个问题:在档口分享功能中,需要动态生成一个分享图片。代码是这样写的: // 项目中的代码 val shareView LayoutInflater.from(thisStallMainActivityV1).inflate(R.layout.share_header_stall_main_layout, nul…...
Ubuntu 22.04 上使用 Docker 安装 RagFlow
GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…...

每日Prompt:指尖做画
提示词 微缩景观,微距摄影,俯瞰角度,特写,硕大食指手指甲,一个小小的人正在做画,小人右手拿画笔,小人左手拿调色盘,在指甲上作画,画的是中国古代山水画,背景…...
Python打卡训练营day40——2025.05.30
知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中 展平操作:除第一个维度batchsize外全部展平 dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练…...
Java八股-数据类型转换有哪些?类型互转会有什么问题?为什么用bigDecimal 不用double ?自动装箱和拆箱?包装类?
Java中有哪些数据类型转换? 显示类型转换:在前面一个括号,里面写上要转换的类型 隐式类型转换:小范围的数据类型转大范围的,int到long,float到double 字符串转整形或浮点:整形:In…...

redis未授权(CVE-2022-0543)
概述 Redis 默认绑定在 0.0.0.0:6379,在未配置防火墙或访问控制的情况下会将服务暴露在公网上。若未设置访问密码(默认通常为空),攻击者可直接未授权访问 Redis。利用 Redis 提供的 CONFIG 命令,攻击者可修改配置并将…...

【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!
Linux 系统相比其他操作系统具有更高的安全性,其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。 若普通用户需要进行系统级变更,必须通过su或sudo命令提权。 1.su与sudo的本质区别 su 要求直接共享 root 密码&…...
LevelDB、BoltDB 和 RocksDB区块链应用比较
LevelDB、BoltDB 和 RocksDB 是三种常用的键值存储数据库,它们在区块链领域(如以太坊、比特币等)或其他高性能应用中有广泛应用。虽然它们都是嵌入式键值存储,但设计目标、性能特性、功能支持和适用场景有显著差异。以下是它们的详…...
c/c++的opencv图像金字塔缩放
图像金字塔缩放:OpenCV C/C 实践 📐 图像金字塔是计算机视觉中一种重要且基础的多尺度表示方法。它通过对原始图像进行连续的下采样(缩小)或上采样(放大)操作,生成一系列不同分辨率的图像。这些…...