功能描述:

上电配置初始化时:第一个小灯会闪烁,配置完成时,小灯保持直亮;

上电完成,串口调试助手会出现ESP8266的参数,WIFI名称,WIFI密码,端口号等;

手机上连接这个WIFI,在手机上利用网络调试助手发送一些数据给ESP8266,ESP8266会将接收到的数据发送给手机,并且串口调试助手上会显示,哪部手机发送的数据和发送数据的长度。

串口调试助手是电脑端的,网络调试助手是手机端的,

上电完成,串口1显示各种初始化,如图:

按照显示的WIFI名称和密码,连接WIFI,连接后,打开手机上网络调试助手

网络调试助手配置如下:

打开网络调试助手

在串口调试助手上显示

看最后两句话:有客户端连接,表示我们手机已经连接上了(只有我们客户端发送一个数据这句话才能显示出来)

ID=0:表示这个客户端的分机号,就是在ESP8266看来,就是第一号客户

程序:

main.c

#include "stm32f10x.h"
#include "led.h"
#include "esp8266.h"
#include "esp8266_usart1.h"
#include "esp8266_usart2.h"
#include "esp8266_delay.h"extern char MCU_Rx_ESP8266_BUF[1024];
extern char MCU_Rx_ESP8266_Count;
char  Data_buff[2048];  //数据缓冲区
char  Data_len[5];      //数据长度缓冲区
char  Data_id[5];       //数据发送者的id缓冲区int main()
{USART1_GPIO_Init();USART2_Init();led_init();while(ESP8266_Cmd()==0){delay_ms(100);}else GPIO_ResetBits(GPIOC,GPIO_Pin_0);MCU_Rx_ESP8266_Count=0;                    //WiFi接收数据长度变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);            //清空 ESP8266_TO_MCU 接收缓冲区while(1){WiFi_Get_LinkSta();                               //检测有无客户端连接或是断开if(WiFi_Get_Data(Data_buff,Data_len,Data_id)){    //接收数据       MCU_Tx_USART1_Data("连接id:%s有%s字节数据到来\r\n",Data_id,Data_len);   //串口显示信息MCU_Tx_USART1_Data("数据:%s\r\n",Data_buff);                            //串口显示信息WiFi_SendData(Char_to_Hex(Data_id,strlen(Data_id)),Data_buff,strlen(Data_buff),500);//5s的发送超时时间,发送数据}}
}

esp8266.c

#include "esp8266.h"char a[]="AT+CWMODE=2";                   //设置成AP模式(路由器)
char b[]="AT+RST";                              //复位
char c[]="AT+CWSAP_DEF=\"ESP8266\",\"123456789\",5,4" ;//设置WIFI的名称,密码,通道号和加密方式
char d[]="AT+CIPAP=\"192.168.10.2\"";   //开启服务器并设置AP模式的IP地址
char h[]="AT+CIPMODE=0";           //关闭透传模式
char e[]="AT+CIPMUX=1";                        //设置多连接
char f[]="AT+CIPSERVER=1,8080";   //设置端口号
char g[]="AT+CIPAP=\"192.168.10.2\"";   //开启服务器并设置AP模式的IP地址 extern char MCU_Tx_ESP8266_BUF[1024];
extern char MCU_Rx_ESP8266_BUF[1024];
extern uint16_t MCU_Rx_ESP8266_Count;/* 单片机向ESP8266发送AT指令转化函数 */
void MCU_TO_ESP8266_Cmd(u8 *cmd)
{MCU_TO_ESP8266("%s\r\n",cmd);    //发送命令,需要加换行符
}
/* ESP8266复位函数 */
uint8_t ESP8266_RST(int timeout)
{MCU_Rx_ESP8266_Count=0;                    //WiFi接收数据长度变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);            //清空 ESP8266_TO_MCU 接收缓冲区 MCU_TO_ESP8266_Cmd("AT+RST");while(timeout--){delay_ms(100);led_shanshuo();if(strstr(MCU_Rx_ESP8266_BUF,"ready"))break;MCU_Tx_USART1_Data("%d ",timeout);}MCU_Tx_USART1_Data("\r\n");if(timeout<=0)return 1;else return 0;
}
/* 单片机向ESP8266发送AT指令函数 */
uint8_t MCU_To_ESP8266_Control(uint8_t *Cmd,int timeout)
{MCU_Rx_ESP8266_Count=0;                    //WiFi接收数据长度变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);            //清空 ESP8266_TO_MCU 接收缓冲区MCU_TO_ESP8266_Cmd(Cmd);while(timeout--){delay_ms(100);led_shanshuo();if(strstr(MCU_Rx_ESP8266_BUF,"OK"))break;   MCU_Tx_USART1_Data("%d ",timeout);}if(timeout<=0)return 1;else return 0;
}
/* ESP8266初始化配置函数 */
uint8_t ESP8266_Cmd()
{MCU_Tx_USART1_Data("准备复位ESP8266\r\n");if(ESP8266_RST(50)){MCU_Tx_USART1_Data("复位失败,准备重新复位\r\n");return 0;}else MCU_Tx_USART1_Data("复位成功\r\n");MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("ESP8266设置成AP模式\r\n");if(MCU_To_ESP8266_Control("AT+CWMODE=2",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置WIFI的名称和密码\r\n");if(MCU_To_ESP8266_Control("AT+CWSAP_DEF=\"CMCC-ESP8266\",\"123456789\",5,4" ,50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n");MCU_Tx_USART1_Data("ESP8266设置成AP模式\r\n");if(MCU_To_ESP8266_Control("AT+CWMODE=2",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置AP的IP地址\r\n");if(MCU_To_ESP8266_Control("AT+CIPAP=\"192.168.10.2\"" ,50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n");MCU_Tx_USART1_Data("WIFI名称: %s\r\n",ESP8266_SSID);MCU_Tx_USART1_Data("WIFI密码: %s\r\n",ESP8266_PASS);MCU_Tx_USART1_Data("WIFI IP地址: %s\r\n",ESP8266_IP);MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("关闭透传模式\r\n");if(MCU_To_ESP8266_Control("AT+CIPMODE=0",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置成多连接\r\n");if(MCU_To_ESP8266_Control("AT+CIPMUX=1",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置ESP8266的端口号\r\n");if(MCU_To_ESP8266_Control("AT+CIPSERVER=1,8080",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else{MCU_Tx_USART1_Data("端口号为: %s\r\n",duankouhao);MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n"); return 1;}
}/*-------------------------------------------------*/
/*函数名:获取连接状态                             */
/*参  数:无                                       */
/*返回值:连接状态                                 */
/*        0:无状态                                */
/*        1:有客户端接入                          */
/*        2:有客户端断开                          */
/*-------------------------------------------------*/
char WiFi_Get_LinkSta(void)
{char id_temp[10]={0};    //缓冲区,存放IDchar sta_temp[10]={0};   //缓冲区,存放状态if(strstr(MCU_Rx_ESP8266_BUF,"CONNECT")){                 //如果接受到CONNECT表示有客户端连接   sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,]",id_temp,sta_temp);MCU_Tx_USART1_Data("有客户端接入,ID=%s\r\n",id_temp);  //串口显示信息MCU_Rx_ESP8266_Count=0;                              //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);        //清空WiFi接收缓冲区     return 1;                                      //有客户端接入}else if(strstr(MCU_Rx_ESP8266_BUF,"CLOSED")){            //如果接受到CLOSED表示有链接断开 sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,]",id_temp,sta_temp);MCU_Tx_USART1_Data("有客户端断开,ID=%s\r\n",id_temp);        //串口显示信息MCU_Rx_ESP8266_Count=0;                                    //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);              //清空WiFi接收缓冲区     return 2;                                            //有客户端断开}else return 0;                                          //无状态改变
}
/*-------------------------------------------------*/
/*函数名:获取客户端数据                           */
/*        两组回车换行符\r\n\r\n作为数据的结束符   */
/*参  数:data:数据缓冲区                         */
/*参  数:len: 数据量                             */
/*参  数:id:  发来数据的客户端的连接ID           */
/*返回值:数据状态                                 */
/*        0:无数据                                */
/*        1:有数据                                */
/*-------------------------------------------------*/
char WiFi_Get_Data(char *data, char *len, char *id)
{char temp[10]={0};      //缓冲区char *presult;if(strstr(MCU_Rx_ESP8266_BUF,"+IPD")){      delay_ms(10);                                       //延时sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,],%[^:]",temp,id,len);//截取各段数据,主要是id和数据长度 presult = strstr(MCU_Rx_ESP8266_BUF,":");                  //查找冒号。冒号后的是数据if( presult != NULL )                               //找到冒号sprintf((char *)data,"%s",(presult+1));         //冒号后的数据,复制到dataMCU_Rx_ESP8266_Count=0;                                   //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);             //清空WiFi接收缓冲区    return 1;                                           //有数据到来} else return 0;                                        //无数据到来
}/*-------------------------------------------------*/
/*函数名:服务器发送数据                           */
/*参  数:databuff:数据缓冲区<2048                */
/*参  数:data_len:数据长度                       */
/*参  数:id:      客户端的连接ID                 */
/*参  数:timeout: 超时时间(10ms的倍数)         */
/*返回值:错误值                                   */
/*        0:无错误                                */
/*        1:等待发送数据超时                      */
/*        2:连接断开了                            */
/*        3:发送数据超时                          */
/*-------------------------------------------------*/
char WiFi_SendData(char id, char *databuff, int data_len, int timeout)
{    int i;MCU_Rx_ESP8266_Count=0;                                 //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);           //清空WiFi接收缓冲区 MCU_TO_ESP8266("AT+CIPSEND=%d,%d\r\n",id,data_len);  //发送指令   while(timeout--){                                 //等待超时与否  delay_ms(10);                                 //延时10msif(strstr(MCU_Rx_ESP8266_BUF,">"))                   //如果接收到>表示成功break;                                     //主动跳出while循环MCU_Tx_USART1_Data("%d ",timeout);                     //串口输出现在的超时时间}if(timeout<=0)return 1;                                   //超时错误,返回1else{                                                     //没超时,正确          MCU_Rx_ESP8266_Count=0;                                     //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);               //清空WiFi接收缓冲区  for(i=0;i<data_len;i++)MCU_TO_ESP8266("%c",databuff[i]); //发送数据 while(timeout--){                                     //等待超时与否  delay_ms(10);                                     //延时10msif(strstr(MCU_Rx_ESP8266_BUF,"SEND OK")){                //如果接受SEND OK,表示发送成功             MCU_Rx_ESP8266_Count=0;                                 //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);           //清空WiFi接收缓冲区             break;                                        //跳出while循环} if(strstr(MCU_Rx_ESP8266_BUF,"link is not valid")){      //如果接受link is not valid,表示连接断开         MCU_Rx_ESP8266_Count=0;                             //WiFi接收数据量变量清零                        memset(MCU_Rx_ESP8266_BUF,0,1024);       //清空WiFi接收缓冲区          return 2;                                     //返回2}}if(timeout<=0)return 3;      //超时错误,返回3else return 0;               //正确,返回0}
}
/*-------------------------------------------------*/
/*函数名:字符型数字转换成数字,0-9999             */
/*参  数:char_data:字符型数字                    */
/*参  数:len:      位数                          */
/*返回值:转换后的数字                             */
/*-------------------------------------------------*/
int Char_to_Hex(char *char_data, int len)
{int temp;switch(len){case 1 : temp=(char_data[0]-0x30)*1;break;case 2 : temp=(char_data[0]-0x30)*10;temp+=(char_data[1]-0x30)*1;break;case 3 : temp=(char_data[0]-0x30)*100;temp+=(char_data[2]-0x30)*10;temp+=(char_data[3]-0x30)*1;break;case 4 : temp=(char_data[0]-0x30)*1000;temp+=(char_data[1]-0x30)*100;temp+=(char_data[2]-0x30)*10;temp+=(char_data[3]-0x30)*1;break;}return temp;
}

esp8266.h

#ifndef __esp8266_H
#define __esp8266_H#include "stm32f10x.h"
#include "esp8266_usart2.h"      //包含需要的头文件
#include "esp8266_usart1.h"
#include "esp8266_delay.h"
#include "led.h"  #define ESP8266_IP   "192.168.10.2"
#define ESP8266_SSID "CMCC-EAP8266"
#define ESP8266_PASS "123456789"
#define duankouhao "8080"uint8_t ESP8266_RST(uint16_t timeout);
uint8_t MCU_To_ESP8266_Control(uint8_t *Cmd,uint16_t timeout);
uint8_t ESP8266_Cmd();char WiFi_Get_LinkSta(void);
char WiFi_Get_Data(char *data, char *len, char *id);
char WiFi_SendData(char id, char *databuff, int data_len, int timeout);
int Char_to_Hex(char *char_data, int len);#endif

esp8266_usart1.c

#include "esp8266_usart1.h"               unsigned int MCU_Rx_USART1_Count = 0;      //定义一个变量,记录串口1总共接收了多少字节的数据
char MCU_Rx_USART1_BUF[1024]; //定义一个数组,用于保存串口1接收到的数据
char MCU_Tx_USART1_BUF[1024];
unsigned int MCU_Tx_USART1_Count=0;/*-------------------------------------------------*/
/*函数名:初始化串口1发送功能                      */
/*参  数:bound:波特率                            */
/*返回值:无                                       */
/*-------------------------------------------------*/
void USART1_GPIO_Init()
{       GPIO_InitTypeDef GPIO_InitStructure;     //定义GPIO结构体USART_InitTypeDef USART_InitStructure;   //定义串口结构体NVIC_InitTypeDef NVIC_InitStructure;     //定义中断结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //使能串口1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              //准备设置PA9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO速率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出,用于串口1的发送GPIO_Init(GPIOA, &GPIO_InitStructure);                 //设置PA9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             //准备设置PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入,用于串口1的接收GPIO_Init(GPIOA, &GPIO_InitStructure);                 //设置PA10USART_InitStructure.USART_BaudRate = 115200;                                    //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;                    //8个数据位USART_InitStructure.USART_StopBits = USART_StopBits_1;                         //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No;                            //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                  //收发模式   USART_Init(USART1, &USART_InitStructure);              //初始化串口1 USART_ClearFlag(USART1, USART_FLAG_RXNE);               //清除接收标志位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);          //开启接收中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       //设置串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;      //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //中断通道使能NVIC_Init(&NVIC_InitStructure);                         //设置串口1中断 USART_Cmd(USART1, ENABLE);                              //使能(开启)串口1
}/*-------------------------------------------------*/
/*函数名:串口1 printf函数                         */
/*参  数:char* fmt,...  格式化输出字符串和参数    */
/*返回值:无                                       */
/*-------------------------------------------------*/void MCU_Tx_USART1_Data(char* fmt,...)
{  unsigned int i,length;va_list ap;                                            //定义一个指针变量va_start(ap,fmt);                         //把多个参数的起始参数的地址放入ap中,因为ap是指针vsprintf(MCU_Tx_USART1_BUF,fmt,ap);//把多个变参,放入MCU_Tx_USART1_BUF数组中va_end(ap);  length=strlen((const char*)MCU_Tx_USART1_BUF);//计算出MCU_Tx_USART1_BUF的长度        while((USART1->SR&0X40)==0);for(i = 0;i < length;i ++){          USART1->DR = MCU_Tx_USART1_BUF[i];//把数组MCU_Tx_USART1_BUF中的数据放入串口1的寄存器中,打印出来while((USART1->SR&0X40)==0); }
}void USART1_IRQHandler(void)
{                      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支if(USART1->DR){                                     //非零值才保存到缓冲区   MCU_Rx_USART1_BUF[MCU_Rx_USART1_Count]=USART1->DR;     //保存到缓冲区 MCU_Rx_USART1_Count ++;                            //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1 }       MCU_Tx_USART1_Data(MCU_Rx_USART1_BUF);}
} 

esp8266_usart1.h


#ifndef __esp8266_usart1_H
#define __esp8266_usart1_H#include "stm32f10x.h"
#include "stdio.h"      //包含需要的头文件
#include "stdarg.h"       //包含需要的头文件
#include "string.h"     //包含需要的头文件void MCU_Tx_USART1_Data(char* fmt,...) ;
void USART1_GPIO_Init(void);#endif

esp8266_usart2.c

#include "esp8266_usart2.h"           char MCU_Tx_ESP8266_BUF[1024];
char MCU_Rx_ESP8266_BUF[1024];
uint16_t    MCU_Rx_ESP8266_Count=0;/*-------------------------------------------------*/
/*函数名:初始化串口2发送功能                      */
/*参  数:bound:波特率                            */
/*返回值:无                                       */
/*-------------------------------------------------*/
void USART2_Init()
{       GPIO_InitTypeDef GPIO_InitStructure;     //定义一个设置GPIO功能的变量USART_InitTypeDef USART_InitStructure;   //定义一个设置串口功能的变量NVIC_InitTypeDef NVIC_InitStructure;     //如果使能接收功能,定义一个设置中断的变量RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //使能串口2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;              //准备设置PA2   TxGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO速率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出,用于串口2的发送GPIO_Init(GPIOA, &GPIO_InitStructure);                 //设置PA2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;              //准备设置PA3   RxGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入,用于串口2的接收GPIO_Init(GPIOA, &GPIO_InitStructure);                 //设置PA3USART_InitStructure.USART_BaudRate = 115200;                                    //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;                    //8个数据位USART_InitStructure.USART_StopBits = USART_StopBits_1;                         //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No;                            //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                //收发模式  USART_Init(USART2, &USART_InitStructure);                                      //设置串口2   USART_Cmd(USART2, ENABLE);                              //使能串口2USART_ClearFlag(USART2, USART_FLAG_RXNE);                //清除接收标志位USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);          //开启接收中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;       //设置串口2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;       //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //中断通道使能NVIC_Init(&NVIC_InitStructure);                         //设置串口2中断
}/*-------------------------------------------------*/
/*函数名:MCU向ESP8266发送数据                     */
/*函数作用:因为向ESP8266发送的是AT指令,                     */
/*                  所以把数据转换一下(也叫格式化)           */
/*参  数:不确定长度和类型的变量(变参)           */
/*返回值:无                                       */
/*-------------------------------------------------*/
void MCU_TO_ESP8266(char* fmt,...)
{  unsigned int i,length;va_list ap;va_start(ap,fmt);vsprintf(MCU_Tx_ESP8266_BUF,fmt,ap);va_end(ap);    length=strlen((const char*)MCU_Tx_ESP8266_BUF);        while((USART2->SR&0X40)==0);for(i = 0;i < length;i ++){          USART2->DR = MCU_Tx_ESP8266_BUF[i];while((USART2->SR&0X40)==0);    }
}/*-------------------------------------------------*/
/*函数名:串口2接收中断函数                        */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void USART2_IRQHandler(void)
{                      if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){  //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支if(USART2->DR){                                     //非零值才保存到缓冲区   MCU_Rx_ESP8266_BUF[MCU_Rx_ESP8266_Count]=USART2->DR;     //保存到缓冲区   MCU_Rx_ESP8266_Count ++;                            //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1 }      }
}

esp8266_usart2.h

#ifndef __esp8266_usart2_H
#define __esp8266_usart2_H#include "stm32f10x.h"
#include "stdio.h"      //包含需要的头文件
#include "stdarg.h"       //包含需要的头文件
#include "string.h"     //包含需要的头文件void USART2_Init();
void MCU_TO_ESP8266(char*,...) ;          #endif

esp8266_delay.c就是正常的延时函数

#include "esp8266_delay.h"/*** @brief  微秒级延时* @param  xus 延时时长,范围:0~233015* @retval 无*/
void delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;              //设置定时器重装值SysTick->VAL = 0x00;                  //清空当前计数值SysTick->CTRL = 0x00000005;                //设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000));   //等待计数到0SysTick->CTRL = 0x00000004;             //关闭定时器
}/*** @brief  毫秒级延时* @param  xms 延时时长,范围:0~4294967295* @retval 无*/
void delay_ms(uint32_t xms)
{while(xms--){delay_us(1000);}
}/*** @brief  秒级延时* @param  xs 延时时长,范围:0~4294967295* @retval 无*/
void delay_s(uint32_t xs)
{while(xs--){delay_ms(1000);}
} 

esp8266_delay.h

#ifndef __esp8266_delay_H
#define __esp8266_delay_H#include "stm32f10x.h" void delay_us(uint32_t us);
void delay_ms(uint32_t ms);
void delay_s(uint32_t s);#endif

led.c

#include "led.h"
#include "esp8266_delay.h"void led_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP ;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_SetBits (GPIOC,GPIO_Pin_All);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP ;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;GPIO_Init(GPIOG,&GPIO_InitStruct);GPIO_SetBits (GPIOG,GPIO_Pin_7);
}void led_shanshuo(void)
{GPIO_ResetBits(GPIOC,GPIO_Pin_0);delay_ms(100);GPIO_SetBits(GPIOC,GPIO_Pin_0);
}

led.h

#ifndef __led_init_H_
#define __led_init_H_#include "stm32f10x.h"                  // Device headervoid led_init(void);
void led_shanshuo(void);
#endif

物联网ESP8266配置成AP模式相关推荐

  1. ESP8266的sta+ap模式

    printf ( "\r\nwaiting-\r\n" ); SYSTICK_NmsDelay(2000); //延时2s,让模块自动连接WiFi ESP8266_Cmd ( &q ...

  2. 3、ESP8266入门(AT模式)——手机与ESP8266通信(AP模式)

    实现手机与ESP8266最简单通信.关于指令参考安信可官方指令.https://wiki.ai-thinker.com/esp8266/docs#at 在AT指令处下载即可,还有一个是使用实例,也可以 ...

  3. zynq配置成jtag模式_Zynq-7000 MiZ701 SOC硬件使用手册

    一.整体概述 此板卡是由南京米联电子设计团队设计的一款高性能SOC开发板.采用了美国XILINX公司开发的XC7Z020CLG484作为CPU,硬件设计方案参考了安富利公司的Zedboard,最大程度 ...

  4. zynq配置成jtag模式_zynq 7Z010的启动模式配置

    启动模式 ZYNQ 7000启动模式由MIO[5-2]来决定,选择JTAG启动时,MIO[5-3]必须都是0,而MIO2,决定了JTAG 的Cacade和 Independent模式 我们先说明如何启 ...

  5. kali虚拟机配置成桥接模式

    1.设置网络类型 将虚拟机设置中的网络适配器设置为桥接模式 2.查看本机网络状态 使用ipconfig查看本机的内网IP地址.子网掩码以及默认网关 3.手动配置kali网络配置 vim /etc/ne ...

  6. 中兴光纤猫F420如何配置成桥接模式

    背景: 1:家里两个高清机顶盒,一个光纤宽带(20M/1M) 2:光纤猫(电信提供的设备,类似路由器)一共四个网口,有两个网口LAN1和LAN2用来连接IPTV,还有一个网口LAN4用来上网 3:网口 ...

  7. esp8266 接收udp广播_【零知ESP8266教程】AP模式下WIFI UDP协议通信示例

    [mw_shl_code=cpp,true]/********************************************************** *    文件: udp-serve ...

  8. notepad++ 配置成VIM模式

    1st 先上效果图 2st 配置文件  :xxx@xx$  vi  stylers.xml 放到  C:\Users\Administrator\AppData\Roaming\Notepad++\s ...

  9. ESP8266 AP模式建立服务器

    功能:ESP8266配置为AP模式,作为TCP Server与电脑客户端进行通信 1.串口助手向模块依次发送如下指令,建立服务器: 注:端口号和模块IP在客户端进行连接时需要使用 串口助手发生指令,需 ...

最新文章

  1. luogu P3393 逃离僵尸岛(点权最短路 + 多源BFS)
  2. Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误...
  3. Linux安装jellyfin硬件加速,proxmoxVE LXC 安装设置 Jellyfin 多媒体家庭影院
  4. 安卓四大组件之Service
  5. 终于也为自己开了技术博客
  6. Java学习小程序(9)冒泡排序算法实现
  7. phpcms9-6-0 一键getshell工具
  8. Linux初学:(二)Shell环境与命令基础
  9. WPF Image Source 设置相对路径图片
  10. 中国太阳能窗户市场趋势报告、技术动态创新及市场预测
  11. python博客主题_博客园SimpleMemary主题美化教程
  12. 软件测试方法和技术知识点有哪些?
  13. 学习日记(三)利用Arduino读取加速度传感器信号并采用NRF24L01无线传输
  14. 南京 学计算机的学校,南京小学生暑假学计算机编程去哪家学校好
  15. 输入大小写混合的字母,大写转小写,小写转大写
  16. Python使用RMF聚类分析客户价值
  17. DataGrip 禁用自动同步
  18. RSI的交易系统以及用rsi指标进行探势
  19. 【高并发专题】-高并发下前后端常用解决方案总结(全套)
  20. 7-10 计算多门课的平均绩点

热门文章

  1. c语言判断一个素数能被几个9整除,判断一个素数能被几个9整除
  2. 半导体可饱和吸收体(SA)
  3. Apple公司联系邮箱收录
  4. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年5月份最新版)
  5. 德语键盘在标准ASCII键盘上使用的小窍门/ 德语键盘英语输入法输出波浪线~
  6. 2021年茶艺师(高级)考试内容及茶艺师(高级)考试资料
  7. DSM_Solver软件使用说明
  8. 【Android】 炫酷霓虹灯
  9. LAMP(一)_介绍
  10. i386, x86, x86_64, IA-32, IA-64, 安腾, AMD64 的关系是什么?