【STM32】esp8266连接wifi

news2024/11/17 17:34:48

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就break
				break;
			if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUT
				continue;      //如果初始化成功,不会HAL_TIMEOUT,就不continue;
			
			printf("%c",data);   //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1  //这里串口2的波特率为74880
		    
		 if(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就break
				return 0;
			if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUT
				continue;      //如果初始化成功,不会HAL_TIMEOUT,就不continue;
			
			//printf("%c",data);   //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1  //这里串口2的波特率为74880
		   buffer[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就break
				return 0;
			if(HAL_UART_Receive(&huart2,(uint8_t*)&data,1,10)==HAL_TIMEOUT)//如果10ms没收到esp8266发给单片机的数据,就返回HAL_TIMEOUT
				continue;      //如果初始化成功,不会HAL_TIMEOUT,就不continue;
			
			//printf("%c",data);   //单片机把串口2的数据一个字节一个字节读到data中,然后通过printf打印到串口1  //这里串口2的波特率为74880
		   buffer[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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多旋翼无人机挂载电激发弹发射器技术详解

多旋翼无人机挂载电激发弹发射器技术是一种结合了无人机的高机动性和电激发弹发射器的精确打击能力的先进技术。以下是对该技术的详细解析&#xff1a; 一、多旋翼无人机概述 多旋翼无人机&#xff0c;也称为多轴飞行器或多旋翼飞行器&#xff0c;是一种具有三个及以上旋翼轴…

【pycharm】安装以及简单使用教程

以windows版本举例&#xff1a; 1、首先去Pycharm官网&#xff0c;或者直接输入网址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff0c;下载PyCharm安装包&#xff0c;根据自己电脑的操作系统进行选择&#xff0c;对于windows系统选择下图的…

大数据处理技术:Hadoop开发环境搭建

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 JavaJDK的配置 5.2 Hadoop安装与伪分布式集群搭建 5.3 HDFS系统初体验 6 实验结果 6.1 JavaJDK的配置结果 6.2 Hadoop安装与伪分布式集群搭建结果 6.3 HDFS系统初体验结果 1 实验名称 Ha…

用Cursor生成一个代办事项列表的功能

一、本地新建html文件 二、输入代码 2.1 Cursor描述 其实这一段代码使用Cursor生成&#xff0c;可以输入如下内容&#xff0c;即可自动生成代码&#xff1a; 创建一个代办事项列表应用的基本结构&#xff0c;呈现在可交互界面上&#xff0c;1&#xff0c;提供可交互界面&…

乐器检测系统源码分享

乐器检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

【Vue】- Vue表达式

文章目录 知识回顾前言Vue项目介绍 源码分析1. 项目结构介绍&#xff08;单页面应用程序&#xff09;2. 项目运行流程图(单页面应用程序)3. 选项式和组合式api4. 插值表达式 {{}} 胡子语法5. reactive函数6. ref表达式 拓展知识reactive和ref的选择 总结 知识回顾 前言 Vue项…

利用python处理线性规划问题

利用python处理线性规划问题 linprog函数基本例题例题1例题2 典型例题例一&#xff1a;生产决策问题例一&#xff1a;生产决策问题 &#xff08;例题和部分解答思路来自清风老师&#xff09; linprog函数 导入模块 from scipy.optimize import linprog函数功能 Linear progra…

计算机毕业设计 毕业季一站式旅游服务定制平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

视频笔记1

玩转apollo课程内讲解靠边启动场景_哔哩哔哩_bilibili 用open_space_roi_decider 改后 善用坐标点 如何不影响其它场景&#xff1a;if判断

Gradio快速部署构建AIGC的web应用 ,python

Gradio快速部署构建AIGC的web应用 &#xff0c;python Gradio开源项目链接&#xff1a; https://github.com/gradio-app/gradiohttps://github.com/gradio-app/gradio &#xff08;1&#xff09;python的pip安装&#xff1a; pip install gradio &#xff08;2&#xff09;写…

webpack打包原理

目录 1、搭建结构&#xff0c;读取配置参数2、配置参数对象初始化 Compiler&#xff08;new Compiler(webpackOptions)&#xff09;3、挂载配置文件中的插件&#xff0c;4、执行Compiler 中的 run 方法进行编译5、根据配置文件中的entry 配置项找到所有的入口6、从入口文件出发…

HAL库学习梳理——UART

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关UART课程知识和应用做一个梳理。 省流&#xff1a; uint8_t byteNumber 0x5a;uint8_t byteArray[] {0,1,2,3,4,5};char ch a;char *str "Hello word";HAL_UART_Transmit(&huart1,&by…

Windows环境下 VS2022 编译 Xvid 源码

Xvid Xvid 是一个开源的视频编解码器&#xff0c;遵循 MPEG-4 视频编码标准&#xff0c;特别是 MPEG-4 Part 2 Advanced Simple Profile。它被广泛用于视频的压缩和解压&#xff0c;尤其是在互联网上分享视频文件时&#xff0c;因为它能够有效地减小文件大小而不会过多损失视频…

切线空间:unity中shader切线空间,切线矩阵,TBN矩阵 ,法线贴图深度剖析

unity中shader切线空间 看了网上各种解释&#xff0c;各种推理。直接脑袋大。感觉复杂的高大上。当深入了解后&#xff0c;才发是各种扯淡。 一切从模型法向量开始 在shader中&#xff0c;大部分的光照计算都是与法向量有关。通过法向量和其他向量能计算出模型在光线照射下的…

How to see if openAI (node js) createModeration response “flagged“ is true

题意&#xff1a;如何查看 OpenAI (Node.js) createModeration 响应中的 "flagged" 是否为 true 问题背景&#xff1a; Using the OpenAI createModeration feature, I am trying to see if the string gets flagged or not. 使用 OpenAI 的 createModeration 功能…

医学数据分析实训 项目一 医学数据采集

项目一 医学数据采集 一、实践目的 了解医学数据的特点&#xff1b;熟悉常见的医学公共数据库的使用方法&#xff1b;掌握获取医学数据的方法&#xff1b; 二、实践平台 操作系统&#xff1a;Windows10 及以上Python 版本&#xff1a;3.8.x 及以上PyCharm 或 Anoconda 集成…

Ubuntu 安装最新 Google Chrome 浏览器

谷歌浏览器使用简单并且用户友好&#xff0c;使用它浏览互联网愉悦至极。许多用户喜欢 Chrome&#xff0c;因为它加载网页又快又流畅。Chrome 提供强大的安全功能&#xff0c;帮助用户保持在线安全。Google Chrome 官方提供了一个 Debian 软件包存储库&#xff0c;基于 Debian …

Llama Factory :百种以上语言模型的统一高效微调框架

人工智能咨询培训老师叶梓 转载标明出处 大模型适应到特定下游任务时&#xff0c;传统的全参数微调方法成本高昂&#xff0c;因此&#xff0c;研究者们一直在探索更高效的微调技术。由北京航空航天大学和北京大学的研究团队提出了一个名为Llama Factory的统一框架&#xff0c;…

【免费刷题】实验室安全第一知识题库分享

道路千万条&#xff0c;实验安全第一条。 嘿&#xff0c;实验室的小伙伴们&#xff01;是不是还在为实验室安全考试而烦恼&#xff1f;别担心&#xff0c;今天就让我来分享一些实用的题库&#xff0c;帮助你轻松应对考试&#xff0c;同时也更好地保护自己和实验室的安全。 一、…

前端开发第三节课

20-目录文件夹和根目录 4.8图像标签和路径&#xff08;重点&#xff09; 2.路径&#xff08;前期铺垫知识&#xff09; &#xff08;1&#xff09;目录文件夹和目录 实际工作中&#xff0c;我们的文件不能随便乱放&#xff0c;否则用起来很难快速地找到他们&#xff0c;因此…