【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)

【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)物联网 万物互联 这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起 最简单 最广泛使用的就是互联网 ESP8266WIFI 串口通信模块应该是使用最广泛的一种 WIFI 模块之一了 为什么呢 因为 ESP8266 模块是一款高性能的 WIFI 串口模块 可以不用知道太多 WIFI 相关知识就可以很好的上手 说白了 只是个 WIFI 转串口的设备 你只要知道串口怎么编程使用 就可以了 实现了所谓的透

物联网,万物互联。这里涉及到的最基本的东西就是如何将所有的物联网设备连接在一起。最简单、最广泛使用的就是互联网。

ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢?

因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。

但是就是这么一个很常见的模块,网上很多的博客写的都是错的,或者都是很不详细的。

 

模块名称:ESP8266 WIFI串口通信模块

参考资料:ESP8266 WIFI串口通信模块官方资源、ATK-ESP8266资源包(提取码: nhsh)

知识储备:【STM32】串口通信基本原理(超基础、详细版)

其他模块:USB转TTL模块

项目下载链接:见本文文末

 

WIFI模块的调试

准备工作

USB转TTL模块与ESP8266 WIFI模块的接线:

现在市面上使用比较的ESP8266有两个版本,分别是官方的ESP8266(两排8引脚)、ATK-ESP8266(一排6引脚)。其实并没有太大的区别,只是将其中的一些引脚进行额外布局而已。

如果是官方的ESP8266模块,接线方式如下:

【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)

如果是ATK-ESP8266(正点原子)模块,接线方式如下:

【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)

这六个引脚只需要4个就行了:RXD、TXD、GND、VCC,分别和USB转TTL模块的TXD、RXD、GND、VCC相连接就行了。

需要注意两点:

1、ESP8266的RXD(数据的接收端)需要连接USB转TTL模块的TXD,TXD(数据的发送端)需要连接USB转TTL模块的RXD,这是基本的;

2、关于VCC的选取,在USB转TTL模块上有3.3V和5V两个引脚可以作为VCC,但是一般选取5V作为VCC。如果选取3.3V,可能会因为供电不足而引起不断的重启,从而不停的复位。

AT指令

在使用USB转TTL模块与电脑连接之后,就可以使用串口调试助手进行WIFI模块的调试了。首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:

常用AT指令
指令名 响应 含义
AT OK 测试指令
AT+CWMODE=
OK 设置应用模式(需重启生效)
AT+CWMODE? +CWMODE:
获得当前应用模式
AT+CWLAP +CWLAP:

,

,


返回目前的AP列表
AT+CWJAP=

,
OK 加入某一AP
AT+CWJAP? +CWJAP:
返回当前加入的AP
AT+CWQAP OK 退出当前加入的AP
AT+CIPSTART=

,

,

OK 建立TCP/UDP连接
AT+CIPMUX=
OK 是否启用多连接
AT+CIPSEND= OK 发送数据
AT+CIPMODE=
OK 是否进入透传模式

需要补充几点:

1、ESP8266的应用模式:ESP266支撑单AP模式、单STA模式和混合模式。简单的来说就是:

  • AP:可以将ESP8266作为热点,可以让其他的设备连接上它;
  • STA:可以连接上当前环境下的WIFI热点。

2、什么是透传模式?

透传就是指不需要关心wifi协议是如何实现的。所需要做的就是A通过串口发数据,B通过串口收数据,整个过程中A串口和B串口就像是用导线直接连接起来了一样。则对于开发人员来看,就是完全透明的。

更简单地理解就是:

如果不开启透传模式,我们怎么发送数据呢?在每次发送数据前都必须先发送指令AT+CIPSEND=,例如:

AT+CIPSEND=4 OK > //在 > 后面输入要上传的数据

但是一旦开启了透传模式,我们就不需要在每次发送数据前都发送指令AT+CIPSEND=了,只需要发送一次AT+CIPSEND,之后发送的所有内容全部当成是数据了!

但是这也存在一个问题,要是我后来又想发送命令了,但是却也当成是数据发送过去了。这可怎么办?

这就要退出透传模式了。怎么退出,发送数据”+++”就可以了。注意:此时“+++”后面,不接“发送新行”!

 

WIFI模块的使用

ESP8266的一般使用顺序

这里的“一般”指的是:ESP8266连接当前环境的热点,与服务器建立TCP连接,传输数据。

  1. AT+CWMODE=1:设置工作模式(STA模式)
  2. AT+RST:模块重启(生效工作模式)
  3. AT+CWJAP=”111″,””:连接当前环境的WIFI热点(热点名,密码)
  4. AT+CIPMUX=0:设置单路连接模式
  5. AT+CIPSTART=”TCP”,”xxx.xxx.xxx.xxx”,xxxx:建立TCP连接
  6. AT+CIPMODE=1:开启透传模式
  7. AT+CIPSEND:透传模式下,传输数据
  8. +++:退出透传模式

ESP8266的封装代码

关于与单片机的引脚连接:ESP8266与USART3(引脚PB10、PB11)连接。

首先是USART的配置:

#include "delay.h" #include "usart3.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "timer.h" //串口接收缓存区 u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节. u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节 //通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据. //如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到 //任何数据,则表示此次接收完毕. //接收到的数据状态 //[15]:0,没有接收到数据;1,接收到了一批数据. //[14:0]:接收到的数据长度 vu16 USART3_RX_STA=0; void USART3_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据 { res =USART_ReceiveData(USART3); if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据 { if(USART3_RX_STA 
  

由于在USART3中是通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据,而10ms怎么定呢?通过定时器来的,所以我们需要开启定时器:

#include "timer.h" extern vu16 USART3_RX_STA; //定时器7中断服务程序 void TIM7_IRQHandler(void) { if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断 { USART3_RX_STA|=1<<15; //标记接收完成 TIM_ClearITPendingBit(TIM7, TIM_IT_Update ); //清除TIM7更新中断标志 TIM_Cmd(TIM7, DISABLE); //关闭TIM7 } } //通用定时器7中断初始化,这里时钟选择为APB1的2倍 //arr:自动重装值 psc:时钟预分频数 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. //Ft=定时器工作频率,单位:Mhz //通用定时器中断初始化 void TIM7_Int_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//TIM7时钟使能 //定时器TIM7初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE ); //使能指定的TIM7中断,允许更新中断 TIM_Cmd(TIM7,ENABLE);//开启定时器7 NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 }

这两个都完成了之后,就可以向ESP8266传输数据了:

#include "esp8266.h" #include "string.h" #include "usart.h" #include "usart3.h" #include "stm32f10x.h" #include "sys.h" #include "delay.h" //ESP8266模块和PC进入透传模式 void esp8266_start_trans(void) { //设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式 esp8266_send_cmd("AT+CWMODE=1","OK",50); //让Wifi模块重启的命令 esp8266_send_cmd("AT+RST","ready",20); delay_ms(1000); //延时3S等待重启成功 delay_ms(1000); delay_ms(1000); delay_ms(1000); //让模块连接上自己的路由 while(esp8266_send_cmd("AT+CWJAP=\"111\",\"\"","WIFI GOT IP",600)); //=0:单路连接模式 =1:多路连接模式 esp8266_send_cmd("AT+CIPMUX=0","OK",20); //建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号 while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200)); //是否开启透传模式 0:表示关闭 1:表示开启透传 esp8266_send_cmd("AT+CIPMODE=1","OK",200); //透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了 esp8266_send_cmd("AT+CIPSEND","OK",50); } //ESP8266退出透传模式 返回值:0,退出成功;1,退出失败 //配置wifi模块,通过想wifi模块连续发送3个+(每个+号之间 超过10ms,这样认为是连续三次发送+) u8 esp8266_quit_trans(void) { u8 result=1; u3_printf("+++"); delay_ms(1000); //等待500ms太少 要1000ms才可以退出 result=esp8266_send_cmd("AT","OK",20);//退出透传判断. if(result) printf("quit_trans failed!"); else printf("quit_trans success!"); return result; } //向ESP8266发送命令 //cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms) //返回值: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("ack:%s\r\n",(u8*)ack); break;//得到有效数据 } USART3_RX_STA=0; } } if(waittime==0)res=1; } return res; } //ESP8266发送命令后,检测接收到的应答 //str:期待的应答结果 //返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置) u8* esp8266_check_cmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); } return (u8*)strx; } //向ESP8266发送数据 //cmd:发送的命令字符串;waittime:等待时间(单位:10ms) //返回值:发送数据后,服务器的返回验证码 u8* esp8266_send_data(u8 *cmd,u16 waittime) { char temp[5]; char *ack=temp; USART3_RX_STA=0; u3_printf("%s",cmd); //发送命令 if(waittime) //需要等待应答 { while(--waittime) //等待倒计时 { delay_ms(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 ack=(char*)USART3_RX_BUF; printf("ack:%s\r\n",(u8*)ack); USART3_RX_STA=0; break;//得到有效数据 } } } return (u8*)ack; } 

最后是主程序:

#include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "esp8266.h" #include "string.h" #include "timer.h" /* 项目的主要内容:STM32配合ESP8266模块与服务器数据交互 ESP8266的连接:USART3(PB10、PB11) 如何判断数据接收完全? 1、出现了换行符; 2、如果超过10ms了都没有下一条数据(TIM7来进行10ms的定时)。 */ int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(); //串口初始化为 usart3_init(); //串口初始化为 esp8266_start_trans(); //esp8266进行初始化 esp8266_send_data("12",50); esp8266_quit_trans(); while(1) { } }

完整项目链接:

百度云盘链接: https://pan.baidu.com/s/1LKjJL06fHyt1O5p9Jxmbig 提取码: p8yn 

【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219372.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午10:43
下一篇 2026年3月17日 下午10:43


相关推荐

  • Python – 实现矩阵转置

    Python – 实现矩阵转置有个朋友提出了一个问题:手头上现在有一个二维列表,比如[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],现在要把该二维列表变成为[[1,4,7,10],[2,5,8,11],[3,6,9,12]]。其实不动脑筋的话,用二重循环很容易写出来:#!/usr/bin/envpython3#-*-coding:utf-8-…

    2022年5月5日
    48
  • PyCharm撤销快捷键以及注释快捷键

    PyCharm撤销快捷键以及注释快捷键返回快捷键:当写程序时,不小心删掉了某一行程序,Ctrl+Z或者Ctrl+Shift+Z快捷键即可返回上一步注释快捷键:选中要注释的内容然后Ctrl+/

    2022年8月27日
    9
  • fastdfs 上传文件(nginx文件上传服务器)

    一、FastDFS介绍FastDFS开源地址:https://github.com/happyfish100参考:分布式文件系统FastDFS设计原理参考:FastDFS分布式文件系统1.简介FastDFS是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(…

    2022年4月16日
    142
  • deepfakes怎么用_如何使用 Deepfakes 换脸

    deepfakes怎么用_如何使用 Deepfakes 换脸如何使用Deepfakes换脸1.获取deepfakes工具包gitclonehttps://github.com/deepfakes/faceswap.git2.补齐依赖包:pipinstalltqdmpipinstallcv2pipinstallopencv-contrib-pythonpipinstalldlibpipinstallkeraspipinstall…

    2022年5月26日
    40
  • SpringBoot集成Redis和配置Redis做缓存[通俗易懂]

    SpringBoot集成Redis和配置Redis做缓存[通俗易懂]Redis介绍Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求,直观的存储结构使得通过程序交互十分简单。Redis数据库中所有数据都存储在内存中,由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,而且Redis提供了对持久化的支持,即可以将内存中的数据异步写入到硬盘中,且不影…

    2026年2月13日
    6
  • 现在的成年人,熬夜是一种常态!(漫画)

    点一次在看熬夜会少一次哦 原文始发于微信公众号(全栈程序员社区):现在的成年人,熬夜是一种常态!(漫画)

    2021年6月21日
    107

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号