一、ESP-01S介绍

1.1 产品简介

  • ESP-01S该模块核心处理器 ESP8266 在较小尺寸封装中集成了超低功耗 32 位微型MCU,ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能
  • ESP-01S Wi-Fi 模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。 用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器
  • ESP8266 只需通过 SPI/SDIO 接口或 UART 接口即可作为 Wi-Fi 适配器,应用到基于任何微控制器设计中
  • 支持 STA/AP/STA+AP 工作模式通用 AT 指令可快速上手

1.2 AT指令

基础AT指令 AT
 测试 AT 启动 
 AT+RST 
 重启模块 
 AT+RESTORE 
 恢复出厂设置功能 
 Wifi 功能 AT 指令

 AT+CWMODE 
 选择 WIFI 应用模式 
 AT+CWJAP 
 加入 AP 
 AT+CWSAP 
 设置 AP 模式下的参数 
 TCP/IP 工具箱 AT 指令 
 AT+CIPMUX   启动多连接 
 AT+CIPSTART   建立 TCP 连接 
 AT+CIPMODE   设置模块传输模式 
 AT+CIPSERVER   配置为服务器 
 AT+CIPSEND   发送数据 

二、使用方法

这里先使用电脑通过串口与ESP-01S通信首先确保连线正确:GND接GND、3.3V接VCC、RX接TXD、TX接RXD;接线正确后把 USB转TTL模块 插入电脑,然后打开串口助手,波特率选115200,然后点打开串口,正常情况下上电后ESP-01S的蓝灯会闪几下然后打印一堆乱码如图:

发送AT 正常会返回OK,没有收到这些? 那这边建议重新刷固件了

2.1 连接wifi

1. 设置工作模式为STA:AT+CWMODE=1

AT+CWMODE=1        // 1是station(设备)模式        2AP(路由)模式         3是双模

OK                              // 返回OK

2. 连接wifi,AT+CWJAP="WIFI名字","WIFI密码"

这里注意一定是英文状态下的双引号,连接后下次ESP-01S启动后就会自动连接此WIFI

AT+CWJAP="xxx","xxxxxxxx"        // wifi名称和密码根据实际填入

WIFI GOT IP                                  // 成功连接会返回WIFI GOT IP  

2.2 释放wifi

1. 设置工作模式为AP:AT+CWMODE=2

AT+CWMODE=2        // 设置为AP模式 也就是ESP-01S可以开热点了

OK                              // 返回OK

2. 设置wifi账号密码:AT+CWSAP="WIFI名字","WIFI密码",1,3 

AT+CWSAP="ESP8266","12345678",1,3        // ESP-01S开热点,WIFI密码最少设置8位

OK                                                                    // 返回OK

2.3 作为TCP客户端连接网络调试助手并进行数据透传(设备模式)

前提:ESP-01S和电脑处在同一个局域网内,可以电脑连ESP-01S的热点,也可以ESP-01S连电脑的热点,也可以都连同一个网,电脑打开网络调试助手并开启TCP服务

1. 设置工作模式为STA:AT+CWMODE=1

2. 连接wifi:AT+CWJAP="WIFI名字","WIFI密码"

3. 设置单路链接模式:AT+CIPMUX=0

4. 连接TCP服务器:AT+CIPSTART="TCP","192.168.1.3",8080

5. 进入到透传模式:AT+CIPMODE=1        AT+CIPSEND

最后如何退出透传模式:首先把发送新行取消勾选,然后发送+++,等待1秒以上后勾选发送新行,然后发送AT即可退出透传模式。

2.4 作为TCP服务端并进行数据互传 (路由模式)

前提:ESP-01S和电脑处在同一个局域网内,可以电脑连ESP-01S的热点,也可以ESP-01S连电脑的热点,也可以都连同一个网。

1. 设置工作模式为AP:AT+CWMODE=2

2. 设置wifi账号密码:AT+CWSAP="ESP8266","12345678"

3. 设置多路链接模式:AT+CIPMUX=1

4. 建立TCP服务器:AT+CIPSERVER=1,8080

5. 电脑连接ESP-01S释放的wifi("ESP8266","12345678"),打开网络调试助手,填写主机地址(可以通过 AT+CIPAP? 查询)和端口号(已经被设置为8080),如下图所示6.

6.  发送数据:AT+CIPSEND=客户端ID,要发送的数据长度(这里以8个字节数据为例)

  • ESP-01S发送数据前需要发送AT指令(例如 AT+CIPSEND=0,8)
  • ESP-01S接收数据的格式为:+IPD,客户端ID,字节数:数据(例如 +IPD,0,8:87654321)

三、程序驱动

ESP8266.h

#ifndef __ESP8266_H
#define __ESP8266_H


void ESP8266_STA_Init(uint32_t baudrate);
void ESP8266_Printf(char *format, ...);

void ESP8266_AP_Init(uint32_t baudrate);
void ESP8266_AP_Send_String(char *string);

#endif

ESP8266.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
#include "string.h"
#include "Delay.h"
#include "USART1.h"

//本C文件的返回值
#define ESP8266_EOK                 0
#define ESP8266_ERROR               1

//工作模式
#define ESP8266_STA_MODE            1
#define ESP8266_AP_MODE             2
#define ESP8266_STA_AP_MODE         3

//单路链接模式
#define ESP8266_SINGLE_CONNECTION   0
#define ESP8266_MULTI_CONNECTION    1

//WIFI名称和密码
#define WIFI_SSID                   "Xiaomi13"
#define WIFI_PWD                    "12345678"

//TCP服务器地址和端口
#define TCP_SERVER_IP               "192.168.1.5"
#define TCP_SERVER_PORT             "8080"

/*ESP8266的STA配置函数*/
uint8_t ESP8266_At_Test(void);                                              //1. 测试esp8266是否存在
uint8_t ESP8266_Set_Mode(uint8_t mode);                                     //2. 设置工作模式为STA
uint8_t ESP8266_Connection_Mode(uint8_t mode);                              //3. 设置单路链接模式
uint8_t ESP8266_Join_Ap(char *ssid, char *pwd);                             //4. 连接wifi,SSID: %s, PWD: %s
uint8_t ESP8266_Connect_Tcpserver(char *server_ip, char *server_port);      //5. 连接TCP服务器,server_ip:%s, server_port:%s
uint8_t ESP8266_Enter_Unvarnished(void);                                    //6. 进入到透传模式

/*ESP8266的AP配置函数*/
uint8_t ESP8266_Set_WiFi(void);
uint8_t ESP8266_Build_Tcp_Server(void);
void ESP8266_Printf(char *format, ...);

/**
  * @brief  ESP8266_STA_客户端模式连接WIFI、TCP服务器
  */
void ESP8266_STA_Init(uint32_t baudrate)
{
    printf("esp8266初始化开始...\r\n");
    USART1_Init(baudrate);
    
    //esp8266的其它初始化
    printf("1. 测试esp8266是否存在...\r\n");
    while(ESP8266_At_Test() == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
        
    printf("2. 设置工作模式为STA...\r\n");
    while(ESP8266_Set_Mode(ESP8266_STA_MODE) == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
        
    printf("3. 设置单路链接模式...\r\n");
    while(ESP8266_Connection_Mode(ESP8266_SINGLE_CONNECTION) == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
        
    printf("4. 连接wifi,SSID: %s, PWD: %s\r\n", WIFI_SSID, WIFI_PWD);
    while(ESP8266_Join_Ap(WIFI_SSID, WIFI_PWD) == ESP8266_ERROR)
    {
        Delay_ms(500);
    }
      
    printf("5. 连接TCP服务器,server_ip:%s, server_port:%s\r\n", TCP_SERVER_IP, TCP_SERVER_PORT);
    while(ESP8266_Connect_Tcpserver(TCP_SERVER_IP, TCP_SERVER_PORT))
        Delay_ms(100);
    
    printf("6. 进入到透传模式...\r\n");
    while(ESP8266_Enter_Unvarnished())
        Delay_ms(100);
    
    printf("ESP8266已连接上TCP服务器并进入透传模式\r\n");
    printf("ESP8266初始化完成!\r\n");

}

/**
  * @brief  ESP8266_AP_服务端模式
  */
void ESP8266_AP_Init(uint32_t baudrate)
{
    printf("esp8266初始化开始...\r\n");
    USART1_Init(baudrate);
    
    //esp8266的其它初始化
    printf("1. 测试esp8266是否存在...\r\n");
    while(ESP8266_At_Test() == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
    
    printf("2. 设置工作模式为AP...\r\n");
    while(ESP8266_Set_Mode(ESP8266_AP_MODE) == ESP8266_ERROR)
    {
        Delay_ms(100);
    }

    printf("3. 设置wifi账号密码...\r\n");
    while(ESP8266_Set_WiFi() == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
    
    printf("4. 设置多路链接模式...\r\n");
    while(ESP8266_Connection_Mode(ESP8266_MULTI_CONNECTION) == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
    
    printf("5. 建立TCP服务器...\r\n");
    while(ESP8266_Build_Tcp_Server() == ESP8266_ERROR)
    {
        Delay_ms(100);
    }
    
    
    printf("ESP8266初始化完成!\r\n");
}

/**
  * @brief  ESP8266_AP_服务端模式,服务端给客户端发消息
  * @param  string:发送的字符串
  * @retval 无
  */
void ESP8266_AP_Send_String(char *string)
{
    ESP8266_Printf("AT+CIPSEND=0,%d\r\n",strlen(string));
    Delay_ms(10);
    USART1_SendString(string);
}

/**
  * @brief  调用串口1的打印函数
  */
void ESP8266_Printf(char *format, ...)
{
	char String[UART1_RX_BUF_SIZE];				//定义字符数组
	va_list arg;					            //定义可变参数列表数据类型的变量arg
	va_start(arg, format);			            //从format开始,接收参数列表到arg变量
	vsprintf(String, format, arg);	            //使用vsprintf打印格式化字符串和参数列表到字符数组中
	va_end(arg);					            //结束变量arg
	USART1_SendString(String);		            //串口发送字符数组(字符串)
}

/**
  * @brief  ESP8266发送命令字符串,并与期待返回的结果比较
  * @param  Cmd:发送命令字符串
  * @param  Res:期待返回字符串
  * @retval 500ms内得到期望字符串就返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Send_Command(char *Cmd, char *Res)
{
    uint8_t time_out = 50;
    USART1_RxPacket_Clear();
    USART1_SendString(Cmd);
    
    while(time_out--)
    {
        if(USART1_Wait_Receive() == UART_EOK)
        {
            if(strstr((const char*)USART1_RxPacket, Res) != NULL)
                return ESP8266_EOK;
        }
        Delay_ms(10);
    }
    
    return ESP8266_ERROR;
}

/**
  * @brief  测试ESP8266是否存在
  * @param  无
  * @retval 存在返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_At_Test(void)
{
    return ESP8266_Send_Command("AT\r\n", "OK");
}

/**
  * @brief  设置工作模式
  * @param  三种工作模式
  * @retval 成功设置返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Set_Mode(uint8_t mode)
{
    char cmd[64];
    sprintf(cmd, "AT+CWMODE=%d\r\n", mode);
    
    return ESP8266_Send_Command(cmd, "OK");
}

/**
  * @brief  设置单路链接模式
  * @param  两种模式
  * @retval 成功设置返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Connection_Mode(uint8_t mode)
{
    char cmd[64];
    sprintf(cmd, "AT+CIPMUX=%d\r\n", mode);
    
    return ESP8266_Send_Command(cmd, "OK");
}

/**
  * @brief  连接wifi
  * @param  账号和密码
  * @retval 成功连接返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Join_Ap(char *ssid, char *pwd)
{
    char cmd[64];
    sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
    
    return ESP8266_Send_Command(cmd, "WIFI GOT IP");
}

/**
  * @brief  连接TCP服务器
  * @param  server_ip:TCP地址
  * @param  server_port:服务器端口号
  * @retval 成功连接返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Connect_Tcpserver(char *server_ip, char *server_port)
{
    char cmd[64];
    sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%s\r\n", server_ip, server_port);
    return ESP8266_Send_Command(cmd, "CONNECT");
}

/**
  * @brief  进入透传模式
  * @param  无
  * @retval 成功连接返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Enter_Unvarnished(void)
{
    uint8_t ret;
    ret = ESP8266_Send_Command("AT+CIPMODE=1\r\n", "OK");
    ret += ESP8266_Send_Command("AT+CIPSEND\r\n", ">");
    if (ret == ESP8266_EOK)
        return ESP8266_EOK;
    else
        return ESP8266_ERROR;
}

/**
  * @brief  设置WiFi
  * @param  
  * @retval 成功返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Set_WiFi(void)
{
    return ESP8266_Send_Command("AT+CWSAP=\"ESP8266\",\"12345678\",1,4\r\n","OK");
}

/**
  * @brief  建立TCP服务器
  * @param  
  * @retval 成功返回UART_EOK,否则UART_ERROR
  */
uint8_t ESP8266_Build_Tcp_Server(void)
{
    return ESP8266_Send_Command("AT+CIPSERVER=1,8080\r\n", "OK");
}

四、效果展示

4.1 接线说明

ESP-01S STM32F103C8T6 USB转TTL模块 STM32F103C8T6
RX PA9 RX PA2
TX PA10 TX PA3

4.1 ESP8266的STA模式简单收发

4.2 ESP-01S的AP模式简单收发 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐