十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

article/2025/9/27 17:10:03

目录

  • 一、固件库模板
  • 二、准备资料
  • 三、简介
    • 1. 引脚
    • 2. 无线组网
      • 2.1 ESP8266 在 SoftAP 模式
      • 2.2 ESP8266 在 station 模式
      • 2.3 ESP8266 在 SoftAP + station 共存模式
    • 3、透传功能
    • 4. 基本配置(所有AT指令都必须换行)
    • 4. 模式配置
      • 4.1 STA 模式
      • 4.2 AP 模式
  • 四、实验
    • 1.硬件设计
    • 2.软件设计
      • 2.1 复制工程 (复制stm32-USART串口通讯工程)
      • 2.2 新建hc_05文件(打开工程)
      • 2.3 编写代码
        • 1. 使用串口助手和网络助手实现ESP8266通信
        • 2. 使用ESP8266 STA模式实现透传功能
          • 2.1 复制工程 (复制stm32-USART串口通讯工程)
          • 2.2 新建文件,打开工程,添加路径
          • usart.c
          • usart.h
          • esp8266.c
          • esp8266.h
          • esp8266_test.c
          • esp8266_test.h
          • main.c
        • 3. ESP8266使用Ap模式控制mcu
          • led.c
          • led.h
          • usart.c
          • esp8266_test.c
          • esp8266_test.h
          • main.c
    • 3. 编译
    • 4. 选择烧录工具并配置MDK
    • 5. 成品
      • 1. 使用MCU完成透传功能
      • 2. ESP8266使用Ap模式控制mcu
  • 工程链接

一、固件库模板

见博客:stm32f103c8t6新建固件库模板(可自取)

二、准备资料

  1. 固件库模板

  2. MDK5开发环境

  3. stm32参考手册

  4. UART串口协议

  5. stm32中断概念

  6. ESP8266模块资料

  7. 利用固件库模板点灯工程(下面第三行,手动狗头)

  8. CH340 USB→TTL模块

  9. ESP8266模块

  10. 手机软件

实验程序已经发布到百度网盘,本文末有链接可以自取

stm32参考手册

串口协议查看这篇博客USART串口协议

stm32中断概念STM32中断应用概括

ESP8266模块资料:ESP8266

串口调试工具 :https://pan.baidu.com/s/1V-jRJzb0INDXDLo9I4CJ6A 提取码:0000

网络助手(PC):https://pan.baidu.com/s/1EeDtr7eW-mIuOEZa1_4BWA 提取码:0000

网络调试助手(安卓)链接: https://pan.baidu.com/s/1uDGpyGt8VyUzcZXmWfTqhw 提取码: 0000

三、简介

在这里插入图片描述

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

  • 支持STA/AP/STA+AP 三种工作模式
  • 内置TCP/IP协议栈,支持多路TCP Client连接
  • 支持UART/GPIO数据通信接口
  • 支持Smart Link 智能联网功能
  • 内置32位MCU,可兼作应用处理器
  • 3.3V 单电源供电
  • 支持丰富的Socket AT指令

1. 引脚

标号PIN引脚说明
13V3模块供电正极
2RST低电平复位,高电平工作(默认高)
3EN使能端,需要进入命令模式时接3.3V
4TX发送端
5RX接收端
6IO0工作模式选择:悬空:FlashBoot,工作模式;下拉:UARTDownload,下载模式
7IO2(1)开机上电时必须为高电平,禁止硬件下拉;(2)内部默认已拉高
8GND模块供电负极

本模块使用USART协议,具体请看下面两个博客,这里就不继续讲解了
USART串口协议
四、stm32-USART串口通讯(重定向、接发通信、控制LED亮灭)

2. 无线组网

ESP8266 支持 softAP 模式, station 模式, softAP + station 共存模式三种。
利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。

  • SoftAP: 即无线接入点, 是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。
  • Station:即无线终端, 是一个无线网络的终端。

2.1 ESP8266 在 SoftAP 模式

ESP8266 作为 softAP(热点),手机、 电脑、 用户设备、 其他 ESP8266 station 接口等均可以作为 station(终端用户) 连入ESP8266, 组建成一个局域网。
在这里插入图片描述

2.2 ESP8266 在 station 模式

ESP8266 作为 station,通过路由器(AP) 连入 internet ,可向云端服务器上传、 下载数据。用户可随时使用移动终端(手机、 笔记本等) ,通过云端监控 ESP8266 模块的状况, 向 ESP8266 模块发送控制指令。

简单的来说就是ESP连接热点(可以上网),也可以手机上网,此时手机可以控制ESP8266

在这里插入图片描述

2.3 ESP8266 在 SoftAP + station 共存模式

ESP8266 支持 softAP+station 共存的模式,用户设备、 手机等可以作为station 连入 ESP8266 的 softAP 接口,同时, 可以控制 ESP8266 的 station接口通过路由器(AP) 连入 internet。

在这里插入图片描述

3、透传功能

透传, 即透明传输功能。 Host 通过 uart 将数据发给ESP8266, ESP8266 再通过无线网络将数据传出去;ESP8266 通过无线网络接收到的数据,同理通过uart 传到 Host。 ESP8266 只负责将数据传到目标地址,不对数据进行处理,发送方和接收方的数据内容、 长度完全一致,传输过程就好像透明一样。
透传需要先建立连接:

Q: 什么是透传模式?

A: 透传模式影响发送数据的方式。

如果不开启透传模式,发送数据前都必须先发送指令AT+CIPSEND=,例如:

AT+CIPSEND=4     
OK
>                //在 > 后面输入要上传的数据

开启了透传模式:

AT+CIPMODE=1	进入透传模式
AT+CIPSEND 		之后发送的所有内容将全部当成数据

退出透传模式: 发送数据"+++"就可以了。注意:此时“+++”后面,不接发送新行

注意:透传只能在单连接模式下进行,所以在建立连接之前一定要用(AT+CIPMUX=0 设置单连接)

>  AT+CIPMODE=1
>  CIPMUX and CIPSERVER must be 0

4. 基本配置(所有AT指令都必须换行)

命令描述
基础指令
AT测试 AT 启动
AT+RST重启模块
AT+GMR查看版本信息
wifi 功能指令
AT+CWMODE选择 WIFI 应用模式
AT+CWJAP加入 AP
AT+CWLAP列出当前可用 AP
AT+CWQAP退出与 AP 的连接
AT+CWSAP设置 AP 模式下的参数
AT+ CWLIF查看已接入设备的 IP
TCP/IP 指令
AT+CIPSTATUS获得连接状态
AT+CIPSTART建立 TCP 连接或注册 UDP 端口号
AT+CIPSEND发送数据
AT+CIPCLOSE关闭 TCP 或 UDP
AT+CIFSR获取本地 IP 地址
AT+CIPMUX启动多连接
AT+CIPSERVER配置为服务器
AT+CIPMODE设置模块传输模式
AT+CIPSTO设置服务器超时时间
+IPD接收到的数据

AT命令的详细说明在ESP8266这里面什么都有

4. 模式配置

4.1 STA 模式

STA 模式: ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。

配置步骤:

 1. AT+CWMODE=1                    设置模组为STA模式。(串口助手)2. AT+CWLAP                 	   查询附近 WIFI(串口助手)3. AT+CWJAP="1202","12345678"     连接 WIFI(串口助手)4. AT+CIPMUX=0                    打开单连接(串口助手)5. AT+CIPSTART="TCP","192.168.2.6",808  (自己对应的ip地址,端口号随便,只要没有被占用都行)6. AT+CIPMODE=1				 使用透传模式7. AT+CIPSEND                    

4.2 AP 模式

AP 模式: ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。

配置步骤:

1. AT+CWMODE=2
2. AT+CIPAP="192.168.4.1"
3. AT+CWSAP="ESP8266","12345678",1,0
4. AT+CIPMUX=1
5. AT+CIPSERVER=1,8888
6. AT+CIPSTO=1800
7. AT+CIFSR

四、实验

1.硬件设计

  1. ESP8266与串口通信
    GND接GND
    VCC接3.3
    RXD—CH340的TXD
    TXD—CH340的RXD
  2. 用ESP8266控制MCU
    CH340的TXD-----USART1的RX引脚相连(c8t6 的PA10)
    CH340的RXD-----USART1的TX引脚相连(c8t6 的PA9)
    ESP8266的TXD-----USART2的RX引脚相连(c8t6 的PA3)
    ESP8266的RXD-----USART2的TX引脚相连(c8t6 的PA2)

2.软件设计

  1. 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;

  2. 初始化 GPIO,并将 GPIO 复用到 USART 上;

  3. 配置 USART 参数;

  4. 配置中断控制器并使能 USART 接收中断;

  5. 使能 USART;

  6. 在 USART 接收中断服务函数实现数据接收和发送。

2.1 复制工程 (复制stm32-USART串口通讯工程)

四、stm32-USART串口通讯(重定向、接发通信、控制LED亮灭)

2.2 新建hc_05文件(打开工程)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 编写代码

1. 使用串口助手和网络助手实现ESP8266通信

ESP8266的波特率为115200,8位数据位、1位停止位、无奇偶校验的通信格式。

  1. 发送AT,回复OK
    在这里插入图片描述

  2. AT+CWMODE=1 设置模组为STA模式。

  3. AT+CWLAP 查询附近 WIFI
    在这里插入图片描述

  4. AT+CWJAP=“XXX”,“XXXX” 连接 WIFI(必须为第3步能查找到的)

  5. AT+CIPMUX=0 打开单连接(否则不能透传)
    在这里插入图片描述

  6. AT+CIPSTART=“TCP”,“192.168.2.6”,808 (自己对应的ip地址,端口号随便,只要没有被占用都行)

  7. AT+CIPMODE=1 使用透传模式

  8. AT+CIPSEND

在这里插入图片描述

2. 使用ESP8266 STA模式实现透传功能

2.1 复制工程 (复制stm32-USART串口通讯工程)

四、stm32-USART串口通讯(重定向、接发通信、控制LED亮灭)

2.2 新建文件,打开工程,添加路径

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

usart.c

在USART1_IRQHandler方法下面添加 usart2的初始化和中断

struct  STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };
volatile uint8_t ucTcpClosedFlag = 0;void uart2_init(u32 bound) {//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART2_TX   GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA2//USART2_RX	  GPIOA.3初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3//Usart2 NVIC 配置NVIC_PriorityGroupConfig(macNVIC_PriorityGroup_x);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//使能串口总线空闲中断USART_Cmd(USART2, ENABLE);
}void USART2_IRQHandler(void)                	//串口1中断服务程序
{u8 Res;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART2);	//读取接收到的数据//USART_SendData(USART1,Res);if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )                       //预留1个字节写结束符strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ]  = Res;}if ( USART_GetITStatus( USART2, USART_IT_IDLE ) == SET )                                         //数据帧接收完毕{strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;Res = USART_ReceiveData( USART2 );ucTcpClosedFlag = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "CLOSED\r\n" ) ? 1 : 0;}
}
usart.h

添加strHC05_Fram_Record结构体和uart2_init(u32 bound)函数

extern struct  STRUCT_USARTx_Fram                                  //串口数据帧的处理结构体
{//STRUCT_USARTx_Fram 读取的数据char  Data_RX_BUF [ RX_BUF_MAX_LEN ];union {__IO u16 InfAll;struct {__IO u16 FramLength       :15;                               // 14:0__IO u16 FramFinishFlag   :1;                                // 15} InfBit;};}strUSART_Fram_Record,strEsp8266_Fram_Record;//如果想串口中断接收,请不要注释以下宏定义
void uart1_init(u32 bound);
void uart2_init(u32 bound);
esp8266.c

#include "esp8266.h"
#include "delay.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>/********************************************************************************
*RST --  A4EN  --	A5TX  --	A2(USART2_TX)RX  --	A3(USART2_RX)********************************************************************************/static void                   ESP8266_GPIO_Config                 ( void );/*** @brief  ESP8266初始化函数* @param  无* @retval 无*/
void ESP8266_Init ( void )
{ESP8266_GPIO_Config ();ESP8266_RST_HIGH_LEVEL();ESP8266_CH_DISABLE();}/*** @brief  初始化ESP8266用到的GPIO引脚* @param  无* @retval 无*/
static void ESP8266_GPIO_Config ( void )
{/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/* 配置 CH_PD 引脚*/ESP8266_CH_PD_APBxClock_FUN ( ESP8266_CH_PD_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = ESP8266_CH_PD_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init ( ESP8266_CH_PD_PORT, & GPIO_InitStructure );/* 配置 RST 引脚*/ESP8266_RST_APBxClock_FUN ( ESP8266_RST_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = ESP8266_RST_PIN;GPIO_Init ( ESP8266_RST_PORT, & GPIO_InitStructure );}/** 函数名:ESP8266_Cmd* 描述  :对WF-ESP8266模块发送AT指令* 输入  :cmd,待发送的指令*         reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系*         waittime,等待响应的时间* 返回  : 1,指令发送成功*         0,指令发送失败* 调用  :被外部调用*/
bool ESP8266_Cmd ( char *cmd, char *reply1, char *reply2, u32 waittime )
{strEsp8266_Fram_Record .InfBit .FramLength = 0;               //从新开始接收新的数据包ESP8266_Usart ( "%s\r\n", cmd );if ( ( reply1 == 0 ) && ( reply2 == 0 ) )                      //不需要接收数据return true;Delay_ms ( waittime );                 //延时//增加一个结束符。strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';//将USART2接收到的东西全部打印出来,接收到的保存在这个数组里,//通过串口1发送出来,这样就能看到,我们发送的指令的响应,是否出错,//例如:发送AT,响应是OK, ESP_USART接收到的数据是AT OK.在交给USART1发送,在PC机的串口调试助手可以看到这些信息,PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );strEsp8266_Fram_Record .InfBit .FramLength = 0;                             //清除接收标志strEsp8266_Fram_Record.InfBit.FramFinishFlag = 0;if ( ( reply1 != 0 ) && ( reply2 != 0 ) )return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );else if ( reply1 != 0 )return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );elsereturn ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
}/** 函数名:ESP8266_Rst* 描述  :重启WF-ESP8266模块* 输入  :无* 返回  : 无* 调用  :被 ESP8266_AT_Test 调用*/
void ESP8266_Rst ( void )
{
#if 0ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );#elseESP8266_RST_LOW_LEVEL();Delay_ms ( 500 );ESP8266_RST_HIGH_LEVEL();
#endif}/*
* 函数名:ESP8266_DHCP_CUR
* 描述  :<mode>:0:设置 ESP8266 SoftAP1:设置 ESP8266 Station2:设置 ESP8266 SoftAP 和 Station<en>:0:关闭 DHCP1:开启 DHCP
* 输入  :None
* 返回  :1/0
* 调用  :ESP8266_StaTcpClient_Unvarnish_ConfigTest调用
*/
bool ESP8266_DHCP_CUR ( )
{char cCmd [40];//把格式数据写成串(函数指令)sprintf ( cCmd, "AT+CWDHCP_CUR=1,1");return ESP8266_Cmd ( cCmd, "OK", NULL, 500 );
}bool ESP8266_AT_Test ( void )
{char count = 0;ESP8266_RST_HIGH_LEVEL();printf("\r\nAT测试.....\r\n");Delay_ms ( 2000 );while ( count < 10 ){printf("\r\nAT测试次数 %d......\r\n", count);if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ){printf("\r\nAT测试启动成功 %d......\r\n", count);return 1;}ESP8266_Rst();++ count;}return 0;
}/*
* 函数名:ESP8266_Net_Mode_Choose
* 描述  :设置WF模式—ESP8266工作方式
* 输入  :None
* 返回  :状态值
* 调用  :内部调用
*/
bool ESP8266_Net_Mode_Choose(ENUM_Net_ModeTypeDef enumMode)
{switch (enumMode){//设置WiFi模式case STA :return ESP8266_Cmd("AT+CWMODE=1", "OK", "no change", 2500);case AP:return ESP8266_Cmd("AT+CWMODE=2", "OK", "no change", 2500);case STA_AP:return ESP8266_Cmd("AT+CWMODE=3", "OK", "no change", 2500);default:return false;}
}/** 函数名:ESP8266_JoinAP* 描述  :WF-ESP8266模块连接外部WiFi* 输入  :pSSID,WiFi名称字符串*       :pPassWord,WiFi密码字符串* 返回  : 1,连接成功*         0,连接失败* 调用  :被外部调用*/
bool ESP8266_JoinAP(char *pSSID, char *pPassWord)
{char cCmd [120];//把格式数据写成串(函数指令)sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord);return ESP8266_Cmd ( cCmd, "OK", NULL, 1500 );
}/** 函数名:ESP8266_BuildAP* 描述  :WF-ESP8266模块创建WiFi热点* 输入  :pSSID,WiFi名称字符串*       :pPassWord,WiFi密码字符串*       :enunPsdMode,WiFi加密方式代号字符串* 返回  : 1,创建成功*         0,创建失败* 调用  :被外部调用*/
bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
{char cCmd [120];sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );}/** 函数名:ESP8266_Enable_MultipleId* 描述  :WF-ESP8266模块启动多连接* 输入  :enumEnUnvarnishTx,配置是否多连接* 返回  : 1,配置成功*         0,配置失败* 调用  :被外部调用*/
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{char cStr [20];//启动多连接sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );return ESP8266_Cmd ( cStr, "OK", 0, 500 );
}/** 函数名:ESP8266_Link_Server* 描述  :WF-ESP8266模块连接外部服务器,* 输入  :enumE,网络协议*       :ip,服务器IP地址字符串*       :ComNum,服务器端口字符串*       :id,模块连接服务器的ID* 返回  : 1,连接成功*         0,连接失败* 调用  :被外部调用*/
bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char *ip, char *ComNum, ENUM_ID_NO_TypeDef id)
{char cStr [100] = { 0 }, cCmd [120];switch (  enumE ){case enumTCP://"TCP","iot.espressif.cn",8000sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );break;case enumUDP:sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );break;default:break;}if ( id < 5 )//建立TCP连接sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);elsesprintf ( cCmd, "AT+CIPSTART=%s", cStr );//如果连接已经存在,则返回ALREAY CONNECTreturn ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
}/** 函数名:ESP8266_StartOrShutServer* 描述  :WF-ESP8266模块开启或关闭服务器模式* 输入  :enumMode,开启/关闭*       :pPortNum,服务器端口号字符串*       :pTimeOver,服务器超时时间字符串,单位:秒* 返回  : 1,操作成功*         0,操作失败* 调用  :被外部调用*/
bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char *pPortNum, char *pTimeOver )
{char cCmd1 [120], cCmd2 [120];if ( enumMode ){//建立TCP服务器sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );//设置TCP服务器超出时间sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );}else{sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );}
}/** 函数名:ESP8266_Get_LinkStatus* 描述  :获取 WF-ESP8266 的连接状态,较适合单端口时使用* 输入  :无* 返回  : ESP8266 Station 接?口的状态*				 2: ESP8266 Station 已连接 AP,获得 IP 地址*         3: ESP8266 Station 已建立 TCP 或 UDP 传输*         4: ESP8266 Station 断开网络连接*         0: ESP8266 Station 获取状态失败* 调用  :被外部调用*/
uint8_t ESP8266_Get_LinkStatus ( void )
{//查询 WF-ESP8266 的连接状态if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )return 2;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )return 3;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )return 4;}return 0;
}/** 函数名:ESP8266_Get_IdLinkStatus* 描述  :获取 WF-ESP8266 的端口(Id)连接状态,较适合多端口时使用* 输入  :无* 返回  : 端口(Id)的连接状态,低5位为有效位,分别对应Id5~0,某位若置1表该Id建立了连接,若被清0表该Id未建立连接* 调用  :被外部调用*/
uint8_t ESP8266_Get_IdLinkStatus ( void )
{uint8_t ucIdLinkStatus = 0x00;if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )//给第一位置1ucIdLinkStatus |= 0x01;else//给第一位清0ucIdLinkStatus &= ~ 0x01;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )ucIdLinkStatus |= 0x02;elseucIdLinkStatus &= ~ 0x02;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )ucIdLinkStatus |= 0x04;elseucIdLinkStatus &= ~ 0x04;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )ucIdLinkStatus |= 0x08;elseucIdLinkStatus &= ~ 0x08;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )ucIdLinkStatus |= 0x10;elseucIdLinkStatus &= ~ 0x10;}return ucIdLinkStatus;
}/** 函数名:ESP8266_Inquire_ApIp* 描述  :获取 ESP8266 的 AP IP* 输入  :pApIp,存放 AP IP 的数组的首地址*         ucArrayLength,存放 AP IP 的数组的长度* 返回  : 0,获取失败*         1,获取成功* 调用  :被外部调用*/
uint8_t ESP8266_Inquire_ApIp ( char *pApIp, uint8_t ucArrayLength )
{char uc;char *pCh;//查询本地 IP 地址ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );if ( pCh )pCh += 6;elsereturn 0;for ( uc = 0; uc < ucArrayLength; uc ++ ){pApIp [ uc ] = * ( pCh + uc);if ( pApIp [ uc ] == '\"' ){pApIp [ uc ] = '\0';break;}}return 1;}/** 函数名:ESP8266_UnvarnishSend* 描述  :配置WF-ESP8266模块进入透传发送* 输入  :无* 返回  : 1,配置成功*         0,配置失败* 调用  :被外部调用*/
bool ESP8266_UnvarnishSend ( void )
{//先设置传输模式,如果连接断开会不断重连,除非+++if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )return false;//在透传模式时,开始发送数据returnESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );
}/** 函数名:ESP8266_ExitUnvarnishSend* 描述  :配置WF-ESP8266模块退出透传模式* 输入  :无* 返回  : 无* 调用  :被外部调用*/
void ESP8266_ExitUnvarnishSend ( void )
{Delay_ms ( 1000 );ESP8266_Usart ( "+++" );Delay_ms ( 500 );
}/** 函数名:ESP8266_SendString* 描述  :WF-ESP8266模块发送字符串* 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式*       :pStr,要发送的字符串*       :ulStrLength,要发送的字符串的字节数*       :ucId,哪个ID发送的字符串* 返回  : 1,发送成功*         0,发送失败* 调用  :被外部调用*/
bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char *pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{char cStr [20];bool bRet = false;//如果设置透传模式直接发送信息if ( enumEnUnvarnishTx ){ESP8266_Usart ( "%s", pStr );bRet = true;}else//先看什么连接再发送数据的长度,再发送数据{//如果是多连接需要AT+CIPSEND=<link	ID>,<length>把格式数据写成串if ( ucId < 5 )sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );elsesprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );//先返回>再接收串口数据ESP8266_Cmd ( cStr, "> ", 0, 100 );//如果数据发送成功,返回:SEND	OK,否则SEND FATLbRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 500 );}return bRet;}/** 函数名:ESP8266_ReceiveString* 描述  :WF-ESP8266模块接收字符串* 输入  :enumEnUnvarnishTx,声明是否已使能了透传模式* 返回  : 接收到的字符串首地址* 调用  :被外部调用*/
char *ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{char *pRecStr = 0;strEsp8266_Fram_Record .InfBit .FramLength = 0;strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';//增加一个结束符。if ( enumEnUnvarnishTx )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;else{if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;}return pRecStr;}/** 函数名:ESP8266_CWLIF* 描述  :查询已接入设备的IP* 输入  :pStaIp,存放已接入设备的IP* 返回  : 1,有接入设备*         0,无接入设备* 调用  :被外部调用*/
uint8_t ESP8266_CWLIF ( char *pStaIp )
{uint8_t uc, ucLen;char *pCh, * pCh1;ESP8266_Cmd ( "AT+CWLIF", "OK", 0, 100 );pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "," );if ( pCh ){pCh1 = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "AT+CWLIF\r\r\n" ) + 11;ucLen = pCh - pCh1;}elsereturn 0;for ( uc = 0; uc < ucLen; uc ++ )pStaIp [ uc ] = * ( pCh1 + uc);pStaIp [ ucLen ] = '\0';return 1;
}/** 函数名:ESP8266_CIPAP* 描述  :设置模块的 AP IP* 输入  :pApIp,模块的 AP IP* 返回  : 1,设置成功*         0,设置失败* 调用  :被外部调用*/
uint8_t ESP8266_CIPAP ( char *pApIp )
{char cCmd [ 30 ];sprintf ( cCmd, "AT+CIPAP=\"%s\"", pApIp );if ( ESP8266_Cmd ( cCmd, "OK", 0, 5000 ) )return 1;elsereturn 0;
}/** 函数名:ESP8266_CIPAP* 描述  :设置模块的 AP IP* 输入  :pApIp,模块的 AP IP* 返回  : 1,设置成功*         0,设置失败* 调用  :被外部调用*/
uint8_t ESP8266_CIPSTA ( char *pStaIp )
{char cCmd [ 30 ];sprintf ( cCmd, "AT+CIPSTA=\"%s\"", pStaIp );if ( ESP8266_Cmd ( cCmd, "OK", 0, 5000 ) )return 1;elsereturn 0;}
esp8266.h
#ifndef __ESP8266_H_
#define __ESP8266_H_#include "stm32f10x.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include <stdbool.h>/******************************* ESP8266 数据类型定义 ***************************/
//工作模式
typedef enum
{STA,AP,STA_AP
} ENUM_Net_ModeTypeDef;//网络协议
typedef enum
{enumTCP,enumUDP,
} ENUM_NetPro_TypeDef;//模块连接服务器的ID
typedef enum
{Multiple_ID_0 = 0,Multiple_ID_1 = 1,Multiple_ID_2 = 2,Multiple_ID_3 = 3,Multiple_ID_4 = 4,Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;//
typedef enum
{OPEN = 0,WEP = 1,WPA_PSK = 2,WPA2_PSK = 3,WPA_WPA2_PSK = 4,
} ENUM_AP_PsdMode_TypeDef;/******************************** ESP8266 连接引脚定义 ***********************************/
#define      ESP8266_CH_PD_APBxClock_FUN                   RCC_APB2PeriphClockCmd
#define      ESP8266_CH_PD_CLK                             RCC_APB2Periph_GPIOB
#define      ESP8266_CH_PD_PORT                            GPIOB
#define      ESP8266_CH_PD_PIN                             GPIO_Pin_8#define      ESP8266_RST_APBxClock_FUN                     RCC_APB2PeriphClockCmd
#define      ESP8266_RST_CLK                               RCC_APB2Periph_GPIOB
#define      ESP8266_RST_PORT                              GPIOB
#define      ESP8266_RST_PIN                               GPIO_Pin_9#define      ESP8266_USARTx                                 USART2
#define      DEBUG_USARTx                         	        USART1/******************************* ESP8266 外部全局变量声明 *******************123********//*********************************************** ESP8266 函数宏定义 *******************************************/
#define     ESP8266_Usart( fmt, ... )           USART_printf ( ESP8266_USARTx, fmt, ##__VA_ARGS__ )
#define     PC_Usart( fmt, ... )                printf ( fmt, ##__VA_ARGS__ )
//#define     macPC_Usart( fmt, ... )#define     ESP8266_CH_ENABLE()                 GPIO_SetBits ( ESP8266_CH_PD_PORT, ESP8266_CH_PD_PIN )
#define     ESP8266_CH_DISABLE()                GPIO_ResetBits ( ESP8266_CH_PD_PORT, ESP8266_CH_PD_PIN )#define     ESP8266_RST_HIGH_LEVEL()            GPIO_SetBits ( ESP8266_RST_PORT, ESP8266_RST_PIN )
#define     ESP8266_RST_LOW_LEVEL()             GPIO_ResetBits ( ESP8266_RST_PORT, ESP8266_RST_PIN )/******************************** ESP8266 函数声明  *********************************/
void                     ESP8266_Init                        ( void );
void                     ESP8266_Rst                         ( void );
bool                     ESP8266_Cmd                         ( char *cmd, char *reply1, char *reply2, u32 waittime );
bool                     ESP8266_AT_Test                     ( void );
bool                     ESP8266_Net_Mode_Choose             ( ENUM_Net_ModeTypeDef enumMode );
bool                     ESP8266_JoinAP                      ( char *pSSID, char *pPassWord );
bool                     ESP8266_BuildAP                     ( char *pSSID, char *pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode );
bool                     ESP8266_Enable_MultipleId           ( FunctionalState enumEnUnvarnishTx );
bool                     ESP8266_Link_Server                 ( ENUM_NetPro_TypeDef enumE, char *ip, char *ComNum, ENUM_ID_NO_TypeDef id);
bool                     ESP8266_StartOrShutServer           ( FunctionalState enumMode, char *pPortNum, char *pTimeOver );
uint8_t                  ESP8266_Get_LinkStatus              ( void );
uint8_t                  ESP8266_Get_IdLinkStatus            ( void );
uint8_t                  ESP8266_Inquire_ApIp                ( char *pApIp, uint8_t ucArrayLength );
bool                     ESP8266_UnvarnishSend               ( void );
void                     ESP8266_ExitUnvarnishSend           ( void );
bool                     ESP8266_SendString                  ( FunctionalState enumEnUnvarnishTx, char *pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId );
char                    *ESP8266_ReceiveString               ( FunctionalState enumEnUnvarnishTx );
bool                     ESP8266_DHCP_CUR                    ( void );uint8_t                  ESP8266_CWLIF                       ( char * pStaIp );
uint8_t                  ESP8266_CIPAP                       ( char * pApIp );
uint8_t                  ESP8266_CIPSTA                      ( char * pStaIp );  // new//void ESP8266_AT_Test ( void );
#endif
esp8266_test.c

#include "esp8266_test.h"
#include "esp8266.h"
#include <stdio.h>
#include "led.h"
#include <string.h>
#include <stdbool.h>//volatile uint8_t ucTcpClosedFlag = 0;
bool ESP8266_AT_Test ( void );/*** @brief  ESP8266 StaTcpClient Unvarnish 配置测试函数* @param  无* @retval 无*/
void ESP8266_StaTcpClient_Unvarnish_ConfigTest(void)
{printf( "\r\n正在配置 ESP8266 ......\r\n" );printf( "\r\n使能 ESP8266 ......\r\n" );ESP8266_CH_ENABLE();while( ! ESP8266_AT_Test() );while( ! ESP8266_DHCP_CUR () );printf( "\r\n正在配置工作模式 STA ......\r\n" );while( ! ESP8266_Net_Mode_Choose ( STA ) );printf( "\r\n正在连接 WiFi ......\r\n" );while( ! ESP8266_JoinAP ( User_ESP8266_ApSsid, User_ESP8266_ApPwd ) );printf( "\r\n禁止多连接 ......\r\n" );while( ! ESP8266_Enable_MultipleId ( DISABLE ) );printf( "\r\n正在连接 Server ......\r\n" );while( !	ESP8266_Link_Server ( enumTCP, User_ESP8266_TcpServer_IP, User_ESP8266_TcpServer_Port, Single_ID_0 ) );printf( "\r\n进入透传发送模式 ......\r\n" );while( ! ESP8266_UnvarnishSend () );printf( "\r\n配置 ESP8266 完毕\r\n" );printf ( "\r\n开始透传......\r\n" );}/*** @brief  ESP8266 检查是否接收到了数据,检查连接和掉线重连* @param  无* @retval 无*/
void ESP8266_CheckRecvDataTest(void)
{uint8_t ucStatus;uint16_t i;/* 如果接收到了串口调试助手的数据 */if(strUSART_Fram_Record.InfBit.FramFinishFlag == 1){for(i = 0; i < strUSART_Fram_Record.InfBit.FramLength; i++){USART_SendData( ESP8266_USARTx,strUSART_Fram_Record.Data_RX_BUF[i]);  //转发给ESP82636while(USART_GetFlagStatus(ESP8266_USARTx,USART_FLAG_TC)==RESET) {}     //等待发送完成}strUSART_Fram_Record .InfBit .FramLength = 0;                                //接收数据长度置零strUSART_Fram_Record .InfBit .FramFinishFlag = 0;                            //接收标志置零}/* 如果接收到了ESP8266的数据 */if(strEsp8266_Fram_Record.InfBit.FramFinishFlag){for(i = 0; i < strEsp8266_Fram_Record .InfBit .FramLength; i++){USART_SendData( DEBUG_USARTx,strEsp8266_Fram_Record .Data_RX_BUF[i]);     //转发给ESP82636while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TC)==RESET) {}}strEsp8266_Fram_Record .InfBit .FramLength = 0;                             //接收数据长度置零strEsp8266_Fram_Record.InfBit.FramFinishFlag = 0;                           //接收标志置零}if ( ucTcpClosedFlag )                                             //检测是否失去连接{ESP8266_ExitUnvarnishSend ();                                    //退出透传模式do ucStatus = ESP8266_Get_LinkStatus ();                         //获取连接状态while ( ! ucStatus );if ( ucStatus == 4 )                                             //确认失去连接后重连{printf ( "\r\n正在重连热点和服务器 ......\r\n" );while ( ! ESP8266_JoinAP ( User_ESP8266_ApSsid, User_ESP8266_ApPwd ) );while ( !	ESP8266_Link_Server ( enumTCP, User_ESP8266_TcpServer_IP, User_ESP8266_TcpServer_Port, Single_ID_0 ) );printf ( "\r\n重连热点和服务器成功\r\n" );}while ( ! ESP8266_UnvarnishSend () );}
}
esp8266_test.h
#ifndef  __ESP8266_TEST_H
#define	 __ESP8266_TEST_H#include "stm32f10x.h"/********************************** 用户需要设置的参数**********************************/
#define      User_ESP8266_ApSsid                       "ChinaNet-057B"                //要连接的热点的名称
#define      User_ESP8266_ApPwd                        "abc1314520"           //要连接的热点的密钥#define      User_ESP8266_TcpServer_IP                 "192.168.2.6"      //要连接的服务器的 IP
#define      User_ESP8266_TcpServer_Port               "808"               //要连接的服务器的端口/********************************** 外部全局变量 ***************************************/
extern volatile uint8_t ucTcpClosedFlag;
extern int read_dht11_finish;/********************************** 测试函数声明 ***************************************/
void ESP8266_StaTcpClient_Unvarnish_ConfigTest(void);
void ESP8266_CheckRecvDataTest(void);
#endif
main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "esp8266.h"
#include "esp8266_test.h"
#include "stm32f10x.h"
#include "stdio.h"int main()
{uart1_init(115200);	 	//串口初始化为115200uart2_init(115200);	 	//串口初始化为115200/* 初始化 */LED_GPIO_Config();ESP8266_Init ();ESP8266_StaTcpClient_Unvarnish_ConfigTest();                          //对ESP8266进行配置while(1){ESP8266_CheckRecvDataTest();}
}

3. ESP8266使用Ap模式控制mcu

stm32f103c8t6自带一个led灯,使用PC13引脚就行了,

切记尽量避免使用PB3、PB4,具体看stm32f103c8t6使用PB3和PB4做普通GPIO使用时发现异常

led.c
#include "led.h"	//绑定led.hvoid LED_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStruct; //初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。//开启RCC时钟RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);//配置初始化,推挽输出方式和LED_G_GPIO_PIN管脚、赫兹GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//GPIO口初始化GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
}
led.h
#ifndef __LED_H_
#define __LED_H_#include "stm32f10x.h"
#include "sys.h"#define LED_G_GPIO_PIN         GPIO_Pin_13
#define LED_G_GPIO_PORT        GPIOC
#define LED_G_GPIO_CLK         RCC_APB2Periph_GPIOC
//使用位带操作来实现操作某个IO口的 1个位,由sys.h实现
#define LED 				   PCout(13)void LED_GPIO_Config(void); //函数定义#endif
usart.c

usart.c 、usart.h 、esp8266.c、esp8266.h等文件和实现穿透的代码一样,

esp8266_test.c

#include "esp8266_test.h"
#include "esp8266.h"
#include <stdio.h>
#include "led.h"
#include "delay.h"
#include <string.h>
#include <stdbool.h>uint8_t ucId, ucLen;
uint8_t ucLed1Status = 0;
char cStr [ 100 ] = { 0 }, cCh;
char *pCh, * pCh1;//volatile uint8_t ucTcpClosedFlag = 0;
bool ESP8266_AT_Test ( void );/*** @brief  ESP8266 ApTcpServer 配置测试函数* @param  无* @retval 无*/
void ESP8266_ApTcpServer_ConfigTest(void)
{printf( "\r\n正在配置 ESP8266 ......\r\n" );printf( "\r\n使能 ESP8266 ......\r\n" );ESP8266_CH_ENABLE();while( ! ESP8266_AT_Test() );printf( "\r\n正在配置工作模式为 AP ......\r\n" );while( ! ESP8266_Net_Mode_Choose ( AP ) );printf( "\r\n正在创建WiFi热点 ......\r\n" );while ( ! ESP8266_CIPAP ( User_ESP8266_TcpServer_IP ) ); //设置模块的 AP IPwhile ( ! ESP8266_BuildAP ( User_ESP8266_BulitApSsid, User_ESP8266_BulitApPwd, User_ESP8266_BulitApEcn ) );printf( "\r\n允许多连接 ......\r\n" );while( ! ESP8266_Enable_MultipleId ( ENABLE ) );printf( "\r\n开启服务器模式 ......\r\n" );while ( !	ESP8266_StartOrShutServer ( ENABLE, User_ESP8266_TcpServer_Port, User_ESP8266_TcpServer_OverTime ) );ESP8266_Inquire_ApIp ( cStr, 20 );printf ( "\n本模块WIFI为 %s,密码开放\nAP IP 为:%s,开启的端口为:%s\r\n手机网络助手连接该 IP 和端口,最多可连接5个客户端\n",User_ESP8266_BulitApSsid, cStr, User_ESP8266_TcpServer_Port );strEsp8266_Fram_Record .InfBit .FramLength = 0;strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;printf( "\r\n配置 ESP8266 完毕\r\n" );}/*** @brief  ESP8266 检查接收信息并发送数据测试函数* @param  无* @retval 无*/
void ESP8266_CheckRecvDataTest(void)
{if ( strEsp8266_Fram_Record .InfBit .FramFinishFlag )					//如果有数据传输结束{USART_ITConfig ( ESP8266_USARTx, USART_IT_RXNE, DISABLE ); //禁用串口接收中断,防止影响strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';printf("ucCh =%s\n", strEsp8266_Fram_Record .Data_RX_BUF);if(strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "LED=1" ))	//如果手机发送的数据存在LED=1,则if成立{PCout(13) = 1; //PC口13引脚输出,高电平printf("\r\nLED灭\r\n");Delay_ms(500);		//已经在delay.h中初始化}else	if(strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "LED=0" )){PCout(13) = 0; //PC口13引脚输出,低电平printf("\r\nLED亮\r\n");Delay_ms(500);}if ( ( pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD," ) ) != 0 ){ucId = * ( pCh + strlen ( "+IPD," ) ) - '0';ESP8266_SendString ( DISABLE, cStr, strlen ( cStr ), ( ENUM_ID_NO_TypeDef ) ucId );}strEsp8266_Fram_Record .InfBit .FramLength = 0;strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;USART_ITConfig ( ESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断}
}
esp8266_test.h
#ifndef  __ESP8266_TEST_H
#define	 __ESP8266_TEST_H#include "stm32f10x.h"/********************************** 用户需要设置的参数**********************************/
#define      User_ESP8266_ApSsid                       "ChinaNet-057B"                //要连接的热点的名称
#define      User_ESP8266_ApPwd                        "abc1314520"           //要连接的热点的密钥#define      User_ESP8266_TcpServer_IP                 "192.168.4.1"      //要连接的服务器的 IP
#define      User_ESP8266_TcpServer_Port               "8888"               //要连接的服务器的端口#define   	 User_ESP8266_BulitApSsid         "ESP8266"      //要建立的热点的名称
#define   	 User_ESP8266_BulitApEcn           OPEN               //要建立的热点的加密方式
#define   	 User_ESP8266_BulitApPwd           "12345678"         //要建立的热点的密钥#define      User_ESP8266_TcpServer_OverTime   "1800"             //服务器超时时间(单位:秒)/********************************** 外部全局变量 ***************************************/
extern volatile uint8_t ucTcpClosedFlag;
extern int read_dht11_finish;/********************************** 测试函数声明 ***************************************/
void ESP8266_ApTcpServer_ConfigTest(void);
void ESP8266_CheckRecvDataTest(void);
#endif
main.c

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "esp8266.h"
#include "esp8266_test.h"
#include "stm32f10x.h"
#include "stdio.h"int main()
{uart1_init(115200);	 	//串口初始化为115200uart2_init(115200);	 	//串口初始化为115200/* 初始化 */LED_GPIO_Config();ESP8266_Init ();ESP8266_ApTcpServer_ConfigTest();                          //对ESP8266进行配置while(1){ESP8266_CheckRecvDataTest();}
}

3. 编译

编译成功
在这里插入图片描述

4. 选择烧录工具并配置MDK

本文选择的是ST_Link烧录工具
在这里插入图片描述
在这里插入图片描述
如果没有ID号看博客:ST-Link V2烧录问题(已解决)
在这里插入图片描述
在这里插入图片描述

5. 成品

1. 使用MCU完成透传功能

在这里插入图片描述

2. ESP8266使用Ap模式控制mcu

在这里插入图片描述
在这里插入图片描述
这个工具开头已经提供

这里PC13已经亮灭了就没有上传截图,大家自己可以试试

工程链接

使用MCU完成透传功能:
链接:https://pan.baidu.com/s/1RugvDofb_JQDTqpoYFQ-8w 提取码:0000
ESP8266使用Ap模式控制mcu:
链接:https://pan.baidu.com/s/1Fol88R_HwS9LNbLXYpN5Iw 提取码:0000


http://chatgpt.dhexx.cn/article/OSqexjy2.shtml

相关文章

如何用 ESP-AT 进行多种场景下的 UDP 透传

> 此博客将会记录三种不同的测试场景下的 UDP 透传 ESP 设备开启 Wi-Fi AP UDP Server 模式ESP 设备开启 Wi-Fi AP UDP Client 模式ESP 设备开启 Wi-Fi Station UDP Client 模式ESP 设备开启 Wi-Fi Station UDP Server 模式 1 ESP 设备开启 Wi-Fi AP UDP Server 模式 说…

WIFI-TTL透传模块

简介 WiFi-TTL透传模块基于我司DT-ESPC2-12模块研发&#xff0c;引出串口TTL、EN、STATE 等引脚。产品内置我司最新版本的串口透传固件可完成设备TTL 端口到WiFi/云的数据实时透传。本模块可直接取代原有的有线串口&#xff0c;实现嵌入式设备数据采集和控制。 TTL-WiFi 模块…

vue透传

太香了 背景介绍 透传是一个通讯层面的概念&#xff0c;指的是在通讯中不管传输的业务内容如何&#xff0c;只负责将传输的内容由源地址传输到目的地址&#xff0c;而不对业务数据内容做任何改变。 其实透传这个概念&#xff0c;我最早是从上面一个领导那里听到的&#xff0…

Ra-08透传固件应用

目录 1、功能介绍2、硬件接线3、固件烧录4、应用说明指令说明指令使用示例应用示例 5、联系我们 1、功能介绍 Ra-08透传固件主要功能有&#xff0c;设置发送或者接收模式&#xff0c;配置各个射频参数&#xff0c;设置本地地址与发送的目标地址&#xff0c;设置进入睡眠模式等…

EC800G透传模式

透传&#xff1a;指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。1.准备 安信可透传云http://netlab.luatos.com/ QCOM_V1.6 LTE Standard TCP/IP 应用指导 2.AT指令格式介绍 2.1场景配置 该命令可用来配置、、以及其他TCP/IP 场景参数。Qo…

【无线通信】一文讲透串口透传

而随着万物互联的深入&#xff0c;想要实现智能设备的通信&#xff0c;串口透传就是一种非常高效的通信方式。 ** 什么是串口透传&#xff1f; ** 透传&#xff1a;透明传输&#xff08;SerialNet&#xff09;。即在传输过程中&#xff0c;对外界透明&#xff0c;不管所传输的…

ESP8266配置透传模式(AT指令)

ESP8266使用AT指令的前提是模块已烧录AT固件&#xff0c;固件可以在官网下载&#xff0c;固件烧录这里也直接略过&#xff0c;可以参考其他博文 AT指令恢复出厂设置 用AT指令将ESP8266恢复出厂设置&#xff08;因为之前配置了什么也不确定&#xff0c;直接恢复出厂&#xff09…

透传,无线透传

透传: 透传&#xff0c;即透明传输&#xff0c;指的是在通讯中不管传输的业务内容如何&#xff0c;只负责将传输的内容由源地址传输到目的地址&#xff0c;而不对业务数据内容做任何改变。 无线透传模块&#xff1a; 透明传输模块&#xff0c;透明传输就是在传输过程中&#x…

关于ESP8266的透传模式测试(一)——TCP Client透传模式

一、前言 本次测试所使用的是正点原子的ATK-ESP8266 WIFI模块。直接使用官方提供的固件使用AT指令来配置模块并使用。 模块默认为AT指令状态&#xff0c;模拟波特率为115200&#xff08;8bit数据位&#xff0c;1bit停止位&#xff09;。 硬件连接 使用USB转TTL方式&#xf…

一文了解透传云基础知识

一文了解透传云基础知识 一&#xff1a;透传云定义&#xff0c; 首先了解下透传的定义 透传&#xff1a;透明传输。即在传输过程中&#xff0c;不管所传输的内容、数据协议形式&#xff0c;不对数据做任何处理&#xff0c;只是把需要传输的内容数据传输到目的。 透传云&#xf…

一个网工的十年奋斗史 - 移民篇

我在茶余饭后总能听到&#xff1a;某同事出国以后的生活多好&#xff0c;什么时候买了个别墅大house&#xff0c;什么时候晒了一下蓝天白云没有雾霾&#xff0c;让人羡慕不已。 可是我们也同样忽略了移民背后的努力和艰辛。殊不知对于移民的人来说&#xff0c;需要舍弃很多。试…

准备全面转入SAP和SOA领域

同事跑过来说他撞死了一只袋鼠。 为什么什么事都有&#xff1f; Whatever... 这周5最后一天工作&#xff0c;除了今天早上工作紧张点&#xff0c;已经完全没有什么事情了。爽死了&#xff0c;终于可以不工作了&#xff0c;可以天天在家睡大觉啦。哈哈哈。真是工作后才知道…

天使投资人给阿里新贵们的一些建议

作者曾为 Facebook 早期员工&#xff0c;现为天使投资人。 这几天被阿里的同志们的喜事刷屏&#xff0c;让我想起来当年 Facebook 上市的场景。都是一个众望所归的 IPO&#xff0c;但 Facebook 弄砸了&#xff0c;阿里很成功&#xff01; Congratulations&#xff01; 当然&…

在淘宝做前端的这三年 — 第三年

关注“重度前端” 专注前端、专注全栈、输出价值 助力前端深度学习 ━━━━ 更加深入内容发布业务 自从去年掌握了一些业务分析方法&#xff0c;今年工作更喜欢做业务了。由于阿里员工自己不能开淘宝帐号运营&#xff0c;所以我开了个公众号做竞品调研&#xff0c;站在一个创…

【转载】大龄码农的新西兰移民之路

大龄码农的新西兰移民之路 【转载】博主地址&#xff1a;https://www.cnblogs.com/yanxiaodi/p/MoveToNewZealand.html 最近一年没怎么发博客&#xff0c;确实在忙一件事情——移民新西兰。如今已顺利入职&#xff0c;新西兰绿卡正在申请过程中&#xff0c;终于有时间将最近一年…

ENVI波段合成逆运算——波段拆分

APP Store中查找工具&#xff0c;第8页“将多波段图像拆分成多个单波段文件 V5.3”。 点击 Install App安装插件。重启ENVI后&#xff0c;可以看到Toolbox / Extensions下有Split to Multiple Single-Band Files工具。 ENVI中打开需要进行波段拆分的文件。 点击Split to Multi…

遥感基础——红外波段分类

红外波长的分类 红外线是波长介乎微波与可见光之间的电磁波&#xff0c;波长为0.75&#xff5e;1000 μm&#xff0c;其中&#xff0c;近红外、短波红外、中波红外、长波红外所在区间如下&#xff1a; - 近红外 (Near Infrared, NIR) : 0.75~1.1 μm - 短波红外 (Short …

频段划分

电磁波频段的划分 射频&#xff08;300KHz-300MHz&#xff09;&#xff1a;包括LF&#xff0c;MF&#xff0c;HF&#xff0c;VHF 微波&#xff08;300MHz-3000GHz&#xff09;&#xff1a;包括UHF&#xff0c;SHF&#xff0c;EHF&#xff0c;PHF 微波频段的划分 波段频率范围…

雷达篇(四)雷达工作波段

目录 1、简介 2、波段划分 3、各波段雷达功能 4、波长计算公式 1、简介 不同波段电磁波的传播方式和特点各有不同&#xff0c;所以它们的用途也不同。电磁波段划分如图 1所示。 在雷达行业&#xff0c;雷达工作频率划分成为若干波段&#xff0c;由低到高的顺序依次是高频&a…

指数波段划分以及底部反弹行业特征统计分析

本文参考国金证券杨勇博士最近发的研报《底部反弹特征统计分析》&#xff0c;在优矿网做一个分析实现。 首先是作出指数的波段划分图&#xff0c;用以确定指数的各个底部。 1 import numpy as np 2 import pandas as pd 我写了如下一个函数&#xff0c;可以用于划出各个指数的波…