ESP8266在STM32上的应用

ESP8266 - WIFI模块

芯片介绍

基础介绍\引脚介绍

ESP8266是一款物联网WiFi芯片,基于ESP8266可以开发物联网串口WiFi模块,像SKYLAB的WG219/WG229专为移动设备和物联网应用设计,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。另外WG219/WG229仅需要通过出串口使用AT指令控制,就能满足大部分的网络功能需求。

以下为其引脚图:

引脚图

ESP8266可以通过乐鑫官方提供的ESP8266SDK进行开发,也可通过Arduino进行开发,本教程仅将ESP8266作为STM32的WIFI连接外设使用,使用STM32的串口与其进行连接,通过AT指令操作ESP8266进行联网等相关操作。

如对ESP8266独立开发感兴趣,详见ESP8266编程开发笔记,该笔记使用Arduino作为编程开发方式进行相关开发,在该笔记中,ESP8266将作为主机连接外设等使用。

由于其在此作为外设,除必要的电源等引脚需连接外,仅需要两根串口线与STM32相连接。

关于串口相关内容,详见协议使用笔记串口篇。

AT指令

AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。

每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。

由于AT指令命令众多,每款设备的AT指令也不尽相同,因此本篇仅介绍ESP8266相关的几个常用AT指令。

基础指令
指令参数响应说明
AT-OK测试指令
AT+RST-OK重启模块
AT+GMR-信息查询版本信息
AET0/AET1-OK关闭/开启回显
AT+RESTORE-OK恢复出厂设置
ESP8266特有指令

1.AT+CWMODE_CUR=<mode>—设置当前 Wi-Fi 模式,不保存到 Flash

参数说明:

‣ 1:Station 模式

‣ 2:SoftAP 模式

‣ 3:SoftAP+Station 模式

2.AT+CWMODE_DEF=<mode>—设置当前 Wi-Fi 模式并保存到 Flash

参数同上

3.AT+CWJAP_CUR=<ssid>,<pwd>,[<bssid>][,<pci_en>]—设置 ESP8266 Station 需连接的 AP,不保存到 Flash

参数说明:

<ssid>:⽬标 AP 的 SSID

<pwd>:密码最⻓ 64 字节 ASCII

[<bssid>]:选填参数,⽬标 AP 的 MAC 地址,⼀般⽤于有多个 SSID 相同的 AP 的情况

[<pci_en>]:选填参数,不允许连接 WEP 和 open 的路由器,可⽤于 PCI 认证

<error code>:(仅供参考,并不可靠)

‣ 1:连接超时

‣ 2:密码错误

‣ 3:找不到⽬标 AP

‣ 4:连接失败

参数设置需要开启 Station 模式,若 SSID 或者password 中含有特殊符号,例如 , 或者 “ 或者 \ 时,需要进⾏转义,其它字符转义⽆效。

4.AT+CWJAP_DEF=<ssid>,<pwd>[,<bssid>][,]—连接 AP,保存到 Flash

参数同上

5.AT+CIFSR—查询本地 IP 地址

响应:

+CIFSR:APIP,<SoftAP	IP	address>

+CIFSR:APMAC,<SoftAP MAC address>

+CIFSR:STAIP,<Station IP address>

+CIFSR:STAMAC,<Station MAC address>

OK

参数说明:

<IP address>

ESP8266 SoftAP 的 IP 地址

ESP8266 Station 的 IP 地址

<MAC address>

ESP8266 SoftAP 的 MAC 地址

ESP8266 Station 的 MAC 地址

ESP8266 Station IP 需连上 AP 后,才可以查询

6.AT+CIPMUX=<mode>—设置多连接

参数说明:

<mode>

‣ 0:单连接模式

‣ 1:多连接模式

注意:

• 默认为单连接;

• 只有⾮透传模式 (AT+CIPMODE=0),才能设置为多连接;

• 必须在没有连接建⽴的情况下,设置连接模式;

• 如果建⽴了 TCP 服务器,想切换为单连接,必须关闭服务器 (AT+CIPSERVER=0),服务器仅⽀

持多连接。

7.AT+CIPSTART—建⽴ TCP 连接,UDP 传输或 SSL 连接

TCP 单连接 (AT+CIPMUX=0) 时:AT+CIPSTART=,,[,]

TCP 多连接 (AT+CIPMUX=1) 时:AT+CIPSTART=,,,[]

响应:

OK 或 ERROR,如果连接已经存在,则返回ALREADY CONNECTED

参数说明:

<link ID>:⽹络连接 ID (0 ~ 4),⽤于多连接的情况

<type>:字符串参数,连接类型,“TCP”,“UDP"或"SSL”

<remote IP>:字符串参数,远端 IP 地址

<remote port>:远端端⼝号

[<TCP keep alive>]:TCP keep-alive 侦测时间,默认关闭此功能

0:关闭 TCP keep-alive 功能

1 ~7200:侦测时间,单位为 1s

8.AT+CIPSEND—发送数据

  • 设置指令:
  1. 单连接时:(+CIPMUX=0) AT+CIPSEND=<length>

  2. 多连接时:(+CIPMUX=1) AT+CIPSEND=<link ID>,<length>

  3. 如果是 UDP 传输,可以设置远端 IP 和端⼝:AT+CIPSEND=[<link ID>,]<length> [,<remote IP>,<remote port>]

功能:在普通传输模式时,设置发送数据的⻓度。

响应:

发送指定⻓度的数据。

收到此命令后先换⾏返回>,然后开始接收串⼝数据,当数据⻓度满 时发送数据,回到普通指令模式,等待下⼀条 AT 指令。

如果未建⽴连接或连接被断开,返回:ERROR

如果数据发送成功,返回:SEND OK

如果数据发送失败,返回:SEND FAIL

参数说明:

<link ID>:⽹络连接 ID 号 (0 ~ 4),⽤于多连接的情况

<length>:数字参数,表明发送数据的⻓度,最⼤⻓度为 2048

[<remote IP>]:UDP 传输可以设置对端 IP

[<remote port>]:UDP 传输可以设置对端端⼝

  • 执⾏指令:

AT+CIPSEND

功能:在透传模式时,开始发送数据。

响应:

收到此命令后先换⾏返回 >。进⼊透传模式发送数据,每包最⼤ 2048 字节,或者每包数据以 20 ms 间隔区分。当输⼊单独⼀包 +++ 时,返回普通 AT 指令模式。发送 +++ 退出透传时,请⾄少间隔 1 秒再发下⼀条 AT 指令。本指令必须在开启透传模式以及单连接下使⽤。若为 UDP 透传,指令 AT+CIPSTART 参数<UDP mode> 必须为0。

其它指令请查询官方手册。

代码示例

变量介绍

USARTx_Send_String()    //串口发送字符串函数
USARTx_Receive_String() //串口接收字符串函数
char USART3_words[1024] //接收到的字符串保存的地址
printf()			   //将信息打印至电脑(已重定向)

ESP8266发送命令

u8 ESP8266_Send_ATCmd(char *CMD,char *ack)
{
    u8 i;
    u16 j;
    for(i=0; i<5; i++)
    {
        USARTx_Send_String(USART3,CMD); //把命令发出去
        for(j=0; j<10*1000; j++)  		//60s
        {
            if(j%50==0) printf(">");
            if(USART3_Flag) 			//确认是否收到回复
            {
                USART3_Flag = 0;
                if(strstr((char *)USART3_words, ack))  //确认收到的回复是否正确
                {
                     return 1;
                }
            }
            delayMs(1);
        }
    }
    return 0;
}

ESP8266 TCP服务器模式

u8 ESP8266_AP_TcpServerMode_Init(char *ssid, char *pwd)
{
    char *p1 = NULL;
    char *p2 = NULL;

    //1,发送AT测试指令
    if(!ESP8266_Send_ATCmd("AT\r\n","OK")) return 0xE1;
    
    //2,配置WIFI的工作模式:AP模式
    if(!ESP8266_Send_ATCmd("AT+CWMODE=2\r\n","OK")) return 0xE2;

    
    //3,设置AP模式下的相关信息:SSID,PWD,PORT
    snprintf(buff, sizeof(buff), "AT+CWSAP_DEF=\"%s\",\"%s\",5,4\r\n", ssid, pwd);
    if(!ESP8266_Send_ATCmd(buff,"OK")) return 0xE3;


    
    //4,查询本地IP地址
    if(!ESP8266_Send_ATCmd("AT+CIFSR\r\n","OK")) return 0xE4;
    /*
        +CIFSR:APIP,"192.168.4.1"
        +CIFSR:APMAC,"86:f3:eb:be:8e:f6"
    
        OK
    */

    //解析IP
    p1 = strstr((char *)USART3_words, "APIP");
    if(p1)
    {
        p2 = strstr(p1+6, "\"");  //获取第二个引号的地址
        strncpy(ip, p1+6, p2-(p1+6)); 
    }    
    
    //解析MAC地址
    p1 = strstr(p2, "APMAC");
    if(p1)
    {
        strncpy(mac, p1+7, 17);  
    }
    
    //5,开启多连接模式
    if(!ESP8266_Send_ATCmd("AT+CIPMUX=1\r\n","OK")) return 0xE5;


    //6,建立TCP服务器,等待客户端连接
    if(!ESP8266_Send_ATCmd("AT+CIPSERVER=1\r\n","OK")) return 0xE6;


    //相关信息
    printf("WIFI_SSID: %s\n", ssid);
    printf("WIFI_PWD: %s\n", pwd);
    printf("IP: %s\n", ip);
    printf("MAC: %s\n", mac);
    printf("duankou: 333\n");
    
    return 0;
}

u8 ESP8266_AP_TcpServer_SendData(u8 clientId, char *txData)
{
    snprintf(buff, sizeof(buff), "AT+CIPSEND=%d,%d\r\n", clientId, strlen(txData));
    if(!ESP8266_Send_ATCmd(buff, ">")) return 1;
    if(!ESP8266_Send_ATCmd(txData, "SEND OK")) return 2; 
    return 0;
}

ESP8266 TCP客户端模式

u8 ESP8266_STA_TCPClientMode_Init(char *ssid, char *pwd, char *ip, u16 port)
{
    //1,发送AT测试指令
    if(!ESP8266_Send_ATCmd("AT\r\n", "OK")) return 0xE1;
    printf("1\n");
    //2,配置WIFI工作模式:STA模式
    if(!ESP8266_Send_ATCmd("AT+CWMODE=1\r\n", "OK")) return 0xE2;
    printf("2\n");
    USARTx_Send_String(USART3,"AT+RST\r\n");
    delayS(3);
    //3,连接热点
    snprintf(buff, sizeof(buff), "AT+CWJAP_DEF=\"%s\",\"%s\"\r\n", ssid, pwd);
    if(!ESP8266_Send_ATCmd(buff, "OK")) return 0xE3;
    printf("3\n");
    //4,查询本机IP
    if(!ESP8266_Send_ATCmd("AT+CIFSR\r\n", "OK")) return 0xE4;
    printf("4\n");
    //5,开启单连接
    if(!ESP8266_Send_ATCmd("AT+CIPMUX=0\r\n", "OK")) return 0xE5;
    printf("5\n");
    //6,连接服务器
    snprintf(buff, sizeof(buff), "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ip, port);
    if(!ESP8266_Send_ATCmd(buff, "OK")) return 0xE6;
    printf("6\n");


    printf("WIFI name: %s\n", ssid);
    printf("WIFI password: %s\n", pwd);
    printf("IP address: %s\n", ip);
    printf("duankou: %d\n", port);
    
    return 0;
}

u8 ESP8266_STA_TCPClient_SendData(char *txData)
{
    //AT+CIPSEND=<length>     >
    snprintf(buff, sizeof(buff), "AT+CIPSEND=%d\r\n", strlen(txData));
    if(!ESP8266_Send_ATCmd(buff, ">")) return 1;
    if(!ESP8266_Send_ATCmd(txData, "SEND OK")) return 2; 
    
    printf("%s\n",USART3_words);
    return 0;    
}
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值