打印
[STM32H7]

基于stm32 ESP8266WiFi模块的基本通信

[复制链接]
3046|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsrg51|  楼主 | 2024-6-30 20:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
什么是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 间距的排针与外部连接,模块外观如下图所示:

使用特权

评论回复
沙发
qsrg51|  楼主 | 2024-6-30 20:03 | 只看该作者
由上可知,该模块分布有6个引脚:VCC、GND、TXD、RXD、RST、IO_0,其中RST和IO_0一般可不用

引脚说明:

使用特权

评论回复
板凳
qsrg51|  楼主 | 2024-6-30 20:03 | 只看该作者
原理图:

使用特权

评论回复
地板
qsrg51|  楼主 | 2024-6-30 20:04 | 只看该作者
产品参数:

使用特权

评论回复
5
qsrg51|  楼主 | 2024-6-30 20:05 | 只看该作者
ESP8266常用指令集

使用特权

评论回复
6
qsrg51|  楼主 | 2024-6-30 20:05 | 只看该作者
模块的配置 及 指令的使用
AT+CWMODE=mode

mode=1:Station模式(接收模式,做客户端 连接别人的wifi(热点))
mode=2:AP模式(发送模式,做服务器 自己作为wifi 给别人连)
mode=3:AP+Station模式 (混合模式)

使用特权

评论回复
7
qsrg51|  楼主 | 2024-6-30 20:05 | 只看该作者
指令的使用
模块使用分为俩种情况,服务端和客服端,其中客户端最为常用

(一)作为服务端时
设置模式为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为默认端口,可根据自己意向设置)时

使用特权

评论回复
8
qsrg51|  楼主 | 2024-6-30 20:06 | 只看该作者
(二)作为客户端时
AT+CWMODE=1 配置STA模式
AT+RST 重启生效
AT+CWJAP=“wifi名称”,“WiFi密码” 连接WIFI
AT+CIPMUX=0 设置单路连接模式,=1为多路连接
AT+CIPSTART=“TCP”,“服务器ip地址”,端口号 连接服务器
AT+CIPMODE=1 开启透传模式
AT+CIPSEND 开始透传

使用特权

评论回复
9
qsrg51|  楼主 | 2024-6-30 20:06 | 只看该作者
程序设计
我这里以做客户端为例进行展开设计
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;
}

使用特权

评论回复
10
qsrg51|  楼主 | 2024-6-30 20:06 | 只看该作者
发送数据
//向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;
}

使用特权

评论回复
11
qsrg51|  楼主 | 2024-6-30 20:06 | 只看该作者
接收应答
//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;
}

使用特权

评论回复
12
qsrg51|  楼主 | 2024-6-30 20:06 | 只看该作者
退出透传
//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;
}

使用特权

评论回复
13
qsrg51|  楼主 | 2024-6-30 20:07 | 只看该作者
模块配置(初始化)
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);
}

使用特权

评论回复
14
qsrg51|  楼主 | 2024-6-30 20:07 | 只看该作者
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)
        {
               
        }
}

使用特权

评论回复
15
qsrg51|  楼主 | 2024-6-30 20:07 | 只看该作者
程序源码
链接:https://pan.baidu.com/s/16z_D-BUuYzvsStSc7qU_PQ
提取码:mkfj

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

395

帖子

2

粉丝