当前位置: 首页 > article >正文

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 通过串口进行通信。以下是一种常见的连接方式:

STM32ESP8266
TX(USART)RX
RX(USART)TX
GNDGND
3.3VVCC

需要注意的是,ESP8266 的工作电压为 3.3V,而 STM32 的部分引脚输出为 5V,为避免损坏 ESP8266,需要进行电平转换。如果 STM32 的引脚支持 3.3V 输出,则可以直接连接。

三、软件配置

3.1 STM32 串口配置

在 STM32 中,需要配置串口以与 ESP8266 进行通信。以下是使用 CubeMX 和 HAL 库进行串口配置的步骤:

  1. 打开 CubeMX,选择对应的 STM32 芯片型号。
  2. 配置 RCC 时钟,选择外部晶振作为时钟源,并配置系统时钟频率。
  3. 使能所需的串口(如 USART1),设置波特率为 115200(与 ESP8266 默认波特率一致)。
  4. 生成代码并导入到 Keil 或其他开发环境中。

3.2 ESP8266 初始化

ESP8266 在使用前需要进行一些初始化操作,如设置工作模式、连接 Wi-Fi 网络等。可以通过向 ESP8266 发送 AT 指令来完成这些操作。常见的 AT 指令如下:

  • AT+RST:复位 ESP8266
  • AT+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 设备具备网络通信能力,实现更多的物联网应用。

http://www.lryc.cn/news/2393013.html

相关文章:

  • Qt/C++开发监控GB28181系统/sip协议/同时支持udp和tcp模式/底层协议解析
  • 晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册
  • 山海鲸轻 3D 渲染技术深度解析:预渲染如何突破多终端性能瓶颈
  • t014-项目申报管理系统 【springBoot 含源码】
  • 阻止H5页面中键盘收起的问题
  • 将 AI 解答转换为 Word 文档
  • AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?
  • Go语言开发的GMQT物联网MQTT消息服务器(mqtt Broker)支持海量MQTT连接和快速低延时消息传输-提供源码可二次开发定制需求
  • JavaScript es6 语法 map().filter() 链式调用,语法解析 和常见demo
  • leetcode2221. 数组的三角和-medium
  • Express教程【001】:Express创建基本的Web服务器
  • asio之async_result
  • 代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法
  • 独立机构软件第三方检测:流程、需求分析及电商软件检验要点?
  • Java构建Tree并实现节点名称模糊查询
  • shadcn/ui
  • 华为FreeArc能和其他华为产品共用充电线吗?
  • [网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结
  • 实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.7 R语言解题
  • 【知识点】第2章:Python程序实例解析
  • 从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理
  • Ubuntu 22.04 上使用 Docker 安装 RagFlow
  • 每日Prompt:指尖做画
  • Python打卡训练营day40——2025.05.30
  • Java八股-数据类型转换有哪些?类型互转会有什么问题?为什么用bigDecimal 不用double ?自动装箱和拆箱?包装类?
  • redis未授权(CVE-2022-0543)
  • 【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!
  • LevelDB、BoltDB 和 RocksDB区块链应用比较
  • c/c++的opencv图像金字塔缩放
  • PDF文件转换之输出指定页到新的 PDF 文件