基于STM32与ESP8266WiFi模块的基础通信实现

文章目录

  • 前言
  • 一、什么是ESP8266?
  • 二、ESP8266常用指令集
  • 三、模块的配置 及 指令的使用
  • 四、程序设计

  • 前言

    本篇涉及到的模块与工具为:
    1. ATK-ESP8266wifi模块
    2. USB-UART模块
    3. 串口调试助手
    提取链接:https://pan.baidu.com/s/17xRlpnjp8j-VvyD2VDxNXw?pwd=ufms
    提取码:ufms
    4. 网络调试助手
    提取链接:https://pan.baidu.com/s/10spxZmwMGI70USlzkOzdxg?pwd=fmxe
    提取码:fmxe

    一、什么是ESP8266?

    简介:
    ESP8266是一款超低功耗的UART-WiFi 透传模块,拥有业内极富竞争力的封装尺寸和超低能耗技术,专为移动设备和物联网应用设计,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能。

    ESP8266是一个完整且自成体系的Wi-Fi网络解决方案,能够搭载软件应用,或通过另一个应用处理器卸载所有Wi-Fi网络功能。在搭载应用并作为设备中唯一的应用处理器时,能够直接从外接闪存中启动。内置的高速缓冲存储器有利于提高系统性能,并减少内存需求。


    我这里以正点原子团队开发的ATK-ESP-01 模块为例进行介绍。

    ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP
    协议栈,能够实现串口与 WIFI 之间的转换。通过 ATK-ESP8266 模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。

    ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口-WIFI 数据传输方案,方便设备使用互联网传输数据。ATK-ESP8266 模块非常小巧(29mm*19mm),模块通过 6 个 2.54mm 间距的排针与外部连接,模块外观如下图所示:

    由上可知,该模块分布有6个引脚:VCC、GND、TXD、RXD、RST、IO_0,其中RST和IO_0一般可不用

    引脚说明:

    名称 说明
    VCC 电源(3.3V~5V)
    GND 电源地
    TXD 模块串口发送脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 RXD
    RXD 模块串口接收脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 TXD
    RST 复位(低电平有效)
    IO_0 用于进入固件烧写模式,低电平是烧写模式,高电平是运行模式(默认状态)

    原理图:

    产品参数:

    二、ESP8266常用指令集

    指令 说明
    AT 测试AT启动
    AT+RST 重启模块
    AT+RESTORE 恢复出厂设置
    AT+CWLIF 查看已接入设备的 IP
    AT+CIFSR 查看本模块的 IP 地址
    AT+CWMODE? 查看本机配置模式
    AT+CIPMUX=1 开启多连接模式
    AT+CIPSTO? 查询本模块的服务器超时时间
    ATE 开关回显功能ATE关闭回显,ATE开启回显
    AT+GMR 查看版本信息
    AT+UART 设置串口配置
    AT+CWJAP 加入AP
    AT+CWQAP 退出与AP的连接
    AT+CWSMARTSTART 启动智能连接
    AT+CWSMARTSTOP 停止智能连接

    三、模块的配置 及 指令的使用

    AT+CWMODE=mode

  • mode=1:Station模式(接收模式,做客户端 连接别人的wifi(热点))
  • mode=2:AP模式(发送模式,做服务器 自己作为wifi 给别人连)
  • mode=3:AP+Station模式 (混合模式)
  • 指令的使用
    模块使用分为俩种情况,服务端和客服端,其中客户端最为常用

  • (一)作为服务端时
    1. 设置模式为AP模式:AT+CWMODE=2
    2. 重启模块:AT+RST
    3. AT+CWSAP=“wifi名称”,“wifi密码”,6,4 创建热点(“6”为通道号,“4”为加密等级)
    4. 查看模块的ip地址:命令: AT+CIFSR
    5. AT+CIPMUX=1 设置为多连接模式,启动模块
    6. AT+CIPSERVER=1,8080 服务器的设置端口(8080为默认端口,可根据自己意向设置)时
  • (二)作为客户端时
    1. AT+CWMODE=1 配置STA模式
    2. AT+RST 重启生效
    3. AT+CWJAP=“wifi名称”,“WiFi密码” 连接WIFI
    4. AT+CIPMUX=0 设置单路连接模式,=1为多路连接
    5. AT+CIPSTART=“TCP”,“服务器ip地址”,端口号 连接服务器
    6. AT+CIPMODE=1 开启透传模式
    7. AT+CIPSEND 开始透传

    由于时间原因,关于ESP8266 网络调试助手串口调试助手的通信使用,可私信在线教学

    四、程序设计

    我这里以做客户端为例进行展开设计
    1. 发送指令

    //向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;
    } 
    

    2. 发送数据

    //向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;
    } 
    

    3. 接收应答

    //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;
    }
    

    4. 退出透传

    //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;
    }
    
    

    5. 模块配置(初始化)

    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=\"xxxx\",\"xxxx\"","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);
    }
    

    6. main函数

    int main(void)
     {		
    	delay_init();	    	 			//延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 				//串口初始化为115200
    	usart3_init(115200);	 				//串口初始化为115200
    
    	esp8266_start_trans();							//esp8266进行初始化
    	 
    	esp8266_send_data("12",50);
    	 
    	esp8266_quit_trans();
    
     	while(1)
    	{
    		
    	}
     }
    

    若需程序源码 可留言评论区或直接私信即可

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32与ESP8266WiFi模块的基础通信实现

    发表评论