XCOSnTh平台的获取如下
static void (*ESP8266USARTSend)(unsigned char ch)=0;
static int (*ESP8266POP)(void)=0;
static void (*ESP8266RxByte)(int(*printf)(const char* format, ...),unsigned char byte)=0;
static void XCESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化:适配接口..............................................................................
ESP8266USARTSend=ShellRegisterFormFind("ESP8266","USARTSend");
ESP8266POP=ShellRegisterFormFind("ESP8266","Pop");
ESP8266RxByte=ShellRegisterFormFind("ESP8266","RxByte");
}
AutoCall_InitDef(0,XCESP8266Init,XCESP8266InitExe,"");
接口头文件
#ifndef __BSP_ESP8266_H
#define __BSP_ESP8266_H
#include "at32f435_437.h"
/******************************** ESP8266 连接引脚定义 ***********************************/
#define macESP8266_RST_CLK CRM_GPIOA_PERIPH_CLOCK
#define macESP8266_RST_PORT GPIOA
#define macESP8266_RST_PIN GPIO_PINS_5
#define macESP8266_USART_BAUD_RATE 115200
#define macESP8266_TX_PIN_MUX_NUM GPIO_MUX_8
#define macESP8266_RX_PIN_MUX_NUM GPIO_MUX_8
#define macESP8266_TX_PIN_SOURCE GPIO_PINS_SOURCE9
#define macESP8266_RX_PIN_SOURCE GPIO_PINS_SOURCE8
#define macESP8266_USARTx UART5
#define macESP8266_USART_CLK CRM_UART5_PERIPH_CLOCK
#define macESP8266_USART_GPIO_CLK CRM_GPIOB_PERIPH_CLOCK
#define macESP8266_USART_TX_PORT GPIOB
#define macESP8266_USART_TX_PIN GPIO_PINS_9
#define macESP8266_USART_RX_PORT GPIOB
#define macESP8266_USART_RX_PIN GPIO_PINS_8
#define macESP8266_USART_IRQ UART5_IRQn
#define macESP8266_USART_INT_FUN UART5_IRQHandler
#endif
接口的实现
#include "esp8266serial.h"
static void ESP8266_GPIO_Config ( void )
{//连接esp8266的io配置
gpio_init_type gpio_init_struct;
/* 配置 RST 引脚*/
crm_periph_clock_enable(macESP8266_RST_CLK, TRUE);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_pins = macESP8266_RST_PIN;
gpio_init(macESP8266_RST_PORT, &gpio_init_struct);
}
static void ESP8266_USART_Config ( void )
{//esp8266的串口配置
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(macESP8266_USART_CLK, TRUE);
crm_periph_clock_enable(macESP8266_USART_GPIO_CLK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_pin_mux_config(macESP8266_USART_TX_PORT, macESP8266_TX_PIN_SOURCE, macESP8266_TX_PIN_MUX_NUM);
gpio_pin_mux_config(macESP8266_USART_RX_PORT, macESP8266_RX_PIN_SOURCE, macESP8266_RX_PIN_MUX_NUM);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = macESP8266_USART_TX_PIN;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(macESP8266_USART_TX_PORT, &gpio_init_struct);
gpio_init_struct.gpio_pins = macESP8266_USART_RX_PIN;
gpio_init(macESP8266_USART_RX_PORT, &gpio_init_struct);
usart_init(macESP8266_USARTx, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_parity_selection_config(macESP8266_USARTx,USART_PARITY_NONE);
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(macESP8266_USART_IRQ, 0,0);
usart_transmitter_enable(macESP8266_USARTx, TRUE);
usart_receiver_enable(macESP8266_USARTx, TRUE);
usart_interrupt_enable(macESP8266_USARTx,USART_RDBF_INT, TRUE);//使能接收中断
//usart_interrupt_enable(macESP8266_USARTx,USART_IDLE_INT, TRUE);//使能接收空闲中断
usart_enable(macESP8266_USARTx, TRUE);
}
#include"XCOSnTh.h"
static void ESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化
ESP8266_GPIO_Config ();
ESP8266_USART_Config ();
gpio_bits_set ( macESP8266_RST_PORT, macESP8266_RST_PIN );
}
AutoCall_InitDef(0,ESP8266Init,ESP8266InitExe,"");
XCDefinieFIFO(esp8266,1024);
void macESP8266_USART_INT_FUN ( void )
{ //串口接收中断
uint8_t uc;
if(usart_flag_get(macESP8266_USARTx, USART_RDBF_FLAG) != RESET)
{
uc = usart_data_receive( macESP8266_USARTx );
esp8266_push(uc);//将接收的数据放入到队列中
}
if ( usart_flag_get(macESP8266_USARTx, USART_IDLEF_FLAG) == SET )
{
uc = usart_data_receive( macESP8266_USARTx );
esp8266_push(uc);//将接收的数据放入到队列中
}
}
static int ESP8266pop()
{
return esp8266_pop();
}
RegisterItemDef(ESP8266, Pop, "ESP8266串口接收", ESP8266pop);//【必须实现】
static void ESP8266Send(unsigned char ch)
{
usart_data_transmit(macESP8266_USARTx,ch);
while( usart_flag_get(macESP8266_USARTx, USART_TDBE_FLAG) == RESET );//等待发送完成
}
RegisterItemDef(ESP8266, USARTSend, "ESP8266串口发送", ESP8266Send);//【必须实现】
static void ESP8266RxByte(int(*printf)(const char* format, ...),unsigned char byte)
{//捕捉透传数据:无需存入FIFO这个函数不是在中断中被调用的,可直接处理数据
//数据分析
//开关灯、设置PWM等程序
printf("%c",byte);
}
RegisterItemDef(ESP8266, RxByte, "ESP8266t透传接收的数据", ESP8266RxByte);//【必须实现】
头文件
#ifndef ESP8266_H
#define ESP8266_H
/*ESP8266发送数据/发送透传数据*/
extern void ESP8266Transmit(int(*printf)(const char* format, ...),char *str);
/*退出透传模式*/
extern int ESP8266Exit(int(*printf)(const char* format, ...),int t);
/*模块复位*/
extern int AT_RST(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*扫描wifi*/
extern int AT_CWLAP(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);//扫描当前可用的wifi
/*连接wifi*/
extern int AT_CWJAP_Connect(int(*printf)(const char* format, ...),char *wifiName/*名字*/,char *pwd/*密码*/,char **result,unsigned int nop_timeout);
/*查询wifi的连接状态*/
extern int AT_CWJAP_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*查看当前的IP地址*/
extern int AT_CIFSR(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*查看模块的当前的工作模式:AP,station,AP+station*/
extern int AT_CWMODE_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*设置模块的工作模式:AP,station,AP+station*/
extern int AT_CWMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*mode=1多路连接模式 mode=0单路连接模式*/
extern int AT_CIPMUX(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*创建服务器*/
extern int AT_CIPSERVER(int(*printf)(const char* format, ...),int mode,unsigned short port,char **result,unsigned int nop_timeout);
/*查看当前的连接状态,如果有tcp连接就会展示出来*/
extern int AT_CIPSTATUS(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*连接服务器*/
extern int AT_CIPSTART(int(*printf)(const char* format, ...),char *tcpudp/*连接类型*/,char *ip/*服务器的ip*/,unsigned short port/*服务器的端口*/,char **result,unsigned int nop_timeout);
/*设置传输模式:1透传模式,0普通模式*/
extern int AT_CIPMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*发送数据/进入透传模式*/
extern int AT_CIPSEND(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*完整的流程之连接服务器*/
extern void ESP8266connect(int(*printf)(const char* format, ...),char *wifiname,char *pwd,char *tcpudpType,char *serverIP,unsigned short servsrPort);
/*完整的流程之进入透传模式*/
extern void ESP8266EntryTransmit(int(*printf)(const char* format, ...));
#endif
ESP8266程序
#include "esp8266.h"
#include "stdlib.h"
#include "stdio.h"
#include"XCOSnTh.h"
static char ESP8266Buff[1024];
static int ESP8266RxCount=0;
static char ESP8266CMD[1024];
static char ESP8266RxFlag=0;
/*
//手机开热点(此时wifi和网络可正常使用),模块自动连接手机的热点,然后与模块通信
重要说明:模块与服务器建立连接以后,工作在透传模式,如果网络不稳定,会自动连接,以保持连接状态
与模块相关的命令
AT+GMR:查看模块的固件版本信息
AT+RST:重启模块
AT+RESTORE:恢复出厂设置
AT+CWMODE?:查询当前工作模式
AT+CWMODE:设置模块的工作模式
与wifi连接相关的命令
AT+CWLAP:扫描可用的wifi(扫描当前可用的 AP)
AT+CWQAP:断开与wifi的连接(断开与 AP 的连接)
AT+CWJAP:链接wifi(连接 AP)
AT+CWJAP?:查看模块与wifi的连接情况
AT+CIFSR: 查询本地IP地址
AT_CWMODE?:查看模块的工作模式
AT+CWMODE:设置模块的工作模式:AP,station,AP+station
与tcp相关的命令
AT+CIPMUX:mode=1多路连接模式 mode=0单路连接模式-【注:在做服务器的时候,需要使用多路连接】
AT+CIPSERVER:创建服务器
AT+CIPSTATUS:查看当前的连接状态,如果有tcp连接就会展示出来
AT+CIPSTART:连接服务器
AT+CIPMODE:进入透传模式 AT+CIPMODE=0表示普通模式,AT+CIPMODE=1表示透传模式
AT+CIPSEND:发送数据
======================================================================================================
1.station模式:连接其他热点
AT+CWMODE=1
AT+RST //重启生效配置
AT+CWLAP //查询当前WIFI
AT+CWJAP="WIFI名","WIFI密码"//连接WIFI
AT+CIFSR //查询IP
AT+CIPMUX=1 //建立多连接
AT+CIPSERVER=1,8080 //建立服务号为8080
2.AP模式:自身创建热点
AT+CWMODE=2
AT+RST //重启生效配置
AT+CWSAP_DEF="名字","密码",5,4 //配置WIFI名和密码
AT+CIFSR //查询IP
AT+CIPMUX=1 //建立多连接
AT+CIPSERVER=1,8080 //建立服务号为8080
3.AP+station模式
AT+CWMODE=3
AT+RST //重启生效配置
AT+CWLAP //查询当前WIFI
AT+CWJAP="WIFI名","WIFI密码"//连接WIFI
AT+CIFSR //查询IP
AT+CIPMUX=1 //建立多连接
AT+CIPSERVER=1,8080 //建立服务号为8080
*/
static void (*ESP8266USARTSend)(unsigned char ch)=0;
static int (*ESP8266POP)(void)=0;
static void (*ESP8266RxByte)(int(*printf)(const char* format, ...),unsigned char byte)=0;
static void XCESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化:适配接口..............................................................................
ESP8266USARTSend=ShellRegisterFormFind("ESP8266","USARTSend");
ESP8266POP=ShellRegisterFormFind("ESP8266","Pop");
ESP8266RxByte=ShellRegisterFormFind("ESP8266","RxByte");
}
AutoCall_InitDef(0,XCESP8266Init,XCESP8266InitExe,"");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
static void ESP8266RxReset()
{
ESP8266RxCount=0;
}
static char* ESP8266RxProcess(int (*pop)(void),int(*printf)(const char* format, ...))
{
int value=0;
static char d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0;
if(pop)
{
value=pop();
if(value>=0)
{
if(ESP8266RxCount<sizeof(ESP8266Buff))
{
ESP8266Buff[ESP8266RxCount++]=value;
}
d1=d2;d2=d3;d3=d4;d4=d5;d5=d6;d6=d7;d7=d8;d8=d9;d9=value;
if((d4=='\r')&&
(d5=='\n')&&
(d6=='O')&&
(d7=='K')&&
(d8=='\r')&&
(d9=='\n')
)/*一条json里面不能有换行*/
{
if(ESP8266RxCount<sizeof(ESP8266Buff))
{
ESP8266Buff[ESP8266RxCount++]=0;
}
ESP8266RxCount=0;
if(printf)printf("\r\n【XC:OK】\r\n");
return ESP8266Buff;
}
else if((d1=='\r')&&
(d2=='\n')&&
(d3=='E')&&
(d4=='R')&&
(d5=='R')&&
(d6=='O')&&
(d7=='R')&&
(d8=='\r')&&
(d9=='\n')
)
{
if(printf)printf("\r\n【XC:ERROR】\r\n");
if(ESP8266RxCount<sizeof(ESP8266Buff))
{
ESP8266Buff[ESP8266RxCount++]=0;
}
if(printf)printf("\r\n%s",ESP8266Buff);
ESP8266RxCount=0;
return(char*)0xFFFFFFFF;
}
}
}
return 0;
}
static void ESP8266SendCMD(char *cmd,void (*usartSend)(unsigned char ch))
{
while(*cmd)
{
if(usartSend)
{
usartSend(*cmd++);
}
}
}
void ESP8266Transmit(int(*printf)(const char* format, ...),char *str)
{
if(ESP8266USARTSend)
{
ESP8266SendCMD(str,ESP8266USARTSend);
printf("\r\n");
}
else
{
printf("\r\n接口未实现");
}
}
static void ESP8266Exe(AutoCallObj obj,void *cThis)
{//自动轮询:调试代码..............................................................................
#if(1)
#if(0)
if(ESP8266POP)
{
int value=ESP8266POP();
if(value>=0)
{
obj->printf("%c",value);
{//debug调试看实际收到的数据
static int i=0;
if(i<sizeof(ESP8266Buff))
{
ESP8266Buff[i++]=value;
}
}
}
}
#else
if(ESP8266POP)
{
if(ESP8266RxFlag==0)
{//命令模式的接收数据处理
char *result=0;
result=ESP8266RxProcess(ESP8266POP,obj->printf);
if((result!=0)&&(result!=(char*)0xFFFFFFFF))
{
obj->printf("%s",result);
}
}
else
{//透传接收的数据处理
int value=ESP8266POP();
if(value>=0)
{
if(ESP8266RxByte)
{
ESP8266RxByte(obj->printf,value);
}
}
}
}
#endif
#endif
}
AutoCall_WhileDef(0,esp8266exe,ESP8266Exe,"");
static int CmdProcess_esp8266(CmdObj obj, char* str, int len)
{//调试代码
int i=0;
str[len++]='\r';
str[len++]='\n';
str[len]=0;;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266Transmit(obj->printf,str);
return 1;
}
CmdDef(esp,0,CmdProcess_esp8266,"");
static int CmdProcess_esp8266s(CmdObj obj, char* str, int len)
{//调试代码
int i=0;
str[len]=0;;
ESP8266Transmit(obj->printf,str);
return 1;
}
CmdDef(esps,0,CmdProcess_esp8266s,"");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
int ESP8266Exit(int(*printf)(const char* format, ...),int t)
{//退出透传模式
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
ESP8266SendCMD("+++",ESP8266USARTSend);//发送命令
while(t--){__nop();__nop();};
unsigned int nop_timeout=10000000;
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+GMR\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
printf("\r\n....");
return 0;
}
else
{//退出透传成功
ESP8266RxFlag=0;
printf("\r\nok exit");
return 1;
}
}
}
else
{
return -2;//接口未实现
}
}
static int CmdProcess_esp_exit(CmdObj obj, char* str, int len)
{
if(ESP8266Exit(obj->printf,10000000)==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_exit,0,CmdProcess_esp_exit,"<退出透传>");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
int AT_RST(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//模块复位
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+RST\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}
else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_rst(CmdObj obj, char* str, int len)
{
char *p=0;
int temp=AT_RST(obj->printf,&p,10000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_rst,0,CmdProcess_esp_rst,"模块复位");
int AT_CWLAP(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)//扫描当前可用的wifi
{//扫描wifi
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CWLAP\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}
else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwlap(CmdObj obj, char* str, int len)
{
char *p=0;
int temp=AT_CWLAP(obj->printf,&p,10000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_wifiscan,0,CmdProcess_esp_cwlap,"扫描周围的WIFI");
int AT_CWJAP_Connect(int(*printf)(const char* format, ...),char *wifiName/*名字*/,char *pwd/*密码*/,char **result,unsigned int nop_timeout)
{//连接wifi
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
sprintf(ESP8266CMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",wifiName,pwd);
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwjap_c(CmdObj obj, char* str, int len)
{
int temp;
char *p=0,*p1=str,*p2;
int i=0;
str[len]=0;
for(i=0;i<len;i++)
{
if(str[i]==' ')
{
str[i]=0;
p2=&str[i+1];
break;
}
}
//temp=AT_CWJAP_Connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx",&p,100000000);
temp=AT_CWJAP_Connect(obj->printf,p1,p2,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_wificonnect,0,CmdProcess_esp_cwjap_c,"连接WIFI");
int AT_CWJAP_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前wifi连接的状态
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CWJAP?\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwjap_q(CmdObj obj, char* str, int len)
{
char *p=0;
int temp;
temp=AT_CWJAP_Query(obj->printf,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_wifistate,0,CmdProcess_esp_cwjap_q,"查看当前wifi状态");
int AT_CIFSR(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前的ip地址和mac值
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CIFSR\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cifsr(CmdObj obj, char* str, int len)
{
char *p=0;
int temp=AT_CIFSR(obj->printf,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_ip,0,CmdProcess_esp_cifsr,"查看当前IP");
int AT_CWMODE_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看模块的当前工作模式
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CWMODE?\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwmode_q(CmdObj obj, char* str, int len)
{
char *p=0;
int temp=AT_CWMODE_Query(obj->printf,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_mode_q,0,CmdProcess_esp_cwmode_q,"查看模块的工作模式");
int AT_CWMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//设置模块的工作模式:AP,station,AP+station
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
sprintf(ESP8266CMD,"AT+CWMODE=%d\r\n",mode);
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwmode(CmdObj obj, char* str, int len)
{
char *p=0;
int mode;
int temp;
str[len]=0;
mode=atoi(str);
temp=AT_CWMODE(obj->printf,mode,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_mode,0,CmdProcess_esp_cwmode,"设置模块的工作模式ap,station,ap+station");
int AT_CIPMUX(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//mode=1多路连接模式 mode=0单路连接模式
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
sprintf(ESP8266CMD,"AT+CIPMUX=%d\r\n",mode);
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipmux(CmdObj obj, char* str, int len)
{
char *p=0;
int mode;
int temp;
str[len]=0;
mode=atoi(str);
temp=AT_CIPMUX(obj->printf,mode,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_mux,0,CmdProcess_esp_cipmux,"设置单路或多路连接");
int AT_CIPSERVER(int(*printf)(const char* format, ...),int mode,unsigned short port,char **result,unsigned int nop_timeout)
{//创建服务器
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
if(port!=0)
{
sprintf(ESP8266CMD,"AT+CIPSERVER=%d,%d\r\n",mode,port);
}
else
{
sprintf(ESP8266CMD,"AT+CIPSERVER=%d\r\n",mode);
}
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipserver(CmdObj obj, char* str, int len)
{
char *p=0,*p1=str,*p2;
int i=0;
int temp;
str[len]=0;
for(i=0;i<len;i++)
{
if(str[i]==' ')
{
str[i]=0;
p2=&str[i+1];
break;
}
}
temp=AT_CIPSERVER(obj->printf,atoi(p1),atoi(p2),&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_server,0,CmdProcess_esp_cipserver,"创建服务器");
int AT_CIPSTATUS(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前的连接状态,如果有tcp连接就会展示出来
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CIPSTATUS\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipstatus(CmdObj obj, char* str, int len)
{
char *p=0;
int temp;
temp=AT_CIPSTATUS(obj->printf,&p,10000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_netstate,0,CmdProcess_esp_cipstatus,"查看当前的连接状态");
int AT_CIPSTART(int(*printf)(const char* format, ...),char *tcpudp/*连接类型*/,char *ip/*服务器的ip*/,unsigned short port/*服务器的端口*/,char **result,unsigned int nop_timeout)
{//连接服务器
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
sprintf(ESP8266CMD,"AT+CIPSTART=\"%s\",\"%s\",%d\r\n",tcpudp,ip,port);
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_cipstart(CmdObj obj, char* str, int len)
{
char *p=0,*p1=str,*p2,*p3=0;
int i=0,j=0;
int temp;
str[len]=0;
for(i=0;i<len;i++)
{
if(str[i]==' ')
{
str[i]=0;
if(j==0)
{
j=1;
p2=&str[i+1];
}
else if(j==1)
{
j=2;
p3=&str[i+1];
}
}
}
//temp=AT_CWJAP_Connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx",&p,100000000);
temp=AT_CIPSTART(obj->printf,p1,p2,atoi(p3),&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_netconnect,0,CmdProcess_cipstart,"连接服务器");
int AT_CIPMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//设置传输模式:1透传模式,0普通模式
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
sprintf(ESP8266CMD,"AT+CIPMODE=%d\r\n",mode);
ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipmode(CmdObj obj, char* str, int len)
{
char *p=0;
int mode;
int temp;
str[len]=0;
mode=atoi(str);
temp=AT_CIPMODE(obj->printf,mode,&p,100000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_netmode,0,CmdProcess_esp_cipmode,"设置传输模式,0为普通模式,1为透传模式");
int AT_CIPSEND(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//发送数据
if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
{
char *temp=0;
ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
ESP8266SendCMD("AT+CIPSEND\r\n",ESP8266USARTSend);//发送命令
while(1)
{
temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
if(temp==0)
{//接收中
nop_timeout--;
if(nop_timeout==0)
{
printf("\r\ntime out nop");
return -1;//超时
}
}//暂未收到返回
else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
{//接收到error
return 0;
}
else
{//接收到ok
ESP8266RxFlag=1;
*result=temp;
return 1;
}
}
}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipsend(CmdObj obj, char* str, int len)
{
char *p=0;
int temp=AT_CIPSEND(obj->printf,&p,10000000);
if(temp==1)
{
obj->printf("\r\n%s",p);
}
else if(temp==-2)
{
obj->printf("\r\n接口未实现");
}
return 1;
}
CmdDef(esp_send,0,CmdProcess_esp_cipsend,"发送数据");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
void ESP8266connect(int(*printf)(const char* format, ...),char *wifiname,char *pwd,char *tcpudpType,char *serverIP,unsigned short servsrPort)
{//完整的流程之连接服务器
char *result=0;
int temp;
ESP8266Exit(printf,10000000);//退出透传模式
{//复位
while(1)
{
temp=AT_RST(printf,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n退出透传模式成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//连接wifi
while(1)
{
temp=AT_CWJAP_Connect(printf,wifiname,pwd,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\nwifi连接成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//设置模块看的工作 模式为1:station
while(1)
{
temp=AT_CWMODE(printf,1,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n设置工作模式成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//设置多路复用:单路
while(1)
{
temp=AT_CIPMUX(printf,0,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n设置单路成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//连接服务器
while(1)
{
temp=AT_CIPSTART(printf,tcpudpType,serverIP,servsrPort,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n连接服务器成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//设置传输模式为透传模式
while(1)
{
temp=AT_CIPMODE(printf,1,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n设置透传成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//进入透传模式
while(1)
{
temp=AT_CIPSEND(printf,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n已经进入透传模式");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
}
static int CmdProcess_esp_connect(CmdObj obj, char* str, int len)
{
ESP8266connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx","TCP","192.168.1.8",777);
return 1;
}
CmdDef(espconnect,0,CmdProcess_esp_connect,"连接服务器");
void ESP8266EntryTransmit(int(*printf)(const char* format, ...))
{//完整的流程之进入透传模式
int temp;
char *result=0;
{//设置传输模式为透传模式
while(1)
{
temp=AT_CIPMODE(printf,1,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n设置透传成功");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
{//进入透传模式
while(1)
{
temp=AT_CIPSEND(printf,&result,10000000);
if(temp==-1)
{//超时
continue;//继续连接wifi
}
else if(temp==0)
{//收到ERROR:需要检查程序
}
else if(temp==1)
{//收到OK
printf("\r\n已经进入透传模式");
break;
}
else if(temp==-2)
{
printf("\r\n接口未实现");
break;
}
else{/*没有这种情况*/}
}
}
}
static int CmdProcess_esp_entryTransmit(CmdObj obj, char* str, int len)
{
ESP8266EntryTransmit(obj->printf);
return 1;
}
CmdDef(espet,0,CmdProcess_esp_entryTransmit,"espet是esp entry Transmit缩写");
标签:return,ESP8266,temp,int,else,char,printf
From: https://blog.csdn.net/stars_A_B_C/article/details/145226054