前言
本篇涉及到的模块与工具为:
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模式 (混合模式)
指令的使用
模块使用分为俩种情况,服务端和客服端,其中客户端最为常用
- (一)作为服务端时
- 设置模式为AP模式:AT+CWMODE=2
- 重启模块:AT+RST
- AT+CWSAP=“wifi名称”,“wifi密码”,6,4 创建热点(“6”为通道号,“4”为加密等级)
- 查看模块的ip地址:命令: AT+CIFSR
- AT+CIPMUX=1 设置为多连接模式,启动模块
- AT+CIPSERVER=1,8080 服务器的设置端口(8080为默认端口,可根据自己意向设置)时
- (二)作为客户端时
- AT+CWMODE=1 配置STA模式
- AT+RST 重启生效
- AT+CWJAP=“wifi名称”,“WiFi密码” 连接WIFI
- AT+CIPMUX=0 设置单路连接模式,=1为多路连接
- AT+CIPSTART=“TCP”,“服务器ip地址”,端口号 连接服务器
- AT+CIPMODE=1 开启透传模式
- 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)
{
}
}
程序源码
链接:https://pan.baidu.com/s/16z_D-BUuYzvsStSc7qU_PQ
提取码:mkfj文章来源:https://www.toymoban.com/news/detail-782986.html
疑难解答或技术交流加下方wx联系即可👇👇👇文章来源地址https://www.toymoban.com/news/detail-782986.html
到了这里,关于基于stm32 ESP8266WiFi模块的基本通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!