ESP8266学习笔记(二)

2023-10-27

上篇文章提到了如何使用USB转TTL模块调试ESP8266模块以及该模块的几种工作方式。此篇将会介绍如何实现ESP8266模块与单片机的通信。

功能介绍:esp8266模块与stm32单片机的串口三之间互相通信,本人测试的是esp8266模块的STA做客户端的模式。

与usb转ttl模块调试步骤相同,首先通过AT指令使wifi模块进入sta模式下的透传模式。不同的是,usb转ttl模块调试时我们是通过串口调试助手给其发送AT指令,而此时是需要串口三自动给wifi模块发送AT指令,并判断返回的信息。
直接上代码:

void esp8266_start_trans(void)
{
	//设置工作模式:1.station模式  2.AP模式  3,AP+station模式
	
	esp8266_send_cmd("AT+CWMODE=1","OK",500);
	//重启模块
	
	esp8266_send_cmd("AT+RST","ready",500);
	delay_ms(1000);         //ÑÓʱ3SµÈ´ýÖØÆô³É¹¦
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);
	
	//让模块连上路由器
	while(esp8266_send_cmd("AT+CWJAP=\"xxxx\",\"xxxx\"","WIFI GOT IP",600));
	//(此处只需把“xxx"换成自己路由器的名称与密码即可
	//设置为单连接模式  0:单连接  1:多连接
	esp8266_send_cmd("AT+CIPMUX=0","OK",200);
	//是否开启透传模式:1:开启  0:否
	esp8266_send_cmd("AT+CIPMODE=1","OK",200);
	
	//建立TCP连接
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
	//透传模式下可以发送数据的指令
	esp8266_send_cmd("AT+CIPSEND","OK",50);
	}

此函数中有一个重要的函数,就是esp8266_send_cmd();这就是我们自己定义的向esp8266发送命令的函数

//向esp8266发送命令
//cmd:·发送的字符串命令´ack:期待接收到的应答命令;waittime:等待时间
//返回值:0 发送成功  1  发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					printf("cmd:%s\r\n",(u8*)cmd);//把发送的命令通过串口一打印到串口调试助手上
					printf("ack:%s\r\n",(u8*)ack);//把接收到命令通过串口一打印到串口调试助手上
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 

此处可以看到通过u3_printf()函数向esp8266模块发送指定的AT指令,然后判断esp8266返回的命令是否是正确的,并通过串口一的printf()把发送的命令和接收的命令打印到串口调试助手上,方便观察。

下面附上串口三的发送函数

//´串口三发送函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART3_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART3_TX_BUF);		//´发送数据的长度
	for(j=0;j<i;j++)							//循环发送数据
	{
	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送数据,知道发送完
		USART_SendData(USART3,USART3_TX_BUF[j]); 
	} 
}

这是两者之间通信的重要几步,把程序烧录到开发板上,同时打开串口调试助手和网络调试助手。
在这里插入图片描述
从左侧的串口调试助手上可以观察到发送的AT指令和收到的返回信息,此时模块成功进入到透传模式,即可实现PC端与串口三之间的通信。此时,使用串口调试助手发送消息可以看到网络调试助手上并没有显示对应的消息,这并不代表二者之间通信失败。需要明白,我们配置的是串口三与PC端之间的通信,而串口调试助手实际上是串口一与电脑之间的通信。此时,只需将串口一接收到的数据传递给串口三,再由串口三发送出去即可。同样,当PC端向串口三发送消息时,将串口三接收到的消息通过串口一打印出来,就可以从串口调试助手上观察到了。如图
在这里插入图片描述
这样我们就可以清晰地观察到二者之间的通信状况。

接下来就要考虑如何退出透传模式了,同样的自定义了退出安透传模式的函数

//退出透传模式 0 退出成功  1 退出失败
//通过wifi模块发送三个连续的“+”退出
u8 esp8266_quit_trans(void)
{
	u8 result=1;
	u3_printf("+++");
	delay_ms(1000);					
	result=esp8266_send_cmd("AT","OK",20);//退出透传判断
	if(result)
		printf("quit_trans failed!");
	else
		printf("quit_trans success!");
	return result;
}

在这里,我采用了定时器3计时,如果10s没有接收到消息,就退出透传模式。定时器中断的配置这里就不多说了。

在这里不得不提一下本人在调试过程中遇到的问题:
在第一步中配置esp8266模块进入透传模式时,通过串口调试助手打印出来的信息可以看到程序卡到了“WIFI GOT IP",就是无法进行下一条AT指令,此时打开网络调试助手发送消息显示 ”没有连接对象“,反复观察程序并没有问题。然后就像是不是模块出问题了,我尝试用usb转ttl调试esp8266,发现可以调试成功,证明模块是没有问题的。然后各种网上找答案也没有找到解决办法,然后偶然不经意间发现程序中PC端的IP地址输错了,“174”误输成了“147”,更正后再次调试,成功了。不得不吐糟一下,真是浪费了好长时间。以后在写代码的时候一定要认真在认真! ! !

本人小白一个,文中如有错误还请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP8266学习笔记(二) 的相关文章

  • IDEA如何生成 serialVersionUID

    序列化和反序列化 Java是面向对象的语言 与其他语言进行交互 比如与前端js进行http通信 需要把对象转化成一种通用的格式比如json 前端显然不认识Java对象 从对象到json字符串的转换 就是序列化的过程 反过来 从json字符串
  • import-from

    1 import from可以导入什么文件 通过import from 导入时 from后的来源可以是js vue json 这个是在webpack base conf js中extensions设置的 该属性值默认是js vue json
  • 深度学习入门资料整理

    深度学习基础总结 无一句废话 附完整思维导图 深度学习如何入门 知乎 深度学习入门基础讲义 shuzfan的博客 CSDN博客 深度学习入门 神经网络15分钟入门 足够通俗易懂了吧 知乎 深度学习基础知识点梳理 知乎
  • MQ-2烟雾传感器代码(STM32单片机驱动)

    MQ 2烟雾传感器代码 STM32单片机驱动 MQ 2烟雾传感器简介 接线 三级目录 MQ 2烟雾传感器简介 MQ 2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 SnO2 当烟雾传感器所处环境中存在可燃气体时 烟雾传感器的
  • 什么是 BFC?

    3 BFC的规则 BFC就是一个块级元素 块级元素会在垂直方向一个接一个的排列BFC就是页面中的一个隔离的独立容器 容器里的标签不会影响到外部标签垂直方向的距离由margin决定 属于同一个BFC的两个相邻的标签外边距会发生重叠计算BFC的
  • 在线吉他调音

    先看效果 图片没有声 可以下载源码看看 比这更好 再看代码 查看更多
  • 输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

    效果视频 输电线路故障诊断 Python代码 逻辑回归 决策树 随机森林 XGBoost和支持向量机五种不同方法诊断 哔哩哔哩 bilibili 项目文件 code py装载的是英文版本 图上显示英文标签及坐标 Chinese py装载的是
  • chisel快速入门(三)

    前一篇见此 chisel快速入门 二 沧海一升的博客 CSDN博客简单介绍了chisel 使硬件开发者能快速上手chisel https blog csdn net qq 21842097 article details 121418806
  • Windows11 WSL子系统ubuntu22.04 修改hostname

    大家都知道以往我们修改 Linux系统的 hostname只要修改 etc hostname 这个文件中的名字即可 但是在WSL中修改该文件是无法生效的 要修改Hostname并使它生效 我们必须修改 etc wsl conf 文件 编辑配
  • Anaconda环境的一些常用命令

    首先 在开始中找到Anaconda Prompt 这个窗口和cmd窗口一样的 1 查看有哪些环境 输入命令 conda info e 2 如何查看Anaconda中安装了哪些第三方库 用 conda list 或者 pip list 命令来
  • SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑

    目录 背景介绍 设计思想 登录前的时序图 登录后的时序图 back内部认证逻辑的设计 LoginFilter内部流程 JwtFilter内部流程 filter流程说明 权限校验 总结 背景介绍 我们现在开发WEB应用最流行的框架就是Spri
  • 【Java学习】-Java JDK 1.8与17版本比较

    前言 Java Development Kit JDK 是Java编程语言的开发环境 它包含了Java编译器 javac Java虚拟机 JVM 以及其他必需的工具和库 本文将比较JDK 1 8和17两个版本 分析它们的发展历史和地位 并探
  • 十二届蓝桥杯青少年Python组省赛试题

    一 选择题 第一题 设s Hello Lan Qiao 执行print s 4 11 输出的结果为 选择题严禁使用程序验证 A lo Lan Qi B lo Lan Q C o Lan Qi D o Lan Q 第二题 循环语句for i
  • Java 示例代码,它演示了如何使用 Java Swing 创建一个简单的图形用户界面(GUI)应用程序:

    import javax swing JFrame import javax swing JLabel import javax swing JButton import java awt event ActionListener impo
  • for与while的优缺点

    在循环次数已知的情况下 for循环的形式更加简洁 而循环次数无法预知时 用while循环实现更合适 用特定条件控制循环是否执行 循环体中执行的语句可能导致循环条件发生变化
  • 调试最长的一帧(第19天)

    这个主要是理论了 抄一抄 最常用到场景管理方式时场景节点树结构 场景树顶点的叶节点osg Geode包含了各种需要渲染的几何体的顶点和渲染状态信息 而组节点osg Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 它们也可以
  • 10款在线检查英语语法的网站

    转自 https www sohu com a 239534894 655071 1 NOUNPLUS https www nounplus net grammarcheck nounplus是一个免费的语法检查网站 界面简洁流畅 并且有三
  • CentOS7下使用iptables

    系统升级到CentOS 7后总感觉iptables怪怪的 比如不管怎么保存重启后都被初始化一下 即便我最后发大绝招启动时候加命令 首先iptables save gt etc iptables rules保存当前状态 然后再在 etc rc
  • useMemo和useCallback的使用

    useMemo 功能 用来缓存数据 应用场景 当组件内部某个数据 需要通过计算而来 且这个计算依赖于state props数据时使用 好处 避免依赖项未修改时 重复渲染导致的计算 浪费计算资源 useCallback 功能 缓存单个函数 应
  • 知识图谱(含代码)

    中山大学计算机学院 人工智能 本科生实验报告 一 实验题目 编写程序 实现FOIL First Order Inductive Learner 算法 对如下给定的知识图谱和目标谓词进行规则学习 并得到新的以目标谓词为关系的事实 用一阶逻辑表

随机推荐

  • Mybatis-Plus(三)

    目录 1 ActiveRecord 1 开启AR 2 插件 1 mybatis的插件机制 2 执行分析插件 3 性能分析插件 4 乐观锁插件 3 Sql 注入器 4 自动填充功能 5 逻辑删除 6 通用枚举 7 MybatisX 快速开发插
  • C++11-14 第7讲 Range-based for loop(范围循环)

    非常简单的一个点 include
  • 实时显示鼠标指针相对于浏览器X轴Y轴坐标位置

  • 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息

    include
  • 蓝桥杯 Python 组省赛夺奖班-2.3Python杂题

    一 修剪灌木 题目 思路 树木编号为1 2 3 N 首先确定一个事情 就是树木的生长高度不会无限高 在2N个时间内会被修剪为0 那么对于第 i 棵树 从被修剪过到下此次修剪的最长时间为max 2 i 1 2 N i 这里的2是因为有一个转变
  • c++ 类模板和模板类的深入解析

    1 在c Template中很多地方都用到了typename与class这两个关键字 而且好像可以替换 是不是这两个关键字完全一样呢 答 class用于定义类 在模板引入c 后 最初定义模板的方法为 template
  • 用Pycharm创建Django项目

    转载 https blog csdn net weixin 43638892 article details 87100007
  • Python %d,%s,%f

    当你看到输出语句存在 d s f等百分号的时候 就接触到python 字符串格式化输出相关知识 Python 支持字符串格式化输出 尽管这样可能遇到非常复杂的表达式 但最基本的是用法就是将一个值插入到一个有字符串格式符 s的字符串中 如 例
  • android studio 使用opengl es布置游戏背景

    首先新建一个activity用于屏幕的view package com example wang airhockey3d import android opengl GLSurfaceView import android support
  • 计算机视觉快速入门一 ——项目实战(文档扫描OCR识别)

    计算机视觉快速入门一 项目实战 文档扫描OCR识别 1 文件配置 pip install pytesseract 下载tesseract ocr setup 4 00 00dev exe程序 并记住位置 并将此位置添加到环境变量 我的文件为
  • nodejs获取centos本机时间相差8小时

    1 nodejs通过new Date 获取本机当前时间后进行字符串格式化 在我本机windows电脑上运行返回结果正常 2 将代码部署到服务器 centos 上后发现获取时间是相差八小时的 3 服务器可能时区设置不在北京时间 东八区 4 使
  • FLASK框架应用实例

    一 项目简介 Flask是Python编写的轻量级Web开发框架 因其良好的可扩展性 意味着 你可以写出你自己随心所欲的代码 其使用jinja模板引擎和Werkzeug WSGI 套件 在安全性方面效果明显 详细文档收藏地址 https d
  • 操作系统 -- 内存管理(分配与回收)

    目录 内存的分配方式 连续内存分配 单一连续分配 过时 固态分区分配 动态分区分配 动态分区分配算法 首次适应算法 最佳适应算法 最坏适应算法 邻近适应算法 非连续内存分配 基础定义 地址转换 十进制地址 二进制地址 页表 地址转变过程 地
  • C++基础知识(一)

    C 基础知识 一 文章目录 C 基础知识 一 1 前言 2 编译器环境 3 第一个C 程序 4 数据类型 5 存储类 1 前言 1979年 C 初生萌芽 在1983年的时候 正式改名为C 本贾尼 斯特劳斯特卢普 Bjarne Stroust
  • OpenMP学习笔记

    一 OpenMP简介 1 内存共享并行模型 机器必须多处理器 核 共享内存 底层架构可以是UMA和NUMA UMA NUMA 2 Fork Join模型 重复fork join操作 3 OpenMP特性 OpenMP仅通过线程来完成并行 O
  • Redis(二):基础之五种常见数据结构与使用方法

    五种常见数据结构与使用方法 一 字符串String Redis 中的字符串是一种 动态字符串 这意味着使用者可以修改 它的底层实现有点类似于 Java 中的 ArrayList 有一个字符数组 从源码的 sds h sdshdr 文件 中可
  • 【20170924】C语言每日一练

    程序1 题目 有数字1 2 3 4 能组成多少个互不相同且无重复数字的三位数 都是多少 include
  • docker容器内存分配

    1 和CPU控制一样 docker也提供了若干参数来控制容器的内存使用配额 可以控制容器的swap大小 可用内存大小等各种内存方面的控制 主要有以下参数 memory swappiness 控制进程将物理内存交换到swap分区的倾向 默认系
  • Python selenium(一般不使用,原因:打开浏览器,虽然简单但是性能低)

    selenium使用 1 创建浏览器对象 driver webdriver xxx 2 发送请求 driver get url driver对象常用的属性和方法 1 driver page source 当前标签页浏览器渲染后的页面源代码
  • ESP8266学习笔记(二)

    上篇文章提到了如何使用USB转TTL模块调试ESP8266模块以及该模块的几种工作方式 此篇将会介绍如何实现ESP8266模块与单片机的通信 功能介绍 esp8266模块与stm32单片机的串口三之间互相通信 本人测试的是esp8266模块