[STM32F1] 原子的ESP8266的程序自己给改了,用来发送ADC的数据到PC端...

[复制链接]
5676|12
 楼主| rainic 发表于 2017-11-22 18:10 | 显示全部楼层 |阅读模式
本帖最后由 rainic 于 2017-11-22 18:22 编辑

ESP8266源程序是有三种模式分别是STA+AP、STA、AP模式,可以通过按键选择触屏写字,功能很全很强大。现在我给简化了,只要AP功能还加入了ADC程序。板载wifi是原子送的ESP8266,PC端是自己买的安可信的ES8266+转串口工具。调试软件也用的安信可的,接收数据如下图。调试工具的接收窗口,除了有ADC的数值外还有AT+CIPSEND=0,25和+IPD,25:这两串字符,相应的程序还不能注释掉,否则直接没数据。不知道怎么改了,求助。

QQ截图20171122114331.png QQ截图20171122114229.png QQ截图20171122120949.png

  1. 这是wifiap.c程序
  2. #include "common.h"
  3. #include "adc.h"
  4. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  6. //ALIENTEK STM32开发板
  7. //ATK-ESP8266 WIFI模块 WIFI AP驱动代码           
  8. //正点原子@ALIENTEK
  9. //修改日期:2014/4/3
  10. //版本:V1.0
  11. //版权所有,盗版必究。
  12. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  13. //All rights reserved                                                                          
  14. ///////////////////////////////////////////////////////////////////////////////////////////////////////////


  15. //ATK-ESP8266 WIFI AP测试
  16. //用于测试TCP/UDP连接
  17. //返回值:0,正常
  18. //    其他,错误代码
  19. u8 atk_8266_wifiap_test(void)
  20. {
  21.         u8 netpro=0;        //网络模式
  22.         u8 ipbuf[16];         //IP缓存
  23.         u8 *p;
  24.         u16 t=999;                //加速第一次获取链接状态
  25.         u16 rlen=0;
  26.         u8 constate=0;        //连接状态
  27.         u16 temp;
  28.         p=mymalloc(SRAMIN,32);                                                        //申请32字节内存
  29.         LCD_Clear(WHITE);
  30.         POINT_COLOR=RED;
  31.         Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);
  32.         sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);//IP输入:192.168.4.1
  33.         atk_8266_send_cmd(p,"OK",20);     //开启Server模式,端口号为8086
  34.         POINT_COLOR=RED;
  35.         Show_Str_Mid(0,30,"ATK-ESP WIFI-AP 测试",16,240);               
  36.         Show_Str(30,50,200,16,"配置ATK-ESP模块成功!",12,0);
  37.         LCD_Fill(30,80,239,80+12,WHITE);
  38.         atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP
  39.         sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
  40.         Show_Str(30,65,200,12,p,12,0);                                //显示IP地址和端口        
  41.         Show_Str(30,80,200,12,"状态:",12,0);                 //连接状态
  42.         Show_Str(120,80,200,12,"模式:",12,0);                 //连接状态
  43.         Show_Str(30,100,200,12,"发送数据:",12,0);         //发送数据
  44.         Show_Str(30,115,200,12,"接收数据:",12,0);        //接收数据
  45.         POINT_COLOR=BLUE;
  46.         Show_Str(120+30,80,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],12,0);                 //连接状态
  47.         USART3_RX_STA=0;
  48.         while(1)
  49.                 {
  50.                         if(constate!='+')t=200;                //状态为还未连接,立即更新连接状态
  51.                         else t=0;                   //状态为已经连接了,2秒后再检查
  52.                         if(t==200)//连续2秒钟没有收到任何数据,检查连接是不是还存在.
  53.                                 {
  54.                                         constate=atk_8266_consta_check();//得到连接状态
  55.                                         if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0);  //连接状态
  56.                                         else Show_Str(30+30,80,200,12,"连接失败",12,0);                    
  57.                                         t=0;
  58.                                 }
  59. //                                atk_8266_at_response(1);
  60.                                 temp=Get_Adc(ADC_Channel_1);
  61. //                                printf("%d\r\n",temp);
  62.                                 sprintf((char*)p,"%d\r\n",temp);//测试数据
  63.                                 Show_Str(30+54,100,200,12,p,12,0);//显示准备发送的数据
  64.                                 atk_8266_send_cmd("AT+CIPSEND=0,25","OK",4);  //发送指定长度的数据
  65.                                 atk_8266_send_data(p,"OK",4);  //发送指定长度的数据
  66.                         
  67. //                        接收数据程序
  68. //                        if(USART3_RX_STA&0X8000)                //接收到一次数据了
  69. //                                {
  70. //                                        rlen=USART3_RX_STA&0X7FFF;        //得到本次接收到的数据长度
  71. //                                        USART3_RX_BUF[rlen]=0;                //添加结束符
  72. //                                        printf("%s",USART3_RX_BUF);        //发送到串口   
  73. //                                        sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数
  74. //                                        LCD_Fill(30+54,115,239,130,WHITE);
  75. //                                        POINT_COLOR=BRED;
  76. //                                        Show_Str(30+54,115,156,12,p,12,0);                         //显示接收到的数据长度
  77. //                                        POINT_COLOR=BLUE;
  78. //                                        LCD_Fill(30,130,239,319,WHITE);
  79. //                                        Show_Str(30,130,180,190,USART3_RX_BUF,12,0);//显示接收到的数据  
  80. //                                        USART3_RX_STA=0;
  81. //                                        if(constate!='+')t=200;                //状态为还未连接,立即更新连接状态
  82. //                                        else t=0;                   //状态为已经连接了,2秒后再检查
  83. //                                        }

  84.                 }
  85.                 myfree(SRAMIN,p);                //释放内存
  86. }







  1. 这是common.c程序
  2. #include "common.h"
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  5. //ALIENTEK STM32开发板
  6. //ATK-ESP8266 WIFI模块 公用驱动代码           
  7. //正点原子@ALIENTEK
  8. //修改日期:2014/4/3
  9. //版本:V1.0
  10. //版权所有,盗版必究。
  11. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  12. //All rights reserved                                                                          
  13. ///////////////////////////////////////////////////////////////////////////////////////////////////////////

  14. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. //用户配置区

  16. //连接端口号:8086,可自行修改为其他端口.
  17. const u8* portnum="8086";                 

  18. //WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改.
  19. const u8* wifista_ssid="ALIENTEK";                        //路由器SSID号
  20. const u8* wifista_encryption="wpawpa2_aes";        //wpa/wpa2 aes加密方式
  21. const u8* wifista_password="15902020353";         //连接密码

  22. //WIFI AP模式,模块对外的无线参数,可自行修改.
  23. const u8* wifiap_ssid="ATK-ESP8266";                        //对外SSID号
  24. const u8* wifiap_encryption="wpawpa2_aes";        //wpa/wpa2 aes加密方式
  25. const u8* wifiap_password="12345678";                 //连接密码

  26. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. //4个网络模式
  28. const u8 *ATK_ESP8266_CWMODE_TBL[3]={"STA模式 ","AP模式 ","AP&STA模式 "};        //ATK-ESP8266,3种网络模式,默认为路由器(ROUTER)模式
  29. //4种工作模式
  30. const u8 *ATK_ESP8266_WORKMODE_TBL[3]={"TCP服务器","TCP客户端"," UDP 模式"};        //ATK-ESP8266,4种工作模式
  31. //5种加密方式
  32. const u8 *ATK_ESP8266_ECN_TBL[5]={"OPEN","WEP","WPA_PSK","WPA2_PSK","WPA_WAP2_PSK"};
  33. ///////////////////////////////////////////////////////////////////////////////////////////////////////////

  34. //usmart支持部分
  35. //将收到的AT指令应答数据返回给电脑串口
  36. //mode:0,不清零USART3_RX_STA;
  37. //     1,清零USART3_RX_STA;
  38. void atk_8266_at_response(u8 mode)
  39. {
  40.         if(USART3_RX_STA&0X8000)                //接收到一次数据了
  41.         {
  42.                 USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
  43.                 printf("%s",USART3_RX_BUF);        //发送到串口
  44.                 if(mode)USART3_RX_STA=0;
  45.         }
  46. }
  47. //ATK-ESP8266发送命令后,检测接收到的应答
  48. //str:期待的应答结果
  49. //返回值:0,没有得到期待的应答结果
  50. //    其他,期待应答结果的位置(str的位置)
  51. u8* atk_8266_check_cmd(u8 *str)
  52. {
  53.         
  54.         char *strx=0;
  55.         if(USART3_RX_STA&0X8000)                //接收到一次数据了
  56.         {
  57.                 USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
  58.                 strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
  59.         }
  60.         return (u8*)strx;
  61. }
  62. //向ATK-ESP8266发送命令
  63. //cmd:发送的命令字符串
  64. //ack:期待的应答结果,如果为空,则表示不需要等待应答
  65. //waittime:等待时间(单位:10ms)
  66. //返回值:0,发送成功(得到了期待的应答结果)
  67. //       1,发送失败
  68. u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
  69. {
  70.         u8 res=0;
  71.         USART3_RX_STA=0;
  72.         u3_printf("%s\r\n",cmd);        //发送命令
  73.         if(ack&&waittime)                //需要等待应答
  74.         {
  75.                 while(--waittime)        //等待倒计时
  76.                 {
  77.                         delay_ms(10);
  78.                         if(USART3_RX_STA&0X8000)//接收到期待的应答结果
  79.                         {
  80.                                 if(atk_8266_check_cmd(ack))
  81.                                 {
  82. //                                        printf("ack:%s\r\n",(u8*)ack);
  83.                                         break;//得到有效数据
  84.                                 }
  85.                                         USART3_RX_STA=0;
  86.                         }
  87.                 }
  88.                 if(waittime==0)res=1;
  89.         }
  90.         return res;
  91. }
  92. //向ATK-ESP8266发送指定数据
  93. //data:发送的数据(不需要添加回车了)
  94. //ack:期待的应答结果,如果为空,则表示不需要等待应答
  95. //waittime:等待时间(单位:10ms)
  96. //返回值:0,发送成功(得到了期待的应答结果)luojian
  97. u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
  98. {
  99.         u8 res=0;
  100.         USART3_RX_STA=0;
  101.         u3_printf("%s",data);        //发送命令
  102.         if(ack&&waittime)                //需要等待应答
  103.         {
  104.                 while(--waittime)        //等待倒计时
  105.                 {
  106.                         delay_ms(10);
  107.                         if(USART3_RX_STA&0X8000)//接收到期待的应答结果
  108.                         {
  109.                                 if(atk_8266_check_cmd(ack))break;//得到有效数据
  110.                                 USART3_RX_STA=0;
  111.                         }
  112.                 }
  113.                 if(waittime==0)res=1;
  114.         }
  115.         return res;
  116. }
  117. //ATK-ESP8266退出透传模式
  118. //返回值:0,退出成功;
  119. //       1,退出失败
  120. u8 atk_8266_quit_trans(void)
  121. {
  122.         while((USART3->SR&0X40)==0);        //等待发送空
  123.         USART3->DR='+';      
  124.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  125.         while((USART3->SR&0X40)==0);        //等待发送空
  126.         USART3->DR='+';      
  127.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  128.         while((USART3->SR&0X40)==0);        //等待发送空
  129.         USART3->DR='+';      
  130.         delay_ms(500);                                        //等待500ms
  131.         return atk_8266_send_cmd("AT","OK",20);//退出透传判断.
  132. }

  133. //获取ATK-ESP8266模块的连接状态
  134. //返回值:0,未连接;1,连接成功.
  135. u8 atk_8266_consta_check(void)
  136. {
  137.         u8 *p;
  138.         u8 res;
  139.         if(atk_8266_quit_trans())return 0;                        //退出透传
  140.         atk_8266_send_cmd("AT+CIPSTATUS",":",50);        //发送AT+CIPSTATUS指令,查询连接状态
  141.         p=atk_8266_check_cmd("+CIPSTATUS:");
  142.         res=*p;                                                                        //得到连接状态        
  143.         return res;
  144. }

  145. //获取Client ip地址
  146. //ipbuf:ip地址输出缓存区
  147. void atk_8266_get_wanip(u8* ipbuf)
  148. {
  149.         u8 *p,*p1;
  150.                 if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
  151.                 {
  152.                         ipbuf[0]=0;
  153.                         return;
  154.                 }               
  155.                 p=atk_8266_check_cmd(""");
  156.                 p1=(u8*)strstr((const char*)(p+1),""");
  157.                 *p1=0;
  158.                 sprintf((char*)ipbuf,"%s",p+1);        
  159. }




  160. //ATK-ESP8266模块测试主函数
  161. void atk_8266_test(void)
  162. {

  163.         while(1)
  164.         {
  165.                 atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑

  166.                 atk_8266_wifiap_test();        //WIFI AP测试

  167.                 }         

  168. }









mmuuss586 发表于 2017-11-22 20:14 | 显示全部楼层

这个不熟,你问下原子看看;
一路向北lm 发表于 2017-11-22 22:13 | 显示全部楼层
不错,ESP8266可以做一个神器,你懂得
一路向北lm 发表于 2017-11-22 22:14 | 显示全部楼层
改的不错,我大一喜欢研究这个,好几年没玩了。
 楼主| rainic 发表于 2017-11-23 12:49 | 显示全部楼层
mmuuss586 发表于 2017-11-22 20:14
这个不熟,你问下原子看看;

原子的论坛活跃度不行,问了也没人回答。倒是经常见你回帖
 楼主| rainic 发表于 2017-11-23 12:52 | 显示全部楼层
一路向北lm 发表于 2017-11-22 22:14
改的不错,我大一喜欢研究这个,好几年没玩了。

厉害,我大一都不知道什么是单片机。可能是发送协议格式的问题,我自己在排查一下。
mmuuss586 发表于 2017-11-23 13:29 | 显示全部楼层
rainic 发表于 2017-11-23 12:49
原子的论坛活跃度不行,问了也没人回答。倒是经常见你回帖


他在我群里;
我做硬件为主的,一般是自己做过的比较熟悉;
 楼主| rainic 发表于 2017-11-23 14:17 | 显示全部楼层
mmuuss586 发表于 2017-11-23 13:29
他在我群里;
我做硬件为主的,一般是自己做过的比较熟悉; ...

我也是做硬件的,可以交流一下。还没毕业,技术有点菜啊
mmuuss586 发表于 2017-11-23 16:51 | 显示全部楼层
rainic 发表于 2017-11-23 14:17
我也是做硬件的,可以交流一下。还没毕业,技术有点菜啊

那你加我微信呗:备注下是谁,要不然加我的太多了;
mmuuss586
和21IC帐号一样的
小白衣丶 发表于 2017-12-7 09:59 | 显示全部楼层
厉害!!学习了
greenhande 发表于 2018-3-11 20:11 | 显示全部楼层
由于ESP8266是透传,当通过串口发送指令时,也将指令通过esp8266发给了客户端,这样解释正确吗

评论

u3_printf 函数里面?  发表于 2018-3-11 20:12
meiyaolei 发表于 2018-5-24 09:31 | 显示全部楼层
学习了,感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部