ESP8266模块(WIFI STM32)
目录
一、介绍
二、传感器原理
1.原理图
2.引脚描述
3.ESP8266基础AT指令介绍
4.ESP8266基础工作模式
三、程序设计
main.c文件
esp8266.h文件
esp8266.c文件
四、实验效果
五、资料获取
项目分享
一、介绍
ESP8266是一款嵌入式系统级芯片,它集成了Wi-Fi功能和微控制器能力于一身,常用于物联网(IoT)项目中。这款芯片支持TCP/IP协议栈,能够连接到WiFi网络,并通过AT命令或者更高级的API与主控设备进行通信。它的低功耗特性使得它可以长时间运行在电池供电下,广泛应用于智能家居、智能门锁、无线传感器网络等应用中。
以下是ESP8266-01S模块的参数:
型号 | ESP8266-01S |
使用电压 | 3.0~3.6V |
WIFI模式 | STATION/AP/STATION+AP |
通信距离 | 100M |
天线 | PCB板载天线 |
SPI FLASH | 1MB |
天线标准 | 802.11B/G/N |
哔哩哔哩视频链接:
ESP8266模块(WIFI STM32)
(资料分享见文末)
二、传感器原理
1.原理图
2.引脚描述
引脚名称 | 描述 |
GND | GND |
IO2 | 通用IO内部已上拉 |
IO0 | 工作模式选择 |
RXD | 串口接收 |
3V3 | 电源正极3.3V |
RST | 复位 |
EN | 使能 |
TX | 串口发送 |
3.ESP8266基础AT指令介绍
4.ESP8266基础工作模式
ESP8266WIFI 模式有两种,一种叫 AP 模式,一种叫 Station 模式,AP 就是我们平时所说的热点,如 WIFI 路由器,开了热点的手机,或者是公共热点等,这些 AP 设备可以允许其他设备(如手机,笔记本电脑等)输入热点名和密码(也可不设置密码)后接入,Station 则是前面说的连接 AP 的设备,如:手机,笔记本电脑等,ESP8266 还有第三种模式:AP+Station,即:将 AP 和 Station 的功能合二为一,但是应用的场景不多,这里不做展示。
三、程序设计
使用STM32F103C8T6通过网络调试助手(APP)控制LED亮灭。
ESP8266_TX | PA3 |
ESP8266_RX | PA2 |
LED | PA0 |
串口 | 串口1 |
main.c文件
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "esp8266.h"/*****************辰哥单片机设计******************STM32* 项目 : ESP8266模块通信实验 * 版本 : V1.0* 日期 : 2024.9.30* MCU : STM32F103C8T6* 接口 : 参看usart2.h * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥 **********************BEGIN***********************/uint8_t flag;int main(void)
{ SystemInit();//配置系统时钟为72M delay_init(72);LED_Init();LED_On();USART_Config();ESP8266_Init (); //初始化WiFi模块使用的接口和外设(使用串口2)ESP8266_StaTcpClient ();//WiFi模块设置printf("Start \n");delay_ms(1000);while (1){switch(flag){case 'a': LED_On();break;//开灯case 'c': LED_Off();break;//关灯} }
}
esp8266.h文件
#ifndef __ESP8266_H
#define __ESP8266_H#include "stm32f10x.h"
#include "common.h"
#include <stdio.h>
#include <stdbool.h>/*****************辰哥单片机设计******************STM32* 项目 : ESP8266模块通信实验 * 版本 : V1.0* 日期 : 2024.9.30* MCU : STM32F103C8T6* 接口 : 串口2 * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥 **********************BEGIN***********************/#if defined ( __CC_ARM )
#pragma anon_unions
#endif/******************************* ESP8266 数据类型定义 ***************************/
typedef enum{STA,AP,STA_AP
} ENUM_Net_ModeTypeDef;typedef enum{enumTCP,enumUDP,
} ENUM_NetPro_TypeDef;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 RX_BUF_MAX_LEN 1024 //最大接收缓存字节数extern struct 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;}; } strEsp8266_Fram_Record;/******************************** ESP8266 连接引脚定义 ***********************************/
#define macESP8266_CH_PD_APBxClock_FUN RCC_APB2PeriphClockCmd
#define macESP8266_CH_PD_CLK RCC_APB2Periph_GPIOA
#define macESP8266_CH_PD_PORT GPIOA
#define macESP8266_CH_PD_PIN GPIO_Pin_5#define macESP8266_RST_APBxClock_FUN RCC_APB2PeriphClockCmd
#define macESP8266_RST_CLK RCC_APB2Periph_GPIOA
#define macESP8266_RST_PORT GPIOA
#define macESP8266_RST_PIN GPIO_Pin_6#define macESP8266_USART_BAUD_RATE 115200#define macESP8266_USARTx USART2
#define macESP8266_USART_APBxClock_FUN RCC_APB1PeriphClockCmd
#define macESP8266_USART_CLK RCC_APB1Periph_USART2
#define macESP8266_USART_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define macESP8266_USART_GPIO_CLK RCC_APB2Periph_GPIOA
#define macESP8266_USART_TX_PORT GPIOA
#define macESP8266_USART_TX_PIN GPIO_Pin_2
#define macESP8266_USART_RX_PORT GPIOA
#define macESP8266_USART_RX_PIN GPIO_Pin_3
#define macESP8266_USART_IRQ USART2_IRQn
#define macESP8266_USART_INT_FUN USART2_IRQHandler/*********************************************** ESP8266 函数宏定义 *******************************************/
#define macESP8266_Usart( fmt, ... ) USART_printf ( macESP8266_USARTx, fmt, ##__VA_ARGS__ )
#define macPC_Usart( fmt, ... ) printf ( fmt, ##__VA_ARGS__ )
//#define macPC_Usart( fmt, ... ) #define macESP8266_CH_ENABLE() GPIO_SetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )
#define macESP8266_CH_DISABLE() GPIO_ResetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )#define macESP8266_RST_HIGH_LEVEL() GPIO_SetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )
#define macESP8266_RST_LOW_LEVEL() GPIO_ResetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )/****************************************** ESP8266 函数声明 ***********************************************/
void ESP8266_Init ( void );
void ESP8266_Rst ( void );
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime );
void 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 );/********************************** 用户需要设置的参数**********************************/
#define macUser_ESP8266_ApSsid "www" //要连接的热点的名称
#define macUser_ESP8266_ApPwd "www123456" //要连接的热点的密钥//#define macUser_ESP8266_TcpServer_IP "192.168.0.11" //要连接的服务器的 IP
//#define macUser_ESP8266_TcpServer_Port "8080" //要连接的服务器的端口/********************************** 外部全局变量 ***************************************/
extern volatile uint8_t ucTcpClosedFlag;/********************************** 测试函数声明 ***************************************/
void ESP8266_StaTcpClient ( void );#endif /* __ESP8266_H */
esp8266.c文件
#include "esp8266.h" /*****************辰哥单片机设计******************STM32* 项目 : ESP8266模块通信实验 * 版本 : V1.0* 日期 : 2024.9.30* MCU : STM32F103C8T6* 接口 : 串口2 * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥 **********************BEGIN***********************/#include "esp8266.h"
#include "common.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "delay.h"volatile uint8_t ucTcpClosedFlag = 0;char cStr [ 1500 ] = { 0 };
static void ESP8266_GPIO_Config ( void );
static void ESP8266_USART_Config ( void );
static void ESP8266_USART_NVIC_Configuration ( void );
struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };/*** @brief ESP8266 (Sta Tcp Client)透传* @param 无* @retval 无*/
void ESP8266_StaTcpClient ( void )
{
// uint8_t ucStatus;
// char cStr [ 100 ] = { 0 };printf ( "\r\n正在配置 ESP8266 ......\r\n" );macESP8266_CH_ENABLE();ESP8266_AT_Test ();ESP8266_Net_Mode_Choose ( STA );while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) ); ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 1000 );ESP8266_Cmd ( "AT+CIPMUX=1", "OK", 0, 1000 );ESP8266_Cmd ( "AT+CIPSERVER=1,8288", "OK", 0, 1000 );//ESP8266_Cmd("AT+CIPSTART="TCP",192.168.1.1,8000","OK",0,1000);printf( "\r\n配置 ESP8266 完毕\r\n" ); }/*** @brief ESP8266初始化函数* @param 无* @retval 无*/
void ESP8266_Init ( void )
{
// ESP8266_GPIO_Config (); ESP8266_USART_Config (); // macESP8266_RST_HIGH_LEVEL();// macESP8266_CH_DISABLE();}/*** @brief 初始化ESP8266用到的GPIO引脚* @param 无* @retval 无*/
static void ESP8266_GPIO_Config ( void )
{/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/* 配置 CH_PD 引脚*/macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* 配置 RST 引脚*/macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN; GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); }/*** @brief 初始化ESP8266用到的 USART* @param 无* @retval 无*/
static void ESP8266_USART_Config ( void )
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART clock */macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );/* USART GPIO config *//* Configure USART Tx as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);/* USART1 mode config */USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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(macESP8266_USARTx, &USART_InitStructure);/* 中断配置 */USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断 USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断 ESP8266_USART_NVIC_Configuration ();USART_Cmd(macESP8266_USARTx, ENABLE);}/*** @brief 配置 ESP8266 USART 的 NVIC 中断* @param 无* @retval 无*/
static void ESP8266_USART_NVIC_Configuration ( void )
{NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );/* Enable the USART2 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/** 函数名:ESP8266_Rst* 描述 :重启WF-ESP8266模块* 输入 :无* 返回 : 无* 调用 :被 ESP8266_AT_Test 调用*/
void ESP8266_Rst ( void )
{#if 0ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); #elsemacESP8266_RST_LOW_LEVEL();delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL();#endif}/** 函数名: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; //从新开始接收新的数据包macESP8266_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';macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );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_AT_Test* 描述 :对WF-ESP8266模块进行AT测试启动* 输入 :无* 返回 : 无* 调用 :被外部调用*/void ESP8266_AT_Test ( void )
{char count=0;macESP8266_RST_HIGH_LEVEL(); delay_ms( 1000 );while ( count < 10 ){if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;ESP8266_Rst();++ count;}
}/** 函数名:ESP8266_Net_Mode_Choose* 描述 :选择WF-ESP8266模块的工作模式* 输入 :enumMode,工作模式* 返回 : 1,选择成功* 0,选择失败* 调用 :被外部调用*/
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{switch ( enumMode ){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, 5000 );}/** 函数名: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 )
{return ESP8266_Cmd ( "AT+CIPMUX=%d", "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:sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );break;case enumUDP:sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );break;default:break;}if ( id < 5 )sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);elsesprintf ( cCmd, "AT+CIPSTART=%s", cStr );return 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 ){sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );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 的连接状态,较适合单端口时使用* 输入 :无* 返回 : 2,获得ip* 3,建立连接* 3,失去连接* 0,获取状态失败* 调用 :被外部调用*/
uint8_t ESP8266_Get_LinkStatus ( void )
{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," ) )ucIdLinkStatus |= 0x01;else ucIdLinkStatus &= ~ 0x01;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )ucIdLinkStatus |= 0x02;else ucIdLinkStatus &= ~ 0x02;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )ucIdLinkStatus |= 0x04;else ucIdLinkStatus &= ~ 0x04;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )ucIdLinkStatus |= 0x08;else ucIdLinkStatus &= ~ 0x08;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )ucIdLinkStatus |= 0x10;else ucIdLinkStatus &= ~ 0x10; }return ucIdLinkStatus;}/** 函数名:ESP8266_Inquire_ApIp* 描述 :获取 F-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;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 )
//{
// ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 );
//}/** 函数名:ESP8266_ExitUnvarnishSend* 描述 :配置WF-ESP8266模块退出透传模式* 输入 :无* 返回 : 无* 调用 :被外部调用*/
void ESP8266_ExitUnvarnishSend ( void )
{delay_ms( 1000 );macESP8266_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 ){macESP8266_Usart ( "%s", pStr );bRet = true;}else{if ( ucId < 5 )sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );elsesprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );ESP8266_Cmd ( cStr, "> ", 0, 1000 );bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );}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模块(WIFI STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.ESP8266基础AT指令介绍 4.ESP8266基础工作模式 三、程序设计 main.c文件 esp8266.h文件 esp8266.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 ESP8266是一款嵌入式系统级芯片,它集成了Wi…...
微信小程序学习实录9:掌握wx.chooseMedia实现多图片文件上传功能(选择图片、预览图片、上传图片)
要实现多图片上传到服务器,需要在小程序前端和PHP后端分别进行相应的设置。 基本流程 微信小程序提供了丰富的API来支持多图片上传功能。在微信小程序中实现多图片的选择、预览以及上传到服务器的功能: 1. 选择图片 使用 wx.chooseImage API 可以让用…...

助动词的分类及其缩略形式
助动词的分类及其缩略形式 1. 助动词 (auxiliary verb)2. 基本助动词 (primary auxiliary)2.1. 基本助动词 be、do 和 have2.2. 实义动词 be、do 和 have 3. 情态助动词 (modal auxiliary)3.1. 情态助动词取代情态动词 4. 半助动词 (semi-auxiliary)4.1. 不能与 it ... that-cl…...

Redis——分布式锁
在一个分布式系统中,只要涉及到多个节点访问同一个公共资源的时候,就需要加锁来实现互斥,从而达到线程安全的问题。 但是呢,分布式系统不同一些,因为分布式系统部署在不同的服务器上,很可能大量的请求打到…...
C++面试速通宝典——13
208. class里面定义int a,如果不实现构造函数,实例化这个类,a的值是? 答:a的值是未定义的(在C标准中成为“未初始化”)。 解释: 在C中,如果一…...

数据结构(二叉树)
1. 树相关术语 父结点/双亲结点:如果一个结点有子结点那么它就是父结点或者双亲结点;例如A是BCDEFG的父结点,J是PQ的父结点等等;子结点:一个结点含有的子树的根节点称为该结点的子结点;如上图的H是D的子结点…...

Windows 通过 Docker 安装 GitLab
1. 安装 Docker Desktop 下载网站:Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符,拉取 GitLab 镜像: docker pull gitlab/gitlab-ee:latest或则使用社区版: docker pull gitlab/gitlab-ce…...

SQL专项练习第六天
Hive 在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案,并通过实际案例进行演示。 先在home文件夹下建一个hivedata文件夹&a…...

CSS——属性值计算
CSS——属性值计算 今天来详细讲解一下 CSS的属性值计算过程,这是 CSS 的核心之一(另一个是视觉可视化模型,个人理解,这个相对复杂,以后再讲)。 基本概念 层叠样式表:Cascade Style Sheet&am…...
408算法题leetcode--第26天
496. 下一个更大元素 I 题目地址:496. 下一个更大元素 I - 力扣(LeetCode) 题解思路:单调栈,如注释 时间复杂度:O(n m) 空间复杂度:O(n) 代码: class Solution { public:vector<int&g…...
JavaScript 与浏览器存储
JavaScript提供了两种存储数据的方式:LocalStorage和SessionStorage。这两种方式都是浏览器提供的客户端存储解决方案,可以将数据保存在用户的浏览器中,供网站使用。 LocalStorage和SessionStorage的区别在于数据的作用域和生命周期。 Loca…...

Chromium 如何查找已经定义好的mojom函数实现c++
进程通信定义通常都是用.mojom文件或者idl文件格式 以content\common\frame.mojom里面的BeginNavigation函数为例。 一、如何查找BeginNavigation函数定义,在vscode里面直接搜索BeginNavigation,过滤条件 *.idl,*.mojom,*.cc 效果: 这样…...

图文深入理解Oracle DB Scheduler(续)-调度的创建
List item 今天是国庆假期最后一天。窗外,秋雨淅淅沥沥淅淅下个不停。继续深宅家中,闲来无事,就多写几篇博文。 本篇承接前一篇,继续图文深入介绍Oracle DB Scheduler。本篇主要介绍调度的创建。 1. 创建基于时间的作业 • 可以…...

基于Springboot的宠物咖啡馆平台的设计与实现(源码+定制+参考)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

Conda答疑
文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…...

Python 工具库每日推荐【PyPDF2】
文章目录 引言Python PDF 处理库的重要性今日推荐:PyPDF2 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:PDF文件合并案例分析高级特性加密和解密PDF添加水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…...
Nacos的应用
什么是nacos? Nacos是一个开源的动态服务发现,配置管理和服务治理平台。主要用于构建原生应用和微服务架构。它是阿里巴巴开源的项目,整合了配置管理,服务管理,服务发现的功能,核心价值在于帮助用户在云平…...

CSS圆角
在制作网页的过程中,有时我们可能需要实现圆角的效果,以前的做法是通过切图(将设计稿切成便于制作成页面的图片),使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了,CSS3 中提供了一系列属性…...

信息安全工程师(37)防火墙概述
前言 防火墙是一种网络安全系统,旨在监控和控制网络流量,根据预定义的安全规则决定是否允许数据包的传输。 一、定义与功能 定义:防火墙是网络安全的第一道防线,由硬件设备和软件系统共同构成,位于外网与内网之间、公共…...

多元化网络团队应对复杂威胁
GenAI、ML 和 IoT 等技术为威胁者提供了新的工具,使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse ,到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫,新的网络威胁几乎每天都在出现…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...