当前位置: 首页 > 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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 进阶SpringBoot之异步任务、邮件任务和定时执行任务
  • 高级I/O知识分享【5种IO模型 || select || poll】
  • 7000长文:一文读懂Agent,大模型的下一站
  • Netty+HTML5+Canvas 网络画画板实时在线画画
  • 数据结构-2.9.双链表
  • 科技引领未来生活——“光影漫游者”展览馆应用—轻空间
  • 每日学习一个数据结构-布隆过滤器Bloom Filter
  • 数据结构:二叉树(2)
  • Linux 清空redis缓存及查询key值
  • 修改 Visual Studio 的主题颜色、背景颜色、字体
  • 分布式计算技术是什么?在数据集成值得作用?
  • Java项目实战II基于Java+Spring Boot+MySQL的车辆管理系统(开发文档+源码+数据库)
  • Stable Cascade | ComfyUI API 工作流格式优化
  • 教你如何在微信小程序中轻松实现人脸识别功能
  • STM32——SPI
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Android 架构优化~MVP 架构改造
  • docker容器内的网络抓包
  • ES6之路之模块详解
  • Webpack 4 学习01(基础配置)
  • yii2中session跨域名的问题
  • 近期前端发展计划
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端学习笔记之观察者模式
  • 前端之Sass/Scss实战笔记
  • 浅谈web中前端模板引擎的使用
  • 区块链将重新定义世界
  • 数据科学 第 3 章 11 字符串处理
  • No resource identifier found for attribute,RxJava之zip操作符
  • # 职场生活之道:善于团结
  • $.ajax()参数及用法
  • (+4)2.2UML建模图
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (day 12)JavaScript学习笔记(数组3)
  • (day18) leetcode 204.计数质数
  • (function(){})()的分步解析
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (python)数据结构---字典
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (三)c52学习之旅-点亮LED灯
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)大道至简,职场上做人做事做管理
  • (转载)OpenStack Hacker养成指南
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net CF下精确的计时器
  • .NET Core 2.1路线图
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net6 webapi log4net完整配置使用流程
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项