【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

c 复制代码
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中的

c 复制代码
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

c 复制代码
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

使用指令即可

c 复制代码
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函数

c 复制代码
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;

		 }
	 }




}
c 复制代码
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

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

c 复制代码
#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



相关推荐
培林将军6 分钟前
C51单片机-单按键输入识别,键盘消抖
单片机·嵌入式硬件·计算机外设
hong16168832 分钟前
单片机(Microcontroller)原理及应用
单片机·嵌入式硬件
Caihua_X38 分钟前
ARM和51和stm32的区别
arm开发·stm32·嵌入式硬件
MGT_979611 小时前
ESP01的AT指令连接到阿里云平台
嵌入式硬件·物联网·阿里云·云计算
OH五星上将12 小时前
如何编译OpenHarmony SDK API
嵌入式硬件·移动开发·api·sdk·harmonyos·openharmony·鸿蒙开发
JT灬新一12 小时前
ARM驱动学习之 IOremap实现GPIO 读
arm开发·单片机·学习
我的老子姓彭14 小时前
STM32启用FPU浮点运算
stm32·单片机·嵌入式硬件
AI+程序员在路上14 小时前
STM32读写内部flash
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi18 小时前
基于单片机的风机故障检测装置的设计与实现(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计
OH五星上将18 小时前
如何更换OpenHarmony SDK API 10
驱动开发·嵌入式硬件·sdk·harmonyos·openharmony·鸿蒙开发