- 这是wifiap.c程序
- #include "common.h"
- #include "adc.h"
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //ATK-ESP8266 WIFI模块 WIFI AP驱动代码
- //正点原子@ALIENTEK
- //修改日期:2014/4/3
- //版本:V1.0
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //ATK-ESP8266 WIFI AP测试
- //用于测试TCP/UDP连接
- //返回值:0,正常
- // 其他,错误代码
- u8 atk_8266_wifiap_test(void)
- {
- u8 netpro=0; //网络模式
- u8 ipbuf[16]; //IP缓存
- u8 *p;
- u16 t=999; //加速第一次获取链接状态
- u16 rlen=0;
- u8 constate=0; //连接状态
- u16 temp;
- p=mymalloc(SRAMIN,32); //申请32字节内存
- LCD_Clear(WHITE);
- POINT_COLOR=RED;
- Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);
- sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);//IP输入:192.168.4.1
- atk_8266_send_cmd(p,"OK",20); //开启Server模式,端口号为8086
- POINT_COLOR=RED;
- Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);
- Show_Str(30,50,200,16,"配置ATK-ESP模块成功!",12,0);
- LCD_Fill(30,80,239,80+12,WHITE);
- atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP
- sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
- Show_Str(30,65,200,12,p,12,0); //显示IP地址和端口
- Show_Str(30,80,200,12,"状态:",12,0); //连接状态
- Show_Str(120,80,200,12,"模式:",12,0); //连接状态
- Show_Str(30,100,200,12,"发送数据:",12,0); //发送数据
- Show_Str(30,115,200,12,"接收数据:",12,0); //接收数据
- POINT_COLOR=BLUE;
- Show_Str(120+30,80,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],12,0); //连接状态
- USART3_RX_STA=0;
- while(1)
- {
- if(constate!='+')t=200; //状态为还未连接,立即更新连接状态
- else t=0; //状态为已经连接了,2秒后再检查
- if(t==200)//连续2秒钟没有收到任何数据,检查连接是不是还存在.
- {
- constate=atk_8266_consta_check();//得到连接状态
- if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0); //连接状态
- else Show_Str(30+30,80,200,12,"连接失败",12,0);
- t=0;
- }
- // atk_8266_at_response(1);
- temp=Get_Adc(ADC_Channel_1);
- // printf("%d\r\n",temp);
- sprintf((char*)p,"%d\r\n",temp);//测试数据
- Show_Str(30+54,100,200,12,p,12,0);//显示准备发送的数据
- atk_8266_send_cmd("AT+CIPSEND=0,25","OK",4); //发送指定长度的数据
- atk_8266_send_data(p,"OK",4); //发送指定长度的数据
-
- // 接收数据程序
- // if(USART3_RX_STA&0X8000) //接收到一次数据了
- // {
- // rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度
- // USART3_RX_BUF[rlen]=0; //添加结束符
- // printf("%s",USART3_RX_BUF); //发送到串口
- // sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数
- // LCD_Fill(30+54,115,239,130,WHITE);
- // POINT_COLOR=BRED;
- // Show_Str(30+54,115,156,12,p,12,0); //显示接收到的数据长度
- // POINT_COLOR=BLUE;
- // LCD_Fill(30,130,239,319,WHITE);
- // Show_Str(30,130,180,190,USART3_RX_BUF,12,0);//显示接收到的数据
- // USART3_RX_STA=0;
- // if(constate!='+')t=200; //状态为还未连接,立即更新连接状态
- // else t=0; //状态为已经连接了,2秒后再检查
- // }
- }
- myfree(SRAMIN,p); //释放内存
- }
- 这是common.c程序
- #include "common.h"
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //ATK-ESP8266 WIFI模块 公用驱动代码
- //正点原子@ALIENTEK
- //修改日期:2014/4/3
- //版本:V1.0
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //用户配置区
- //连接端口号:8086,可自行修改为其他端口.
- const u8* portnum="8086";
- //WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改.
- const u8* wifista_ssid="ALIENTEK"; //路由器SSID号
- const u8* wifista_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
- const u8* wifista_password="15902020353"; //连接密码
- //WIFI AP模式,模块对外的无线参数,可自行修改.
- const u8* wifiap_ssid="ATK-ESP8266"; //对外SSID号
- const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
- const u8* wifiap_password="12345678"; //连接密码
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //4个网络模式
- const u8 *ATK_ESP8266_CWMODE_TBL[3]={"STA模式 ","AP模式 ","AP&STA模式 "}; //ATK-ESP8266,3种网络模式,默认为路由器(ROUTER)模式
- //4种工作模式
- const u8 *ATK_ESP8266_WORKMODE_TBL[3]={"TCP服务器","TCP客户端"," UDP 模式"}; //ATK-ESP8266,4种工作模式
- //5种加密方式
- const u8 *ATK_ESP8266_ECN_TBL[5]={"OPEN","WEP","WPA_PSK","WPA2_PSK","WPA_WAP2_PSK"};
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
- //usmart支持部分
- //将收到的AT指令应答数据返回给电脑串口
- //mode:0,不清零USART3_RX_STA;
- // 1,清零USART3_RX_STA;
- void atk_8266_at_response(u8 mode)
- {
- if(USART3_RX_STA&0X8000) //接收到一次数据了
- {
- USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
- printf("%s",USART3_RX_BUF); //发送到串口
- if(mode)USART3_RX_STA=0;
- }
- }
- //ATK-ESP8266发送命令后,检测接收到的应答
- //str:期待的应答结果
- //返回值:0,没有得到期待的应答结果
- // 其他,期待应答结果的位置(str的位置)
- u8* atk_8266_check_cmd(u8 *str)
- {
-
- char *strx=0;
- if(USART3_RX_STA&0X8000) //接收到一次数据了
- {
- USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
- strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
- }
- return (u8*)strx;
- }
- //向ATK-ESP8266发送命令
- //cmd:发送的命令字符串
- //ack:期待的应答结果,如果为空,则表示不需要等待应答
- //waittime:等待时间(单位:10ms)
- //返回值:0,发送成功(得到了期待的应答结果)
- // 1,发送失败
- u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
- {
- u8 res=0;
- USART3_RX_STA=0;
- u3_printf("%s\r\n",cmd); //发送命令
- if(ack&&waittime) //需要等待应答
- {
- while(--waittime) //等待倒计时
- {
- delay_ms(10);
- if(USART3_RX_STA&0X8000)//接收到期待的应答结果
- {
- if(atk_8266_check_cmd(ack))
- {
- // printf("ack:%s\r\n",(u8*)ack);
- break;//得到有效数据
- }
- USART3_RX_STA=0;
- }
- }
- if(waittime==0)res=1;
- }
- return res;
- }
- //向ATK-ESP8266发送指定数据
- //data:发送的数据(不需要添加回车了)
- //ack:期待的应答结果,如果为空,则表示不需要等待应答
- //waittime:等待时间(单位:10ms)
- //返回值:0,发送成功(得到了期待的应答结果)luojian
- u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
- {
- u8 res=0;
- USART3_RX_STA=0;
- u3_printf("%s",data); //发送命令
- if(ack&&waittime) //需要等待应答
- {
- while(--waittime) //等待倒计时
- {
- delay_ms(10);
- if(USART3_RX_STA&0X8000)//接收到期待的应答结果
- {
- if(atk_8266_check_cmd(ack))break;//得到有效数据
- USART3_RX_STA=0;
- }
- }
- if(waittime==0)res=1;
- }
- return res;
- }
- //ATK-ESP8266退出透传模式
- //返回值:0,退出成功;
- // 1,退出失败
- u8 atk_8266_quit_trans(void)
- {
- while((USART3->SR&0X40)==0); //等待发送空
- USART3->DR='+';
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART3->SR&0X40)==0); //等待发送空
- USART3->DR='+';
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART3->SR&0X40)==0); //等待发送空
- USART3->DR='+';
- delay_ms(500); //等待500ms
- return atk_8266_send_cmd("AT","OK",20);//退出透传判断.
- }
- //获取ATK-ESP8266模块的连接状态
- //返回值:0,未连接;1,连接成功.
- u8 atk_8266_consta_check(void)
- {
- u8 *p;
- u8 res;
- if(atk_8266_quit_trans())return 0; //退出透传
- atk_8266_send_cmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态
- p=atk_8266_check_cmd("+CIPSTATUS:");
- res=*p; //得到连接状态
- return res;
- }
- //获取Client ip地址
- //ipbuf:ip地址输出缓存区
- void atk_8266_get_wanip(u8* ipbuf)
- {
- u8 *p,*p1;
- if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
- {
- ipbuf[0]=0;
- return;
- }
- p=atk_8266_check_cmd(""");
- p1=(u8*)strstr((const char*)(p+1),""");
- *p1=0;
- sprintf((char*)ipbuf,"%s",p+1);
- }
- //ATK-ESP8266模块测试主函数
- void atk_8266_test(void)
- {
- while(1)
- {
- atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑
- atk_8266_wifiap_test(); //WIFI AP测试
- }
- }