ESP8266配置UDP数据传输
在万物互联的时代,各家互联网公司都大力推广物联网平台,WIFI作为连接平台的其中一种枢纽,ESP8266就是其中的一个典型代表。ESP8266模块内置TCP/IP协议栈,采用串口AT指令集操作方式,操作简单。
ESP8266工作模式有AP、STA、AP+STA共存模式;通信方式支持TCP和UDP两种方式。
ESP8266模式:STA+UDP
STA+UDP模式配置指令集
"AT\r\n",//测试指令
"AT+RST\r\n",
"ATE0\r\n",
"AT+CWMODE=1\r\n",//STA模式
"AT+CWJAP=\"360WIFI_123\",\"12345678\"\r\n",//连接WIFI
"AT+CIFSR\r\n",//查询IP
"AT+CIPSTART=\"UDP\",\"172.20.7.2\",10500,8080,0\r\n",//建立UDP
"AT+CIPMODE=1\r\n",//设置透传模式
"AT+CIPSEND\r\n",//发送数据
STA+UDP模式配置函数设计
/*******************************************************************************************************************
**形参: wifi_name --WIFI名
** password --密码
** remote_ip --远端IP地址(255.255.255.255为广播地址)
** remote_prot --远端端口号
** localhost ---本地端口号
**返回值:0 --成功,
** 其它值 --失败
**示例:ESP8266_UDP_STA_Mode("360WIFI_123","12345678","172.20.7.2",10500,8080);
*********************************************************************************************************************/
u8 ESP8266_UDP_STA_Mode(u8 *wifi_name,u8 *password,u8 *remote_ip,u16 remote_prot,u16 localprot)
{
char buff[100];
u8 i=0;
for(i=0;i<5;i++)
{
USARTx_SendStr(USART3,(u8 *)"+++"); //退出透传模式
Delay_Ms(1000);
printf("1.测试指令.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT\r\n",(u8 *)"OK")==0)break;
}
if(i==5)return 1;
printf("2.重启模块.......\r\n");
USARTx_SendStr(USART3,(u8 *)"AT+RST\r\n");
Delay_Ms(1000);
Delay_Ms(1000);
printf("3.关回显.......\r\n");
if(ESP8266_SendCmd((u8 *)"ATE0\r\n",(u8 *)"OK"))return 2;
printf("4.设置为STA模式.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CWMODE=1\r\n",(u8 *)"OK"))return 3;
printf("6.连接WIFI.......\r\n");
snprintf(buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",wifi_name,password);
if(ESP8266_SendCmd((u8 *)buff,(u8 *)"OK"))return 5;
printf("7.查询IP.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIFSR\r\n",(u8 *)"OK"))return 6;
ESP8266_GetData((char *)usart3_rx_buff,esp8266_info.ipaddr,"STAIP");
printf("8.建立UDP连接.....\r\n");
snprintf(buff,sizeof(buff),"AT+CIPSTART=\"UDP\",\"%s\",%d,%d,0\r\n",remote_ip,remote_prot,localprot);
if(ESP8266_SendCmd((u8 *)buff,(u8 *)"OK"))return 7;
printf("9.设置透传.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIPMODE=1\r\n",(u8 *)"OK"))return 8;
printf("10.发送数据.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIPSEND\r\n",(u8 *)">"))return 9;
esp8266_info.port=localprot;
return 0;
}
发送AT指令函数设计
/*******************************发送指令函数*************************
**
**参数说明:u8 *cmd -- 要发送的指令
** u8 *data --要检查的的字符串
**返回值:0 --发送成功
** 1 --发送失败
**示例:ESP8266_SendCmd("AT\r\n","OK");
***********************************************************************/
u8 ESP8266_SendCmd(u8 *cmd,u8 *data)
{
int i=0,j=0;
for(i=0;i<ESP8266_COUNT;i++)
{
usart3_rx_flag=0;//清除接收标志
usart3_rx_cnt=0;//清除数组下标
USARTx_SendStr(USART3,cmd);//发送命令
//开启接数据
for(j=0;j<5000;j++)
{
if(usart3_rx_flag)
{
usart3_rx_buff[usart3_rx_cnt]='\0';//字符结束符
// printf("rx:%s", usart3_rx_buff);
if(strstr((char *)usart3_rx_buff,(char *)data))
{
usart3_rx_flag=0;//清除接收标志
usart3_rx_cnt=0;//清除数组下标
return 0;
}
else
{
memset(usart3_rx_buff,0,sizeof(usart3_rx_buff));//清空缓冲区
usart3_rx_flag=0;//清除接收标志
usart3_rx_cnt=0;//清除数组下标
}
}
Delay_Ms(1);
}
}
return 1;//发送指令失败
}
主函数
int main()
{
u8 key;
u8 ret;
LED_Init();//LED初始化
USARTx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20000);//定时器辅助串口1接收,计数一个周期时间为20ms
USARTx_Init(USART3,115200,36);
TIMx_Init(TIM4,72,20000);//定时器辅助串口3接收,计数一个周期时间为20ms
KEY_Init();//按键初始化
Beep_Init();//蜂鸣器初始化
printf("WIFI模式配置中。。。。\r\n");
while(1)
{
ret=ESP8266_UDP_STA_Mode((u8 *)"wbyq_wifi",(u8 *)"12345678",(u8 *)"172.20.7.1",10500,8266);
if(ret==0)break;
printf("ret:%d\r\n",ret);
}
printf("IP:%s\r\n",esp8266_info.ipaddr);
printf("port:%d\r\n",esp8266_info.port);
while(1)//轮询
{
key=KEY_GetVal();
if(key==2)
{
BEEP=1;
Delay_Ms(50);
BEEP=0;
USARTx_SendStr(USART3,(u8 *)"UDP+STA模式数据传输测试\r\n");
}
if(usart3_rx_flag)
{
usart3_rx_buff[usart3_rx_cnt]='\0';//字符串结束符
usart3_rx_cnt=0;
usart3_rx_flag=0;
printf("rx3:%s\r\n",usart3_rx_buff);
}
}
}
运行效果
工程示例:https://download.csdn.net/download/weixin_44453694/18773915