STM32-笔记30-编程实现esp8266联网功能

串口2连接ESP8266模块

复制项目文件34-ESP8266串口间的通信

重命名为35-编程实现ESP8266联网功能

打开项目文件

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);esp8266_init(115200);// printf("hello word!\r\n");while(1){ //esp8266_receive_data();
//        esp8266_test();
//        delay_ms(10);}
}

esp8266.c

#include "sys.h"
#include "esp8266.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE];//定义一个数组,用来保存接收的数据
uint16_t esp8266_cnt = 0,esp8266_cntPre = 0; //定义一个计数器,和保存计数器原本状态的变量UART_HandleTypeDef esp8266_handle = {0};void esp8266_uart_init(uint32_t baudrate)
{esp8266_handle.Instance = USART2;esp8266_handle.Init.BaudRate = baudrate;  //波特率esp8266_handle.Init.Mode = UART_MODE_TX_RX;//收发模式;esp8266_handle.Init.Parity = UART_PARITY_NONE;//无校验位esp8266_handle.Init.WordLength = UART_WORDLENGTH_8B;  //字长:8个字长esp8266_handle.Init.StopBits = UART_STOPBITS_1; //停止位:1个停止位esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控HAL_UART_Init(&esp8266_handle);
}void USART2_IRQHandler(void)
{uint8_t receive_data = 0;//这个函数是用来检查特定的UART接口(在这个例子中是esp8266_handle所代表的UART接口)是否有数据可读if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_RXNE) != RESET)//关注RXNE这个标志位的值是不是不为reset(0){if(esp8266_cnt >= sizeof(esp8266_rx_buf))//如果接收的字符长度大于字符缓冲区的长度,则把缓冲区长度置0esp8266_cnt = 0;//如果RXNE的值为1,证明有数据,所以需要接收数据HAL_UART_Receive(&esp8266_handle,&receive_data,1,1000);//句柄,接收的数据存放在哪?接收数据的个数,超时时间esp8266_rx_buf[esp8266_cnt++] = receive_data;//将接收的数据存放在esp8266rx_buf数组中//HAL_UART_Transmit(&esp8266_handle,&receive_data,1,1000);//发送数据:句柄,要发送的数据,发送数据的长度,超时}
}
//这个函数主要用来判断esp8266cnt有没有动,如果没有动证明接收完成了
uint8_t esp8266_wait_receive(void)
{if(esp8266_cnt == 0)//如果cnt为0证明,出现了错误return ESP8266_ERROR;//出现错误if(esp8266_cnt == esp8266_cntPre)//判断当前cnt和上一个cnt是否一致,如果是一致的证明数据不动了,传输完成{esp8266_cnt = 0;//cnt清0return ESP8266_EOK;//数据接收完成}esp8266_cntPre = esp8266_cnt;//把当前计数器cnt的值赋给之前计数器return ESP8266_ERROR;//}
//把接收寄存器的内容清空
void esp8266_rx_clear(void)
{//把接收缓冲器清空memset(esp8266_rx_buf,0,sizeof(esp8266_rx_buf));//清空长度esp8266_cnt = 0;
}
测试函数-这个函数在while循环里,来一直判断当前数据是否接收完
//void esp8266_receive_data(void)
//{
//    if(esp8266_wait_receive() == ESP8266_EOK)//判断数据是否接受完整
//    {
//        printf("esp8266 recv: %s\r\n",esp8266_rx_buf);//接收完整,打印数据
//        esp8266_rx_clear();//清除当前接收
//    }
//}
//定义一个发送指令函数,cmd是发送的指令,res是期待的返回值,对应指令接收的日志
uint8_t esp8266_send_command(char *cmd,char *res)
{uint8_t time_out = 250;esp8266_rx_clear();//把接收缓冲区的内容清空HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送的库函数:句柄,要发生的内容,内容的长度,阻塞的值//一共等待2.5s的时间,每一次等待10mswhile(time_out--){if(esp8266_wait_receive() == ESP8266_EOK)//表示已经接收到数据{if(strstr((const char*)esp8266_rx_buf,res) != NULL)//判断接收到的数据里面有没有我们想要的数据return ESP8266_EOK;}delay_ms(10);}return ESP8266_ERROR;
}
//AT指令
uint8_t esp8266_at_test(void)
{return esp8266_send_command("AT\r\n","OK");
}
//工作模式:1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
uint8_t esp8266_set_mode(uint8_t mode)
{switch(mode){case ESP8266_STA_MODE:return esp8266_send_command("AT+CWMODE=1\r\n","OK");case ESP8266_AP_MODE:return esp8266_send_command("AT+CWMODE=2\r\n","OK");case ESP8266_STA_AP_MODE:return esp8266_send_command("AT+CWMODE=3\r\n","OK");default:return ESP8266_EINVAL;//数据非法}
}
//以设备模式接入家中路由器,账号和密码
uint8_t esp8266_join_ap(char *ssid,char *pwd)
{char cmd[64];sprintf(cmd,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//使用sprintf构造字符串return esp8266_send_command(cmd,"WIFI GOT IP");
}
//模式:设置单路链接模式(透传只能使用此模式)
uint8_t esp8266_connection_mode(uint8_t mode)
{char cmd[64];sprintf(cmd,"AT+CIPMUX=%d\r\n",mode);//使用sprintf构造字符串return esp8266_send_command(cmd,"OK");
}void esp8266_init(uint32_t baudrate)
{printf("esp8266初始化开始...\r\n");//esp8266串口初始化esp8266_uart_init(baudrate);//esp8266的其他初始化 printf("测试esp8266是否存在...\r\n");while(esp8266_at_test())delay_ms(500);printf("设置工作模式为STA...\r\n");while(esp8266_set_mode(ESP8266_STA_MODE))delay_ms(500);printf("设置单路链接模式...\r\n"); while(esp8266_connection_mode(ESP8266_SINGLE_CONNECTION))delay_ms(500);printf("连接wifi,SSID:%s,PWD:%s...\r\n",WIFI_SSID,WIFI_PWD);while(esp8266_join_ap(WIFI_SSID,WIFI_PWD))delay_ms(1500);printf("esp8266初始化完成\r\n");}//定义一个临时的函数,用来测试,判断发送一个指令回应的函数是否正确
void esp8266_test(void)
{if(esp8266_send_command("AT","OK") == ESP8266_EOK)printf("esp8266 test:%s\r\n",esp8266_rx_buf);
}

esp8266.h

#ifndef __ESP8266_H__
#define __ESP8266_H__#include "sys.h"#define ESP8266_RX_BUF_SIZE         128 //接收的长度
#define ESP8266_TX_BUF_SIZE         64  //发送的长度#define ESP8266_EOK                  0  //宏定义错误代码 ok
#define ESP8266_ERROR                1  //错误
#define ESP8266_ETIMEOUT             2  //超时
#define ESP8266_EINVAL               3  //数据非法#define ESP8266_STA_MODE             1  //STA模式
#define ESP8266_AP_MODE              2  //AP模式
#define ESP8266_STA_AP_MODE          3  //双模#define ESP8266_SINGLE_CONNECTION    0  //单链接
#define ESP8266_MULTI_CONNECTION     1  //多链接#define WIFI_SSID                    "ChinaUnicom-FXL6NZ"  //wifi账号
#define WIFI_PWD                     "13555305181ljf"      //wifi密码void esp8266_init(uint32_t baudrate);
void esp8266_receive_data(void);#endif

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器Ubuntu22.04系统下 ollama的详细部署安装和搭配open_webui使用

服务器Ubuntu22.04系统下 ollama的详细部署安装和搭配open_webui使用 一、ubuntu和docker基本环境配置1.更新包列表:2. 安装docker依赖3. 添加docker密钥4.添加阿里云docker软件源5.安装docker6.安装完成docker测试7. docker配置国内镜像源 二、安装英伟达显卡驱动1…

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

西门子200smart存储卡作用

最近维修设备时,遇到一个问题,设备PLC是200smart SR20,PLC程序需要修改某个程序段,由于手里没有源程序,联系厂家后,厂家发了一段程序,后缀是.s7s。通过查询官网资料,其中S7_JOB.S7S为脚本任务&a…

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程: 6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库:麻烦,要专门去找库,cmak…

【C++】字符串与字符数|组操作详解:strcpy 和 strcat 的使用与解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯一、字符串数组的基本操作💯二、strcpy 的用法详解1. strcpy 的功能与原型2. 使用示例与代码演示3. 注意事项4. 扩展:为什么不能直接用 &#xff1f…

GWAS数据和软件下载

这部分主要是数据获取,以及软件配置方法。 一、配套数据和代码 数据和代码目前在不断的更新,最新的教程可以私信,我通过后手动发送最新版的pdf和数据代码。发送的压缩包,有电子版的pdf和数据下载链接,里面是最新的百度网盘的地址,下载到本地即可。然后根据pdf教程,结合配套的…

Vue笔记-001-声明式渲染

https://cn.vuejs.org/tutorial/#step-2https://cn.vuejs.org/tutorial/#step-2 Vue 单文件组件 (Single-File Component,缩写为 SFC) 单文件组件是一种可复用的代码组织形式,它将从属于同一个组件的 HTML、CSS 和 JavaScript 封装在使用 .vue 后缀的文件…

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时,分解对象&#xff…

(六)优化 ChatGPT 交互:任务式 Prompt 的力量

📢📢📢 大家好,我是云楼Yunlord,CSDN博客之星人工智能领域前三名,多年人工智能学习工作经验,一位兴趣稀奇古怪的【人工智能领域博主】!!!😜&#…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 (1)在国家方面,是国产的系统,受国家支持不会有限制的情况。   (2)设备互连18N(1:手机 8:平板、PC、vr设备、可穿戴设备、智慧…

R语言基础| 中级绘图

写在前面 前面第六章的图形主要是展示单分类变量或连续型变量的分布情况。本章主要研究二元变量或多元变量关系的可视化。更多教程可参考: R语言基础学习手册 图片集锦: 11.1 散点图 1)添加最佳拟合曲线的散点图: 绘制汽车重…

神经网络第一课

目录 背景知识生物神经元人工神经元模型神经网络训练神经网络结论背景知识 神经网络是一种人工智能模型,其主要受生物神经系统启发,重现了大脑中神经元之间相互连接的方式。 神经网络已在很多领域中取得显著成就,如图像识别、自然语言处理和语音识别等。 生物神经元 神经…

Docker:安装 XXL-JOB 分布式调度任务的技术指南

1、简述 XXL-JOB 是一个分布式任务调度平台,提供简单易用的任务调度功能。它支持分布式调度、失败重试、任务监控和报警等功能。XXL-JOB 采用了服务端与执行器的架构,任务调度在服务端进行,而任务的实际执行则由各个执行器完成。 XXL-JOB 的…

Git revert回滚

回退中间的某次提交(此操作在预生产分支上比较常见),建议此方式使用命令进行操作(做好注释,方便后续上线可以找到这个操作) Git操作: 命令:revert -n 版本号 1:git re…

新年到了!使用Python创建一个简易的接金元宝游戏

引言 在本教程中,我们将一起学习如何使用Python编程语言和Pygame库来创建一个简单的休闲游戏——“接金元宝”。 准备工作 首先,确保你的计算机上已经安装了Python(推荐3.6以上版本)和Pygame库。如果还没有安装Pygame&#xff0…

GoF23种设计模式 简介

文章目录 面向对象(OO)设计原则(7)单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建型模式 (5)工厂方法模式 (类模式,其余都是对象模式)抽象工厂模式建造…

【数电尾灯设计】2022-8-16

缘由数电尾灯设计问题,求解答--CSDN问答 从题目可以列出 000 100 010 111-----------4进制 000 100 010 110 001 101 011 111-----------8进制 由列出可知用16进制芯片的3个引脚可以获得8进制推导出4进制从而可用逻辑处理为4进制实现尾灯功能。之上第一步实现了尾灯…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

Ant Design Pro写项目的总结经验(react)

配置代理(proxy) 在config文件夹下面的config.ts里面配置修改 修改前:修改后: 修改账号框以及登录接口以及登录返回的code 由于它的账号框是username,但是我们接口请求要填写的是account,因此可以全局搜索进行替换…

安卓14无法安装应用解决历程

客户手机基本情况: 安卓14,对应的 targetSdkVersion 34 前天遇到了安卓14适配问题,客户发来的截图是这样的 描述:无法安装我们公司的B应用。 型号:三星google美版 解决步骤: 1、寻找其他安卓14手机测试…