【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



相关推荐
星辰pid5 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂
威桑7 小时前
STM32 专有名词缩写整合
stm32·单片机·嵌入式硬件
星源~7 小时前
tree 命令集成到 Git Bash:可视化目录结构的指南
git·单片机·物联网·嵌入式·项目开发
SKYDROID云卓小助手8 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
所念皆星海9118 小时前
图灵完备之路(数电学习三分钟)----数据选择器与总线
嵌入式硬件·通信·数电
智者知已应修善业10 小时前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
开-悟10 小时前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
Wangshanjie_9812 小时前
【STM32】-串口通讯
stm32
许白掰12 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
DIY机器人工房13 小时前
0.96寸OLED显示屏 江协科技学习笔记(36个知识点)
笔记·科技·stm32·单片机·嵌入式硬件·学习·江协科技