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

【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的数据&#xff0c;单片机接收&#xff0c;使用串口1将数据发送给串口助手 串口2波特率设置74880&#xff0c;串口1设置115200 在初始化的时候需要将复位引脚拉低20ms,然后再拉高20ms, 设置GPIOB的输出模式 对PB12做输出处理 2.…...

网络运维故障处理

本篇纯是之前的工作经验做一个分享&#xff0c;大家看个热闹就好。 1.突然的断网&#xff0c;在上家上班的时候&#xff0c;有一天突然下午厂区内开始出现大面积网络卡顿&#xff0c;teams&#xff0c;outlook不好使等情况&#xff0c;且网盘也上不去&#xff0c;所以开始排查…...

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…...

【爱给网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

苹果为什么不做折叠屏手机?

苹果为什么不做折叠屏手机&#xff1f;折叠屏手机在最近这些年里边&#xff0c;可以说是市场的一个主要在手机上的增长点。你像华W最近推出这个三折叠手机&#xff0c;引起了整个市场的轰动。 可是&#xff0c;为什么苹果到今天为止不为所动&#xff0c;还在那不停地在现在的这…...

目标检测经典算法的个人理解

one stage 1、RCNN -> Fast-RCNN&#xff1a;RPN部分从用传统的算法 -> 用深度学习网络来实现。 2、Fast-RCNN -> Faster-RCNN&#xff1a;从先选region再求Feature -> 先求Feature再选region。 two stage 1、SSD&#xff08;2016&#xff09;&#xff1a;VGG做…...

FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate区别

FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate 都是 LangChain 框架中用于少样本学习的提示模板&#xff08;Prompt Template&#xff09;&#xff0c;但它们在设计和用途上存在一些区别。 FewShotChatMessagePromptTemplate 用途&#xff1a;主要用于聊天场景…...

《程序猿之设计模式实战 · 策略模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

deepinlinux-v23用deepinunioncode初始c例子

deepinlinux-v23用deepinunioncode初始c例子 # deepinunioncode 新建duc工程cmake模版&#xff0c;开局提示 No CMAKE_CXX_COMPILER could be found错误记录 需要duc 左下角磁轮设置 设置cmake和gcc g的文件&#xff0c;如果本机装过了&#xff08;apt install gc…...

前端框架对比选择:如何在众多技术中找到最适合你的

引言 在现代Web开发中&#xff0c;前端框架的选择对项目的成功与否至关重要。随着技术的不断发展&#xff0c;市面上涌现出多种前端框架&#xff0c;每种框架都有其独特的特点、优缺点以及适用场景。本文将对当前主流的前端框架进行详细对比&#xff0c;帮助开发者在选择时做出…...

数据结构—(java)反射,枚举,lambda表达式

文章目录 反射反射的定义&#xff1a;反射相关的类&#xff1a;反射相关的方法&#xff1a;反射示例&#xff1a;获取Class类对象创建指定类的对象反射私有属性&#xff1a;反射私有方法&#xff1a;反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用&#xff1a;Enu…...

机器学习(西瓜书)第 14 章 概率图模型

14.1 隐马尔可夫模型 机器学习最重要的任务&#xff0c;是根据一些已观察到的证据&#xff08;例如训练样本&#xff09;来对感兴趣的未知变量&#xff08;例如类别标记&#xff09;进行估计和推测。概率模型&#xff08;probabilistic model&#xff09;提供了一种描述框架&a…...

Python异步编程-asyncio详解

目录 asyncio简介示例什么是 asyncio?适用场景API asyncio的使用可等待对象什么是可等待对象&#xff1f;协程对象任务对象Future对象 协程什么是协程&#xff1f;基本使用运行协程 Task什么是 Task&#xff1f;创建 Task取消 TaskTask 异常获取Task 回调 TaskGroup什么是 Tas…...

UniApp如何打包成客户端应用程序

像flutter是支持PC宽屏、桌面平台&#xff08;Windows/macOS/Linux&#xff09;&#xff0c;我一直在期望UniApp什么时候也支持PC&#xff0c;桌面平台&#xff0c;终于盼到了。 1、支持PC宽屏 从uni-app 2.9起&#xff0c;支持PC宽屏的适配。 uni-app提供的屏幕适配方案&am…...

你应该掌握的12条饭局规矩!

在职场的舞台上&#xff0c;饭局不仅仅是一场简单的聚餐&#xff0c;它是一场精心编排的社交盛宴&#xff0c;是展示个人魅力、构建人脉网络的重要平台。精通饭局的艺术&#xff0c;能让你在职场的交际中更加自如。以下是酱酒亮哥整理的12条饭局指南&#xff0c;希望你在职场的…...

【541. 反转字符串 II 简单】

题目&#xff1a; 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;…...

基于PHP的丽江旅游管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的丽江旅游管理系统 一 介绍 此丽江旅游系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;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模型训练尤其是大模型领域&#xff0c;存储系统的性能和稳定性直接决定了模型训练、推理、部署任务的效率和成本。随着全球AI行业的爆发带来的数据规模的快速增长&#xff0c;如何高效管理和利用这些数据成为AI模型训练中的一大挑战。 AI模型训练场景面临的五大难题 1. 数…...

智能检索新范式,让AIAgent自主决策,提升RAG效率100%!

市面上的 RAG 系统&#xff0c;不管叫什么名字&#xff0c;本质上只有两种做法&#xff1a; 第一种&#xff0c;一次性检索。把用户的 query 向量化&#xff0c;从语料库里捞出 Top-K 个文档片段&#xff0c;拼成一个大 prompt 塞给模型。GraphRAG、HippoRAG、LightRAG 都属于…...

【CP-05】RTE运行时环境 - SWC的操作系统接口

CP-05_RTE运行时环境【CP-05】RTE运行时环境 - SWC的“操作系统接口”前言在AUTOSAR架构中&#xff0c;RTE&#xff08;Runtime Environment&#xff0c;运行时环境&#xff09;是一个常被提及却难以理解的概念。它像是应用层软件组件&#xff08;SW-C&#xff09;与底层基础软…...

2026年一键生成论文工具对比实测:5款神器从选题到格式全流程护航

写论文的焦虑&#xff0c;是每个科研人和学生都心照不宣的“隐形压力”。选题无从下手&#xff0c;文献检索耗时费力&#xff0c;逻辑框架反复推翻&#xff0c;格式排版让人抓狂&#xff0c;查重降重更是像在和系统玩“猫鼠游戏”。2026年的AI工具早已不是过去那种“打字机”&a…...

告别CAJ格式困扰:3分钟学会用开源工具将知网文献转为PDF

告别CAJ格式困扰&#xff1a;3分钟学会用开源工具将知网文献转为PDF 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换&#xff0c;成功与否&#xff0c;皆是玄学。 项目地址: https://gitcode.com/…...

账务台账数据

银行里说的 “账务台账数据”&#xff0c;本质就是按会计规则把每笔业务逐笔、分户、分科目记下来的完整明细流水 余额 辅助信息&#xff0c;核心是 “可逐笔追溯、可对账、可审计” 的一套明细数据。下面用通俗、具体的方式拆开说&#xff1a;一、银行 “账务台账” 到底是什…...

榨干Codex!OpenAI工程师亲授Codex真正用法

你可能把 Codex 当编程助手用&#xff0c;改改代码&#xff0c;跑跑测试。但它的能力远不止于此。OpenAI 的客户支持工程师 Jason&#xff08;jxnlco&#xff09;告诉你&#xff0c;Codex 其实是一套完整的电脑工作系统&#xff0c;从语音输入到自动化&#xff0c;从浏览器操控…...

紧急预警:DeepSeek代码生成中未公开的3类逻辑漂移现象(附自动化检测脚本+修复模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;紧急预警&#xff1a;DeepSeek代码生成中未公开的3类逻辑漂移现象&#xff08;附自动化检测脚本修复模板&#xff09; 近期在多轮生产级代码审计中发现&#xff0c;DeepSeek-R1&#xff08;v2.5&#x…...

多模型聚合平台如何助力网站AIB测试与选型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 多模型聚合平台如何助力网站AIB测试与选型 对于网站产品经理而言&#xff0c;首页文案的生成质量直接影响用户的第一印象和转化率。…...

yuzu模拟器完整指南:在电脑上畅玩Switch游戏的终极解决方案

yuzu模拟器完整指南&#xff1a;在电脑上畅玩Switch游戏的终极解决方案 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上体验任天堂Switch游戏的魅力吗&#xff1f;yuzu模拟器正是你寻找的完美答案。作为…...

3分钟告别英文恐惧:Android Studio中文界面轻松切换指南

3分钟告别英文恐惧&#xff1a;Android Studio中文界面轻松切换指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾经因…...