ESP8266的AT指令模块程序

 

最新代码可点击下载ESP8266 模块代码

和以下代码实现方式不一致,更加自由可控


本段代码只是测试了esp8266作为服务器端使用,没有测试作为客户端使用。

没有超长延时等待或死循环等待AT指令反馈,具体可参考以下介绍。

 

代码如下:

/*------------------------------------------------------------------------------------------------------------------*/
/**
  * @file       esp8266.c
  * @author     大橙子疯 
  * @version    V1.12
  * @date       22-August-2018
  * @brief      该文件提供了ESP8266设备操作功能 
  * @note   
  * V1.00 
  *             1、有配置esp8266函数AP 兼 Station 模式函数
  *             2、具有发送AT指令函数的函数(内部为主循环等待反馈)
  *             3、具有喂狗函数(将当前平台的喂狗函数放入该函数内)
  *             4、具有字符串比较函数
  *
  * V1.10 (重新组织架构)
  *             1、增加ESP8266的时基1ms处理函数ESP_ATBaseTimeHandle(),不再是死循环或延时等待反馈。
  *             2、必须周期性调用ESP_ATBaseTimeHandle()函数,否则该文件所有AT指令函数无法正常工作!!!
  *             3、增加ESP8266串口占用状态检测函数ESP_CheckEspSerialStatus()。
  *             4、增加ESP8266作为服务器所连接的检测所有ID状态的函数ESP_CheckEspIdStatus()。
  *             5、增加ESP8266的部分AT指令函数(设置、获取、发送),可自由配置。
  *             6、建议AT指令函数调用周期不大于1s(AT反馈成功后的1s后会强行释放串口资源),否则容易造成串口资源占用时间过长。
  *             7、增加ESP8266的串口接收分析函数。
  *             8、优化AP 兼 Station 模式初始化函数(正常初始化时间大约320ms,异常情况最长为1s)。
  *             9、移除看门狗喂狗函数,整个文件中的函数执行时间不会超过2ms。
  *             10、移除字符串比较函数,使用string.h库的部分函数。
  *             11、降低函数文件的耦合性,增强可移植性。
  *             12、其它优化(具体AT指令注意事项请参考ESP8266 AT指令集资料)。
  *
  * V1.11
  *             1、优化增强客服端的id状态的检测方式,新增"link is not valid"检测。
  *             2、优化ESP8266获取、设置和发送函数,增加"正在处理"返回值。
  *             3、其它函数命名和变量优化。
  *
  * V1.12
  *             1、解决了数据正在发送的过程中此时接收的字符串中含有">"字符导致接收错乱的现象。
  *             2、解决了发送数据时发送的AT指令超时或出错后没有返回失败结果的现象。
  */
/*------------------------------------------------------------------------------------------------------------------*/ 
#include "esp8266.h"
#include "usart.h"
#include "string.h"

/** @addtogroup Project_Hardware
  * @{
  */

/** @defgroup ESP8266
  * @brief ESP8266 driver modules
  * @{
  */ 
 
/** @defgroup ESP8266_Private_Defines
  * @{
  */
 
#define ESP_BUFFER_NUM                 20              /* 发送和接收缓存区buffer的数目 */
#define ESP_TXD_OR_RXD_LENTH           150             /* 串口临时接收发送缓存区字符串长度 */

/* ESP8266的WIFI的名称和密码设置 */
static const char ESP_WIFI_SSID[] = {"ESP8266测试"};
static const char ESP_WIFI_PWD[] = {"12345678"};
/**
  * @}
  */
  
/** @defgroup ESP8266_Private_TypesDefinitions
  * @{
  */

/** 
  * @brief  ESP8266的响应状态
  */
typedef enum
{
    ESP_RESPONSE_WAIT = 0,                            /*<! (0)等待 */    
    ESP_RESPONSE_OK,                                  /*<! (1)成功/想要的响应结果 */     
    ESP_RESPONSE_ERROR,                               /*<! (2)错误/失败 */
    ESP_RESPONSE_BUSY,                                /*<! (3)忙碌 */
}ESP_RESPONSE;

/** 
  * @brief  ESP8266占用串口的状态,及执行过程
  */
typedef enum
{
    ESP_PROCESS_WAIT = 0,                              /*<! (0)等待 */ 
    ESP_PROCESS_AT_CMD,                                /*<! (1)发送AT指令 */ 
    ESP_PROCESS_SEND_DATA,                             /*<! (2)发送数据(只有发送数据时才有效) */ 
    ESP_PROCESS_END,                                   /*<! (3)结束 */ 
}ESP_PROCESS;

/** 
  * @brief  ESP8266的AT指令
  */
typedef enum
{
    ESP_CMD_NOTHING = 0,                               /*<! (0)无指令 */ 
    ESP_CMD_RST,                                       /*<! (1)复位指令 */ 
    ESP_CMD_TEST,                                      /*<! (2)测试指令 */ 
    ESP_CMD_GMR,                                       /*<! (3)查看版本信息 */ 
    ESP_CMD_E0,                                        /*<! (4)关闭回显 */ 
    ESP_CMD_SET_MODE,                                  /*<! (5)设置应用模式 */ 
    ESP_CMD_SET_CONNECT,                               /*<! (6)设置多连接 */ 
    ESP_CMD_SET_PORT,                                  /*<! (7)设置端口 */ 
    ESP_CMD_SET_VOERTIME,                              /*<! (8)设置超时等待时间 */ 
    ESP_CMD_SET_PASS,                                  /*<! (9)设置透传 */ 
    ESP_CMD_SET_BAUDRATE,                              /*<! (10)设置波特率 */ 
    ESP_CMD_SET_SSID,                                  /*<! (11)设置SSID参数 */ 
    ESP_CMD_SEND_DATA,                                 /*<! (12)发送数据 */ 
    ESP_CMD_CLOSE_NET,                                 /*<! (13)关闭网络 */
    ESP_CMD_GET_SSID,                                  /*<! (14)获取SSID参数 */
}ESP_CMD;

/** 
  * @brief  ESP8266的串口占用信息
  */
typedef struct
{
    ESP_PROCESS m_espProcess;                          /*<! 目前进度 */ 
    ESP_CMD m_cmd;                                     /*<! 目前的AT指令 */ 
}ESP_SERINFO;

/** 
  * @brief  ESP8266的AT指令操作信息
  */
typedef struct
{
    char *m_strCmd;                                  /*<! AT指令 */ 
    uint16_t m_txLen;                                /*<! AT指令发送的字符串长度 */ 
    uint8_t m_rxLen;                                 /*<! AT指令接收响应的一包字符串长度,必须小于ESP_RXD_LENTH(建议 > 50);
                                                         该值除非是AT获取信息指令,否则建议为50,具体原因该数据分析在中断处理,
                                                         一包数据过长导致分析时间变长,串口容易丢失数据 */ 
    char *m_strResponse;                             /*<! AT指令想要的响应结果 */     
    uint16_t m_overTime;                             /*<! AT指令操作响应等待时间 */ 
    ESP_FUCRES m_res;                                /*<! AT指令判定结果 */
}ESP_ATCMDINFO;
/**
  * @}
  */

/** @defgroup ESP8266_Private_Macros
  * @{
  */

/**
  * @}
  */
 
/** @defgroup ESP8266_Private_Variables
  * @{
  */
  
/* ESP8266的AT指令信息 */
static ESP_ATCMDINFO sg_tEspATCmd;          // ESP8266的AT指令操作信息
static ESP_SERINFO sg_tSerialStatus;        // ESP8266的AT串口占用信息

/** 
  * @brief  数据缓存信息
  */ 
static ESP_NETINFO sg_stTxNetMsg;                               // 数据发送接收缓存
static ESP_NETINFO sg_stRxNetMsg;
static uint8_t sg_bRxNetMsgEnd = 0;                             // 网络数据接收完成标志位

/* 用来AT指令获取ESP8266相关信息的指针和变量 */
static volatile char *sg_pGetEspInfoAddress;                     // AT指令获取信息的地址指针
static volatile uint16_t sg_getEspInfoLenth;                     // AT指令获取信息的长度

/* AT获取指令使能位/标志位 */
static uint8_t sg_bATGetInfoEnable = 0;

/* ESP8266响应状态 */
static ESP_RESPONSE  sg_emEspResponse = ESP_RESPONSE_WAIT;

/* ESP8266作为服务器连接客服端的id状态:0位代表ID0,1位代表ID1,...4位代表ID4*/
static uint8_t sg_espLinkIdStatus = 0x00;
/**
  * @}
  */

/** @defgroup ESP8266_Private_FunctionPrototypes
  * @{
  */
static void DealyMs(uint16_t time);
static uint16_t MyPower(uint16_t num, uint16_t n);
static ESP_FUCRES SendATCmdAndWaitResponse(const char *c_data, uint16_t len, uint16_t overTime);
static uint8_t AnalysisRxIdConStatus(const char *c_data, uint8_t id);
static void AnalysisResponseAndConnect(const char *c_data);
static uint8_t AnalysisRxNetMsg(char newData, char lastData[10]);

/**
  * @}
  */
  

/** @defgroup ESP8266_Private_Functions
  * @{
  */
  
/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   简单的延时函数
  * @param   time - 延时时间(单位:大约1ms)
  * @return  无
  */
/*-----------------------------------------------------------------------------------------------*/ 
static void DealyMs(uint16_t time)
{
    uint16_t i,j;
    
    for(i = 0; i < time ; i++)
         for(j = 0; j < 3000 ; j++);
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   检测ESP8266占用串口的状态
  * @param   无
  * @return  0,空闲;1,忙碌
  */
/*-----------------------------------------------------------------------------------------------*/
uint8_t ESP_CheckEspSerialStatus(void)
{
    return (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT ? 0 : 1);
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   检测ESP8266所有ID的连接状态(0:断开; 1:连接)
  * @param   id: id检测的ID号
  * @return  0:断开; 1:在线
  */
/*-----------------------------------------------------------------------------------------------*/
uint8_t ESP_CheckEspIdStatus(uint8_t id)
{
    if(id == 0 && (sg_espLinkIdStatus & 0x01) == 0x01) return 1;
    if(id == 1 && (sg_espLinkIdStatus & 0x02) == 0x02) return 1;
    if(id == 2 && (sg_espLinkIdStatus & 0x04) == 0x04) return 1;
    if(id == 3 && (sg_espLinkIdStatus & 0x08) == 0x08) return 1;
    if(id == 4 && (sg_espLinkIdStatus & 0x10) == 0x10) return 1;
    
    return 0;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266初始化(目前配置成AP 兼 Station 模式)
  * @param   无
  * @return  0,成功;1,失败
  * @note    初始化时间正常情况大约320ms(其中复位时间大约290ms),异常情况大约1s
  */
/*-----------------------------------------------------------------------------------------------*/
uint8_t ESP_APOrStationInit(void)
{
    while(1)
    {
        if (ESP_AtRst() == ESP_FAIL) return 1;
        if (ESP_AtCloseEcho() == ESP_FAIL) return 1;
        if (ESP_AtTest() == ESP_FAIL) return 1;
        if (ESP_ATSetMode(3) == ESP_FAIL) return 1;
        if (ESP_ATSetConnect(1) == ESP_FAIL) return 1;
        if (ESP_ATSetPort(1, 80) == ESP_FAIL) return 1;
        if (ESP_ATSetOverTime(180) == ESP_FAIL) return 1;
        if (ESP_ATSetApParameter(ESP_WIFI_SSID, ESP_WIFI_PWD, ESP_AP_WPA_WPA2_PSK) == ESP_FAIL) return 1;
        if (ESP_CheckEspSerialStatus() == 0) break;
        ESP_ATBaseTimeHandle();
        DealyMs(1);
    }
    return 0;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   以下函数和标准库函数作用一致,但由于部分原因无法正常使用库函数或效果无法实现
  */
/*-----------------------------------------------------------------------------------------------*/
/* 参考原型: 标准库函数pow();不同:返回值和入参类型不一致 */
static uint16_t MyPower(uint16_t num, uint16_t n)
{
    uint16_t ret = 1;
    
    while(n--) ret *= num; 
    
    return ret;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266发送AT指令
  * @param   data - 发送的数据
  * @param   len  - 数据的长度
  * @param   data - 设置等待超时时间(单位:1ms)
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
static ESP_FUCRES SendATCmdAndWaitResponse(const char *c_data,uint16_t len,uint16_t overTime)
{
    ESP_FUCRES res = ESP_WAIT;
    static uint8_t send_sta = 0;
    static uint16_t s_cTime = 0;
    
    s_cTime++;
    
    switch (send_sta)
    {
        case 0:
            sg_emEspResponse = ESP_RESPONSE_WAIT;
            USART_SendData((uint8_t *)c_data, len);
            s_cTime = 0;
            send_sta++;
            break;
        case 1:
            if (sg_emEspResponse == ESP_RESPONSE_OK || sg_emEspResponse == ESP_RESPONSE_ERROR ||
                       s_cTime > overTime)
            {
                send_sta = 0;
                s_cTime = 0;
                res = ( sg_emEspResponse == ESP_RESPONSE_OK ? ESP_SUCCESS : ESP_FAIL );
                sg_emEspResponse = ESP_RESPONSE_WAIT;
            }
            break;
        default:
             send_sta = 0;
             s_cTime = 0;
            break;
    }
    
    return res;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266时基处理函数
  * @param   无
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  * @note    周期:1ms
  *          - 若使用该文件的AT指令操作函数,必须周期性调用该函数
  */
/*-----------------------------------------------------------------------------------------------*/
void ESP_ATBaseTimeHandle(void)
{
    ESP_FUCRES f_res;
    static uint16_t s_timeCount = 0;
    
    switch (sg_tSerialStatus.m_espProcess)
    {
        //等待
        case ESP_PROCESS_WAIT:
        
            break;
        
        //发送AT指令
        case ESP_PROCESS_AT_CMD:
            f_res = SendATCmdAndWaitResponse(sg_tEspATCmd.m_strCmd, sg_tEspATCmd.m_txLen, sg_tEspATCmd.m_overTime);
            
            if (f_res != ESP_WAIT)
            {
                if ( sg_tSerialStatus.m_cmd == ESP_CMD_SEND_DATA )
                {
                    if (f_res == ESP_SUCCESS)
                    {
                        sg_tEspATCmd.m_strResponse = "SEND OK";
                        sg_tEspATCmd.m_overTime = 500;
                        sg_tSerialStatus.m_espProcess = ESP_PROCESS_SEND_DATA;
                    }
                    else
                    {
                        sg_tEspATCmd.m_res = ESP_FAIL;
                        sg_tSerialStatus.m_espProcess = ESP_PROCESS_END;
                    }
                }
                else
                {
                    /* 在"case ESP_PROCESS_END:"之前给出结果,是因为AT指令函数中如果m_espProcess = ESP_PROCESS_END,则会使
                       m_espProcess = ESP_PROCESS_WAIT,从而导致该函数下次进入时不会跳入"case ESP_PROCESS_END:" */
                    sg_tEspATCmd.m_res = f_res;
                    sg_tSerialStatus.m_espProcess = ESP_PROCESS_END;
                }
            }
            break;
        
        //发送网络信息
        case ESP_PROCESS_SEND_DATA:
            f_res = SendATCmdAndWaitResponse(sg_stTxNetMsg.m_data, sg_stTxNetMsg.m_len, sg_tEspATCmd.m_overTime);
            
            if (f_res != ESP_WAIT) 
            {
                /* 在"case ESP_PROCESS_END:"之前给出结果,是因为AT指令函数中如果m_espProcess = ESP_PROCESS_END,则会使
                   m_espProcess = ESP_PROCESS_WAIT,从而导致该函数下次进入时不会跳入"case ESP_PROCESS_END:" */
                sg_tEspATCmd.m_res = f_res;    
                sg_tSerialStatus.m_espProcess = ESP_PROCESS_END;
            }
            
            break;
        case ESP_PROCESS_END:
        
             /* 什么也不干,只作为一个缓冲,等待AT指令函数进行m_espProcess = ESP_PROCESS_END判断,
                但加一个超时等待,若一定时间内AT指令函数没有释放串口资源,则强行释放 */
            s_timeCount++;
            
            if (s_timeCount > 1000)         //1s
            {
                s_timeCount = 0;
                sg_bATGetInfoEnable = 0;
                sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
                sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            }
            break;
        default:
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            break;
    }
    
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266的AT测试指令
  * @param   无
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_AtTest(void)
{
    static char ESP8266_AT_TEST[4] = {"AT\r\n"}; 
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        sg_tEspATCmd.m_strCmd = ESP8266_AT_TEST;
        sg_tEspATCmd.m_txLen = 4;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_TEST;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_TEST)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
}

 /*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266关闭回显
  * @param   无
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_AtCloseEcho(void)
{
    static char  ESP8266_AT_E0[ 6 ] = {"ATE0\r\n"};                                  /* 关闭回显  */ 
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        sg_tEspATCmd.m_strCmd = ESP8266_AT_E0;
        sg_tEspATCmd.m_txLen = 6;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_E0;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_E0)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266的AT复位指令
  * @param   无
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_AtRst(void)
{
    static char ESP8266_AT_RST[ 10 ] = {"AT+RST\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        sg_tEspATCmd.m_strCmd = ESP8266_AT_RST;
        sg_tEspATCmd.m_txLen = 8;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 500;
        sg_tEspATCmd.m_strResponse = "ready";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_RST;
        sg_tSerialStatus.m_espProcess =  ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_RST)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置 WIFI 应用模式
  * @param   mode - 1,Station 模式; 2,AP模式; 3,AP兼Station 模式
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetMode(uint8_t mode)
{
    static char ESP8266_AT_SetMode[ 13 ] = {"AT+CWMODE=3\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_SetMode[10] = mode + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SetMode;
        sg_tEspATCmd.m_txLen = 13;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_MODE;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_SET_MODE)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置连接模式
  * @param   mode - 0,单路连接; 1,多路连接
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  * @note    
  *          - 只有当连接都断开后才能更改,如果开启过 server 需要重启模块
  *          - 如果已经处于连接状态则,响应结果返回Link is builded
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetConnect(uint8_t mode)
{
    static char ESP8266_AT_SetConnect[ 13 ] = {"AT+CIPMUX=1\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_SetConnect[10] = mode + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SetConnect;
        sg_tEspATCmd.m_txLen = 13;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_CONNECT;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_SET_CONNECT)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置端口
  * @param   mode - 0,关闭 server 模式; 1,开启 server 模式
  * @param   port - 端口号(缺省值为 333)
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  * @note    
  *          - 端口号一般设置80
  *          - 开启 server 后自动建立 server 监听
  *          - 当有 client 接入会自动按顺序占用一个连接, AT+ CIPMUX=1 时才能开启服务器
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetPort(uint8_t mode, uint8_t port)
{
    static char ESP8266_AT_SetPort[ 20 ] = {"AT+CIPSERVER=1,080\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_SetPort[13] = mode + '0';
        ESP8266_AT_SetPort[15] = port / 100 + '0';
        ESP8266_AT_SetPort[16] = port % 100 / 10 + '0';
        ESP8266_AT_SetPort[17] = port % 100 % 10 + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SetPort;
        sg_tEspATCmd.m_txLen = 20;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_PORT;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_SET_PORT)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置服务器超时时间
  * @param   time - 时间(单位: 1s) time取值范围 0~28800
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待 
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetOverTime(uint16_t time)
{
    static char ESP8266_AT_SetOverTime[ 15 ] = {"AT+CIPSTO=180\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_SetOverTime[10] = (uint8_t)(time / 100 + '0');
        ESP8266_AT_SetOverTime[11] = (uint8_t)(time % 100 / 10 + '0');
        ESP8266_AT_SetOverTime[12] = (uint8_t)(time % 100 % 10 + '0');
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SetOverTime;
        sg_tEspATCmd.m_txLen = 15;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_VOERTIME;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if(sg_tSerialStatus.m_cmd == ESP_CMD_SET_VOERTIME)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置波特率
  * @param   rate - 波特率(常用:9600、115200、460800)
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetBaudRate(uint32_t rate)
{
    static char ESP8266_AT_SetBaudRate[ 25 ] = {"AT+UART=0115200,8,1,0,0\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_SetBaudRate[8] = (uint8_t)(rate / 1000000) + '0';
        ESP8266_AT_SetBaudRate[9] = (uint8_t)(rate % 1000000 / 100000) + '0';
        ESP8266_AT_SetBaudRate[10] = (uint8_t)(rate % 1000000 % 100000 / 10000) + '0';
        ESP8266_AT_SetBaudRate[11] = (uint8_t)(rate % 1000000 % 100000 % 10000 / 1000) + '0';
        ESP8266_AT_SetBaudRate[12] = (uint8_t)(rate % 1000000 % 100000 % 10000 % 1000 / 100) + '0';
        ESP8266_AT_SetBaudRate[13] = (uint8_t)(rate % 1000000 % 100000 % 10000 % 1000 % 100 / 10) + '0';
        ESP8266_AT_SetBaudRate[14] = (uint8_t)(rate % 1000000 % 100000 % 10000 % 1000 % 100 % 10) + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SetBaudRate;
        sg_tEspATCmd.m_txLen = 25;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_BAUDRATE;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_SET_BAUDRATE)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266设置 AP 模式下的参数
  * @param   ssid - 字符串参数,接入点名称
  * @param   pwd - 字符串参数,密码最长 64 字节 ASCII.
  * @param   ecn - 加密类型: ESP_AP_OPEN / ESP_AP_WPA_PSK / ESP_AP_WPA2_PSK / ESP_AP_WPA_WPA2_PSK
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待
  * @note    
  *          - 指令只有在 AP 模式开启后有效
  *          - 通道修改后需要+RST 重启模块(因此非特殊情况不作为输入参数设置)
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATSetApParameter(const char *c_ssid, const char *c_pwd, const char *c_ecn)
{
    static char ESP8266_AT_SetSSID[ 99 ] = {"AT+CWSAP=\"ESP8266\",\"12345678\",1,4\r\n"}; 
    char *p = ESP8266_AT_SetSSID;
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        memset(&ESP8266_AT_SetSSID[10], 0, 80);
        p = strcat(ESP8266_AT_SetSSID,c_ssid);
        p = strcat(ESP8266_AT_SetSSID,"\",\"");
        p = strcat(ESP8266_AT_SetSSID,c_pwd);
        p = strcat(ESP8266_AT_SetSSID,"\",");
        p = strcat(ESP8266_AT_SetSSID,"1");            //通道号
        p = strcat(ESP8266_AT_SetSSID,",");
        p = strcat(ESP8266_AT_SetSSID,c_ecn); 
        p = strcat(ESP8266_AT_SetSSID,"\r\n\0");    
        sg_tEspATCmd.m_strCmd = p;
        sg_tEspATCmd.m_txLen = (uint16_t)strlen(sg_tEspATCmd.m_strCmd);
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 1500;            //设置新的SSID响应时间较长,大约1s
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_SET_SSID;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_SET_SSID)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266断开网络
  * @param   id - 需要关闭的连接 id < 0 - 4 >
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待 
  * @note    当 id=5 时关闭所有连接(开启 server 后 id=5 无效)
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATCloseNet(uint8_t id)
{
    static char ESP8266_AT_CloseNet[ 15 ] = {"AT+CIPCLOSE=0\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        ESP8266_AT_CloseNet[12] = id + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_CloseNet;
        sg_tEspATCmd.m_txLen = 15;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_CLOSE_NET;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_CLOSE_NET)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266发送数据
  * @param   *c_tEspMsgAddr - 指向ESP_NETINFO结构体指针
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待 
  * @note    收到此命令后先换行返回”>”
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_SendNetMsg(const ESP_NETINFO *c_tEspMsgAddr)
{
    ESP_NETINFO *pEspTxNetDataInfo = &sg_stTxNetMsg;
    static char ESP8266_AT_SendData[ 19 ] = {"AT+CIPSEND=1,0008\r\n"};

    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT && sg_espLinkIdStatus != 0)
    {
        ESP8266_AT_SendData[11] = c_tEspMsgAddr->m_id + '0';

        ESP8266_AT_SendData[13] = (uint8_t)(c_tEspMsgAddr->m_len / 1000) + '0';
        ESP8266_AT_SendData[14] = (uint8_t)(c_tEspMsgAddr->m_len % 1000 / 100) + '0';
        ESP8266_AT_SendData[15] = (uint8_t)(c_tEspMsgAddr->m_len % 1000 % 100 / 10) + '0';
        ESP8266_AT_SendData[16] = (uint8_t)(c_tEspMsgAddr->m_len % 1000 % 100 % 10) + '0';
        sg_tEspATCmd.m_strCmd = ESP8266_AT_SendData;
        sg_tEspATCmd.m_txLen = 19;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 100;
        sg_tEspATCmd.m_strResponse = ">"; 
        *pEspTxNetDataInfo = *c_tEspMsgAddr;     
        sg_tEspATCmd.m_res = ESP_WAIT;    
        sg_tSerialStatus.m_cmd = ESP_CMD_SEND_DATA;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
        return ESP_DOING;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_SEND_DATA)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT;
} 

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   ESP8266获取自身WIFI的SSID参数
  * @param   *rxBuf - 待接收SSID参数信息的缓存区地址
  * @param   rxNum - 设置缓存区的长度
  * @return  ESP_SUCCESS,成功;ESP_FAIL,失败;ESP_WAIT,等待 
  */
/*-----------------------------------------------------------------------------------------------*/
ESP_FUCRES ESP_ATGetApParameter(char * const rxBuf, uint16_t rxNum)
{
    static char s_getSSID[ 11] = {"AT+CWSAP?\r\n"};
    
    if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_WAIT)
    {
        sg_bATGetInfoEnable = 1; 
        sg_getEspInfoLenth = rxNum;
        sg_pGetEspInfoAddress = rxBuf;
        sg_tEspATCmd.m_strCmd = s_getSSID;
        sg_tEspATCmd.m_txLen = 11;
        sg_tEspATCmd.m_rxLen = 50;
        sg_tEspATCmd.m_overTime = 1000;
        sg_tEspATCmd.m_strResponse = "OK";
        sg_tEspATCmd.m_res = ESP_WAIT;
        sg_tSerialStatus.m_cmd = ESP_CMD_GET_SSID;
        sg_tSerialStatus.m_espProcess = ESP_PROCESS_AT_CMD;
    }
    else if (sg_tSerialStatus.m_cmd == ESP_CMD_GET_SSID)
    {
        if (sg_tSerialStatus.m_espProcess == ESP_PROCESS_END)
        {
            sg_tSerialStatus.m_cmd = ESP_CMD_NOTHING;
            sg_tSerialStatus.m_espProcess = ESP_PROCESS_WAIT;
            return sg_tEspATCmd.m_res;
        }
        
        return ESP_DOING;
    }
    
    return ESP_WAIT; 
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief      ESP8266接收到的网络数据
  * @param      *espMsgAddr - 待取出数据即将存放的地址
  * @return     0,没有新数据; 1,有新的数据 
  */
/*-----------------------------------------------------------------------------------------------*/
uint8_t ESP_ReceiveNetMsg(ESP_NETINFO *tEspMsgAddr)
{
    ESP_NETINFO *pAddr = &sg_stRxNetMsg;

    if (sg_bRxNetMsgEnd == 1)
    {
        sg_bRxNetMsgEnd = 0;
        *tEspMsgAddr = *pAddr;
        return 1;
    }

    return 0;    
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   分析串口传回来的ID连接状态
  * @param   * c_data - 串口接收的一包完整的数据
  * @param   * id - 之前所有 id 号的状态 
  * @return  新的所有 id 号的状态 
  */
/*-----------------------------------------------------------------------------------------------*/
static uint8_t AnalysisRxIdConStatus(const char *c_data, uint8_t id)
{
    uint8_t i = 0;
    uint8_t num;
    uint8_t conId = id;
    
    /* 对 CONNECT/ CLOSED/ link is not valid 进行分析 */
    while(1)
    {
        if (c_data[i] == ',' && c_data[i + 1] == 'C' && c_data[i + 2] == 'O' && c_data[i + 3] == 'N')
        {
            num = c_data[i-1] - '0';
            conId |= (uint8_t)(1 << num);
            break;
        }
        else if (c_data[i] == ',' && c_data[i + 1] == 'C' && c_data[i + 2] == 'L' && c_data[i + 3] == 'O')
        {
            num = c_data[i-1] - '0';
            conId &= (uint8_t)~(1 << num);
            break;
        }
        else if (c_data[i] == 'l' && c_data[i + 1] == 'i' && c_data[i + 2] == 'n' && c_data[i + 3] == 'k')
        {
            num = sg_stTxNetMsg.m_id;        // 获取此时发送函数正在使用的id号
            conId &= (uint8_t)~(1 << num);
            break;        
        }
        i++;
    }
    
    return conId;
}

/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   分析响应结果和连接状态
  * @param   data - 串口接收的一帧数据(以接收到 "\r\n" 或 ">" 作为1帧)
  * @return  AT响应状态 和 客户端连接状态
  * @note    由于使用标准库函数strstr()会对入参地址数据进行改变,因此本函数入参不适用const修饰
  */
/*-----------------------------------------------------------------------------------------------*/
static void AnalysisResponseAndConnect(const char *c_data)
{  
    if (strstr(c_data,",CONNECT") != 0 || strstr(c_data,",CLOSED") != 0 || strstr(c_data,"link is not valid") != 0)
    {     
        sg_espLinkIdStatus = AnalysisRxIdConStatus(c_data, sg_espLinkIdStatus);
    }
    
    if (strstr(c_data, sg_tEspATCmd.m_strResponse) != 0)
    {   
        sg_emEspResponse = ESP_RESPONSE_OK;
    }
    else if (strstr(c_data,"ERROR") != 0)
    {
        sg_emEspResponse = ESP_RESPONSE_ERROR;
    }
    else if (strstr(c_data,"busy s...") != 0)
    {
        sg_emEspResponse = ESP_RESPONSE_BUSY;
    } 
}


/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   接收和分析串口传回来的网络信息("+IPD,<id>,<len>:<data>")
  * @param   newData - 串口中断接收的新数据
  * @param   lastData - 串口中断接收的前10个数据
  * @return  网络数据的id + 长度 + 数据
  * @return  函数返回值:0,等待;1,接收完成
  */
/*-----------------------------------------------------------------------------------------------*/
static uint8_t AnalysisRxNetMsg(char newData, char lastData[10])
{
    uint8_t i = 9;
    static uint8_t s_getDataFlag = 0;
    static uint16_t s_tmpLen = 0;
    
    /* 对 +IPD,<id>,<len>:<data> 进行分析 */
    if(s_getDataFlag == 0)
    {
        if(newData == ',' && lastData[9] != 'D')
        {
            sg_stRxNetMsg.m_id = lastData[9] - '0';
        }
        else if (newData == ':')
        {
            s_tmpLen = 0;
            sg_stRxNetMsg.m_len = 0;
            memset(sg_stRxNetMsg.m_data, 0, ESP_DATA_MAX_LENTH);
            
            /* 由于接收的网络数据长度不会超过2048,则长度字符串所占的最大字节为4个 */
            while(lastData[i] != ',' && i > 0)
            {
                /* 由于使用标准库pow()函数造成结果为double型的,导致 s_tmpLen == 0不成立,
                   即使强制转换依然无法解决问题,因此使用自编写的无符号整数型MyPower函数 */
                s_tmpLen = (lastData[i] - '0') * MyPower(10,(9 - i)) + s_tmpLen;
                i--;
            }
            //增加限制条件,防止溢出
            s_tmpLen > ESP_DATA_MAX_LENTH ? s_tmpLen = ESP_DATA_MAX_LENTH : 0;
            
            s_getDataFlag = 1;
        }
    }
    else if(s_getDataFlag == 1)
    {
        sg_stRxNetMsg.m_data[sg_stRxNetMsg.m_len++] = newData;
        
        s_tmpLen > 0 && s_tmpLen < 2048 ? (s_tmpLen--) : (s_tmpLen = 0);
        
        if (s_tmpLen == 0)
        {
            s_getDataFlag = 0; 
            sg_bRxNetMsgEnd = 1;
            return 1;
        }    
    }
    
    return 0;
}
/*-----------------------------------------------------------------------------------------------*/
/**
  * @brief   分析串口传回来的单个数据
  * @param   data - 串口接收的数据
  * @return  无
  * @note    - 该函数在串口每接收到一个数据后调用.
  */
/*-----------------------------------------------------------------------------------------------*/
void ESP_UsartDataHandle(char data)
{
    uint8_t i;  
    static uint8_t s_netDataFlag = 0;
    static char s_lastData[10] = {0};
    static uint16_t  s_tmpEspRxCount = 0;
    static char s_tmpEspRxData[ ESP_TXD_OR_RXD_LENTH ];

    s_tmpEspRxData[ s_tmpEspRxCount++ ] = data;
    
    /* 用来保存AT指令获取的一些信息 */
    if(sg_bATGetInfoEnable == 1 &&  sg_getEspInfoLenth > 0 )
    {
        *sg_pGetEspInfoAddress++ = data;
        sg_getEspInfoLenth--;
    }
    
    //防止溢出
    if(s_tmpEspRxCount >= ESP_TXD_OR_RXD_LENTH)
    {
        s_tmpEspRxCount = 0;
    }
    
    //如果是网络数据
    if (s_netDataFlag == 1)
    {
        if(AnalysisRxNetMsg(data, s_lastData) == 1)
        {
            s_netDataFlag = 0;
        }
    }
    
    /* 当连续接收到两个回车换行符时,表示一包数据没有接收完成 或 
       在AT指令数据发送阶段且没有收到网络数据时时才对'>'单个字符进行判断(发送数据时收到的'>'没有回车换行符号) */
    if ((s_lastData[7] != 0x0D && s_lastData[8] != 0x0A && s_lastData[9] == 0x0D && data == 0x0A ) ||
        (sg_tSerialStatus.m_cmd == ESP_CMD_SEND_DATA && s_netDataFlag == 0 && data == '>'))
    {
        s_tmpEspRxCount = 0;
        s_netDataFlag = 0;
        AnalysisResponseAndConnect(s_tmpEspRxData);
        memset(s_tmpEspRxData, 0, sg_tEspATCmd.m_rxLen);
    }
    else if (s_netDataFlag == 0 & s_lastData[7] == '+' && s_lastData[8] == 'I' && s_lastData[9] == 'P' && data == 'D')
    {
        /* 收到的网络数据结束后由于没有回车换行符号,则对"+IPD"字符串进行判断 */
        s_tmpEspRxCount = 0;
        s_netDataFlag = 1;
    }
    
    for(i = 0; i < 9; i++)
        s_lastData[i] = s_lastData[i + 1];
    s_lastData[9] = data;
}


/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */




 /*------------------------------------------------------------------------------------------------------------------*/
/**
  * @file       esp8266.h
  * @author     大橙子疯 
  * @version    V1.12
  * @date       22-August-2018
  * @brief      该文件包含了ESP8266设备操作功能的原型 
  */
/*------------------------------------------------------------------------------------------------------------------*/ 

#ifndef ESP8266_H
#define ESP8266_H

#include "stdint.h"

/** @addtogroup Project_Hardware
  * @{
  */
 
/** @addtogroup ESP8266
  * @{
  */

/** @defgroup ESP8266_Exported_Constants
  * @{
  */


#define ESP_DATA_MAX_LENTH             30               /* ESP8266的最大网络数据长度 */

/** 
  * @brief  ESP8266的AP加密类型
  */
#define ESP_AP_OPEN                   "0"
#define ESP_AP_WPA_PSK                "1"
#define ESP_AP_WPA2_PSK               "2"
#define ESP_AP_WPA_WPA2_PSK           "3"

/**
  * @}
  */

/** @defgroup ESP8266_Exported_Types
  * @{
  */

/** 
  * @brief  ESP8266的网络数据信息
  */
typedef struct
{
    uint8_t m_id;                                       /*<! ESP8266的 id 号 */ 
    uint16_t m_len;                                     /*<! ESP8266的数据长度 */ 
    char m_data[ ESP_DATA_MAX_LENTH ];                  /*<! ESP8266的数据 */ 
}ESP_NETINFO;

/** 
  * @brief  ESP8266的函数返回值
  */
typedef enum
{
    ESP_WAIT = 0,                                       /*<! (0)等待 */ 
    ESP_SUCCESS,                                        /*<! (1)成功 */ 
    ESP_FAIL,                                           /*<! (2)失败 */ 
    ESP_DOING,                                          /*<! (3)正在处理 */ 
}ESP_FUCRES;

/**
  * @}
  */
  
/** @defgroup ESP8266_Exported_Macros
  * @{
  */

/**
  * @}
  */
  
/** @defgroup Esp8266_Exported_Functions
  * @{
  */
  
void ESP_ATBaseTimeHandle(void);
uint8_t ESP_APOrStationInit(void);
uint8_t ESP_CheckEspIdStatus(uint8_t id);
uint8_t ESP_CheckEspSerialStatus(void);
ESP_FUCRES ESP_AtTest(void);
ESP_FUCRES ESP_AtRst(void);
ESP_FUCRES ESP_AtCloseEcho(void);
ESP_FUCRES ESP_ATSetMode(uint8_t mode);
ESP_FUCRES ESP_ATSetConnect(uint8_t mode);
ESP_FUCRES ESP_ATSetPort(uint8_t mode, uint8_t port);
ESP_FUCRES ESP_ATSetOverTime(uint16_t time);
ESP_FUCRES ESP_ATSetApParameter(const char *c_ssid, const char *c_pwd, const char *c_ecn);
ESP_FUCRES ESP_ATSetBaudRate(uint32_t rate);
ESP_FUCRES ESP_ATCloseNet(uint8_t id);
ESP_FUCRES ESP_ATGetApParameter(char * const rxBuf, uint16_t rxNum);
ESP_FUCRES ESP_SendNetMsg(const ESP_NETINFO *c_tEspMsgAddr);
uint8_t ESP_ReceiveNetMsg(ESP_NETINFO *tEspMsgAddr);
void ESP_UsartDataHandle(char data);

/**
  * @}
  */
  
/**
  * @}
  */

/**
  * @}
  */
 
  
#endif

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大橙子疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值