【STM32】esp8266连接wifi
1.配置stm32cubemx
使用串口二接收esp8266的数据,单片机接收,使用串口1将数据发送给串口助手

串口2波特率设置74880,串口1设置115200



在初始化的时候需要将复位引脚拉低20ms,然后再拉高20ms,

设置GPIOB的输出模式
对PB12做输出处理


2.esp8266初始化
需要将复位引脚拉低20ms,再拉高20ms



esp8266初始化化的时候有信息,我们可以通过串口2获取信息,然后串口1输出


需要自己实现fputc


我们发现下面有乱码,应该怎么处理,这里会涉及到波特率的转换
3.波特率转换
当我们遇到csum 0xde,需要转换波特率
先处理波特率转换之前的数据,先打印到串口1
void esp8266_response(const char*msg,uint32_t timeout)
{uint32_t Curtick=HAL_GetTick();//获取当前时间uint8_t data;uint8_t i=0;while(1){if(HAL_GetTick()-Curtick>=timeout)//如果超时2s就breakbreak;if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUTcontinue; //如果初始化成功,不会HAL_TIMEOUT,就不continue;printf("%c",data); //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1 //这里串口2的波特率为74880if(data==msg[i]) //chksum 0xde\r\n //匹配到的话,就是初始化成功{i++;if(i==strlen(msg)){break;}}else //重新匹配{ i=0;}}}
波特率转换,需要转换波特率为115200.
//直接复制uart中的
void esp8266_setbaud(uint32_t baud)
{huart2.Instance = USART2;huart2.Init.BaudRate = baud;//需要传参修改需要的波特率huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart2);}


这里的ready只剩下了eady,这是因为串口涉及到硬件,串口转换很快,将数据给你放到data,printf还没来得及处理,已经串口下次转换了,所以就会覆盖,所以我们将串口转换的值放到缓冲区。然后统一输出到串口1

缓冲区及下标


接下来需要将串口2的波特率转换为115200
void esp8266_setbaud(uint32_t baud)
{huart2.Instance = USART2;huart2.Init.BaudRate = baud;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart2);}
4.连接wifi
使用指令即可

void esp8266_link_wifi(const char*name,const char*password)
{char buffer[128];sprintf(buffer,"AT+CWJAP=\"%s\",\"%s\"",name,password);//构建指令字符串HAL_UART_Transmit(&huart2,(uint8_t*)buffer,strlen(buffer),HAL_MAX_DELAY);//向esp8266,串口2发送指令字符串HAL_UART_Transmit(&huart2,(uint8_t*)"\r\n",2,HAL_MAX_DELAY);}
根据esp8266_response(const char*msg,uint32_t timeout)返回值判断是否发生成功,修改esp8266_response函数
uint8_t esp8266_response(const char*msg,uint32_t timeout)
{uint32_t Curtick=HAL_GetTick();//获取当前时间uint8_t data;uint8_t i=0;while(1){if(HAL_GetTick()-Curtick>=timeout)//如果超时2s就breakreturn 0;if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUTcontinue; //如果初始化成功,不会HAL_TIMEOUT,就不continue;//printf("%c",data); //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1 //这里串口2的波特率为74880buffer[num++]=data; if(data==msg[i]) //chksum 0xde\r\n //匹配到的话,就是初始化成功{i++;if(i==strlen(msg)){return 1; //匹配成功}}else //重新匹配{ i=0;}}}
void esp8266_link_wifi(const char*name,const char*password)
{char buffer[512];sprintf(buffer,"AT+CWJAP=\"%s\",\"%s\"",name,password);HAL_UART_Transmit(&huart2,(uint8_t*)buffer,strlen(buffer),HAL_MAX_DELAY);HAL_UART_Transmit(&huart2,(uint8_t*)"\r\n",2,HAL_MAX_DELAY);if(esp8266_response(buffer,2000))//esp8266串口收到{printf("%s",buffer);}else //发送失败{printf("%s",buffer);printf("connect fail");}memset(buffer,0,512);//清空缓冲区}
esp8266.c
#include "esp8266.h"
#include <stdio.h>
#include <string.h>
extern UART_HandleTypeDef huart2;
extern uint8_t buffer[512];
extern uint16_t num;
void esp8266_init(void)
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);HAL_Delay(20);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);HAL_Delay(20);esp8266_response("chksum 0xde\r\n",2000);HAL_Delay(50);esp8266_setbaud(115200);esp8266_response("ready\r\n",1000);printf("%s",buffer);memset(buffer,0,512);}uint8_t esp8266_response(const char*msg,uint32_t timeout)
{uint32_t Curtick=HAL_GetTick();//获取当前时间uint8_t data;uint8_t i=0;while(1){if(HAL_GetTick()-Curtick>=timeout)//如果超时2s就breakreturn 0;if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUTcontinue; //如果初始化成功,不会HAL_TIMEOUT,就不continue;//printf("%c",data); //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1 //这里串口2的波特率为74880buffer[num++]=data; if(data==msg[i]) //chksum 0xde\r\n //匹配到的话,就是初始化成功{i++;if(i==strlen(msg)){return 1;}}else //重新匹配{ i=0;}}}void esp8266_setbaud(uint32_t baud)
{huart2.Instance = USART2;huart2.Init.BaudRate = baud;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart2);}
void esp8266_link_wifi(const char*name,const char*password)
{char buffer[512];sprintf(buffer,"AT+CWJAP=\"%s\",\"%s\"",name,password);HAL_UART_Transmit(&huart2,(uint8_t*)buffer,strlen(buffer),HAL_MAX_DELAY);HAL_UART_Transmit(&huart2,(uint8_t*)"\r\n",2,HAL_MAX_DELAY);if(esp8266_response(buffer,2000))//esp8266串口收到{printf("%s",buffer);}else{printf("%s",buffer);printf("connect fail");}memset(buffer,0,512); //清空缓冲区}
esp8266.h
#ifndef _ESP8266_H_
#define _ESP8266_H_
#include "stm32f4xx_hal.h"
void esp8266_init(void);
uint8_t esp8266_response(const char*msg,uint32_t timeout);
void esp8266_setbaud(uint32_t baud);
void esp8266_link_wifi(const char*name,const char*password);
#endif



相关文章:
【STM32】esp8266连接wifi
1.配置stm32cubemx 使用串口二接收esp8266的数据,单片机接收,使用串口1将数据发送给串口助手 串口2波特率设置74880,串口1设置115200 在初始化的时候需要将复位引脚拉低20ms,然后再拉高20ms, 设置GPIOB的输出模式 对PB12做输出处理 2.…...
网络运维故障处理
本篇纯是之前的工作经验做一个分享,大家看个热闹就好。 1.突然的断网,在上家上班的时候,有一天突然下午厂区内开始出现大面积网络卡顿,teams,outlook不好使等情况,且网盘也上不去,所以开始排查…...
C++第十一节课 new和delete
一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数(new会自动调用构造函数;delete会调用析构函数) class A { public:A(int a 0): _a(a){cout <&l…...
【爱给网-注册安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
苹果为什么不做折叠屏手机?
苹果为什么不做折叠屏手机?折叠屏手机在最近这些年里边,可以说是市场的一个主要在手机上的增长点。你像华W最近推出这个三折叠手机,引起了整个市场的轰动。 可是,为什么苹果到今天为止不为所动,还在那不停地在现在的这…...
目标检测经典算法的个人理解
one stage 1、RCNN -> Fast-RCNN:RPN部分从用传统的算法 -> 用深度学习网络来实现。 2、Fast-RCNN -> Faster-RCNN:从先选region再求Feature -> 先求Feature再选region。 two stage 1、SSD(2016):VGG做…...
FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate区别
FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate 都是 LangChain 框架中用于少样本学习的提示模板(Prompt Template),但它们在设计和用途上存在一些区别。 FewShotChatMessagePromptTemplate 用途:主要用于聊天场景…...
《程序猿之设计模式实战 · 策略模式》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
deepinlinux-v23用deepinunioncode初始c例子
deepinlinux-v23用deepinunioncode初始c例子 # deepinunioncode 新建duc工程cmake模版,开局提示 No CMAKE_CXX_COMPILER could be found错误记录 需要duc 左下角磁轮设置 设置cmake和gcc g的文件,如果本机装过了(apt install gc…...
前端框架对比选择:如何在众多技术中找到最适合你的
引言 在现代Web开发中,前端框架的选择对项目的成功与否至关重要。随着技术的不断发展,市面上涌现出多种前端框架,每种框架都有其独特的特点、优缺点以及适用场景。本文将对当前主流的前端框架进行详细对比,帮助开发者在选择时做出…...
数据结构—(java)反射,枚举,lambda表达式
文章目录 反射反射的定义:反射相关的类:反射相关的方法:反射示例:获取Class类对象创建指定类的对象反射私有属性:反射私有方法:反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用:Enu…...
机器学习(西瓜书)第 14 章 概率图模型
14.1 隐马尔可夫模型 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测。概率模型(probabilistic model)提供了一种描述框架&a…...
Python异步编程-asyncio详解
目录 asyncio简介示例什么是 asyncio?适用场景API asyncio的使用可等待对象什么是可等待对象?协程对象任务对象Future对象 协程什么是协程?基本使用运行协程 Task什么是 Task?创建 Task取消 TaskTask 异常获取Task 回调 TaskGroup什么是 Tas…...
UniApp如何打包成客户端应用程序
像flutter是支持PC宽屏、桌面平台(Windows/macOS/Linux),我一直在期望UniApp什么时候也支持PC,桌面平台,终于盼到了。 1、支持PC宽屏 从uni-app 2.9起,支持PC宽屏的适配。 uni-app提供的屏幕适配方案&am…...
你应该掌握的12条饭局规矩!
在职场的舞台上,饭局不仅仅是一场简单的聚餐,它是一场精心编排的社交盛宴,是展示个人魅力、构建人脉网络的重要平台。精通饭局的艺术,能让你在职场的交际中更加自如。以下是酱酒亮哥整理的12条饭局指南,希望你在职场的…...
【541. 反转字符串 II 简单】
题目: 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,…...
基于PHP的丽江旅游管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的丽江旅游管理系统 一 介绍 此丽江旅游系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…...
vue3+Element-plus el-input 输入框组件二次封装(支持金额、整数、电话、小数、身份证、小数点位数控制,金额显示中文提示等功能)
一、效果图 二、组件集成了以下功能 1、输入金额--支持千分号显示、可设置decimalLimit来调整小数点位数 2、金额鼠标移入提示中文--标签添加isTip开启中文提示则不允许开启千分号显示showThousands 3、输入手机号--设置inputTypephone 4、输入整数---设置inputTypeinteger 5、…...
jQuery 简介 ③ ready()事件函数、jQuery 二个原则及容错机制
文章目录 jQuery 简介 ③五、ready() 准备就绪时执行代码六、jQuery 核心1、Get and Set in One 原则2、Get first Set all 原则3、容错机制:jQuery 简介 ③ 五、ready() 准备就绪时执行代码 如果我们在中引入jQuery库文件,并编写相应的jQuery代码来操作DOM元素。这很可能导…...
选择Alluxio来解决AI模型训练场景数据访问的五大理由
在AI模型训练尤其是大模型领域,存储系统的性能和稳定性直接决定了模型训练、推理、部署任务的效率和成本。随着全球AI行业的爆发带来的数据规模的快速增长,如何高效管理和利用这些数据成为AI模型训练中的一大挑战。 AI模型训练场景面临的五大难题 1. 数…...
TypeVar
## 关于Python里的TypeVar,你可能想知道的 最近在整理一些旧代码,翻到几年前写的一个通用缓存工具类,里面用到了TypeVar。当时注释里只简单写了一句“用于类型提示”,现在回头看,觉得可以展开聊聊这个东西。 TypeVar是…...
Netbird iOS客户端连接问题分析与解决方案
Netbird iOS客户端连接问题分析与解决方案 Netbird作为一款优秀的P2P网络工具,在跨平台使用中可能会遇到一些兼容性问题。近期iOS客户端出现的连接异常现象引起了开发者社区的关注。本文将深入分析该问题的技术背景,并提供有效的解决方案。 问题现象描述…...
Windows 10终极清理:一键彻底卸载OneDrive完整指南
Windows 10终极清理:一键彻底卸载OneDrive完整指南 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 还在为Windows 10自带的OneDri…...
Cursor Pro功能解锁技术解析与实战方案
Cursor Pro功能解锁技术解析与实战方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limit. / Too m…...
5分钟掌握D3KeyHelper:暗黑3玩家的智能按键助手
5分钟掌握D3KeyHelper:暗黑3玩家的智能按键助手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中复杂的技能循环而手忙…...
数聚智连转战港交所:年营收16亿 净利4340万 蓝标与险峰是股东
雷递网 雷建平 4月2日北京数聚智连科技股份有限公司(简称:“数聚智连”)日前递交招股书,准备在港交所上市。数聚智连曾向深交所创业板递交招股书,计划募资8亿元,最终IPO被终止,此番是数聚智连转…...
如何快速掌握LeaguePrank:英雄联盟客户端个性化修改完整指南
如何快速掌握LeaguePrank:英雄联盟客户端个性化修改完整指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟客户端中展示独特的个人风格吗?LeaguePrank是一个基于LCU API的英雄联盟客户…...
千问3.5-2B网页版深度解析:前端上传逻辑、后端推理链路、JSON返回结构
千问3.5-2B网页版深度解析:前端上传逻辑、后端推理链路、JSON返回结构 1. 平台概述 千问3.5-2B是Qwen系列中的轻量级视觉语言模型,专为图片理解与文本生成任务优化设计。这个开箱即用的解决方案将复杂的AI能力封装成简单的网页交互,用户无需…...
别再自己写提示词了!用DeepSeek-V2规划,让墨刀AI生成你的APP原型图(附完整prompt模板)
用DeepSeek-V2重构提示词策略:打造高精度AI原型设计工作流 当墨刀AI生成的页面总与预期相差甚远时,问题往往不在工具本身,而在于我们传递需求的方式。传统"一句话需求"的粗放指令模式,就像让一位建筑师仅凭"想要栋…...
AMD Ryzen处理器深度调试完全指南:5步掌握SMUDebugTool核心调优技巧
AMD Ryzen处理器深度调试完全指南:5步掌握SMUDebugTool核心调优技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
