您的位置:首页 > 财经 > 金融 > notefolio设计官网_安阳网站自然优化_网站代搭建维护_跟我学seo从入门到精通

notefolio设计官网_安阳网站自然优化_网站代搭建维护_跟我学seo从入门到精通

2024/11/16 16:27:15 来源:https://blog.csdn.net/yyqzjw/article/details/142196011  浏览:    关键词:notefolio设计官网_安阳网站自然优化_网站代搭建维护_跟我学seo从入门到精通
notefolio设计官网_安阳网站自然优化_网站代搭建维护_跟我学seo从入门到精通

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com