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
本文来自博客园,作者:大橙子疯,转载请注明原文链接:https://www.cnblogs.com/const-zpc/p/16364446.html