common.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. #include "common.h"
  2. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  4. //ALIENTEK STM32开发板
  5. //ATK-ESP8266 WIFI模块 公用驱动代码
  6. //正点原子@ALIENTEK
  7. //技术论坛:www.openedv.com
  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. char *strx=0;
  54. if(USART3_RX_STA&0X8000) //接收到一次数据了
  55. {
  56. USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
  57. strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
  58. }
  59. return (u8*)strx;
  60. }
  61. //向ATK-ESP8266发送命令
  62. //cmd:发送的命令字符串
  63. //ack:期待的应答结果,如果为空,则表示不需要等待应答
  64. //waittime:等待时间(单位:10ms)
  65. //返回值:0,发送成功(得到了期待的应答结果)
  66. // 1,发送失败
  67. u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
  68. {
  69. u8 res=0;
  70. USART3_RX_STA=0;
  71. u3_printf("%s\r\n",cmd); //发送命令
  72. if(ack&&waittime) //需要等待应答
  73. {
  74. while(--waittime) //等待倒计时
  75. {
  76. delay_ms(10);
  77. if(USART3_RX_STA&0X8000)//接收到期待的应答结果
  78. {
  79. if(atk_8266_check_cmd(ack))
  80. {
  81. printf("ack:%s\r\n",(u8*)ack);
  82. break;//得到有效数据
  83. }
  84. USART3_RX_STA=0;
  85. }
  86. }
  87. if(waittime==0)res=1;
  88. }
  89. return res;
  90. }
  91. //向ATK-ESP8266发送指定数据
  92. //data:发送的数据(不需要添加回车了)
  93. //ack:期待的应答结果,如果为空,则表示不需要等待应答
  94. //waittime:等待时间(单位:10ms)
  95. //返回值:0,发送成功(得到了期待的应答结果)luojian
  96. u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
  97. {
  98. u8 res=0;
  99. USART3_RX_STA=0;
  100. u3_printf("%s",data); //发送命令
  101. if(ack&&waittime) //需要等待应答
  102. {
  103. while(--waittime) //等待倒计时
  104. {
  105. delay_ms(10);
  106. if(USART3_RX_STA&0X8000)//接收到期待的应答结果
  107. {
  108. if(atk_8266_check_cmd(ack))break;//得到有效数据
  109. USART3_RX_STA=0;
  110. }
  111. }
  112. if(waittime==0)res=1;
  113. }
  114. return res;
  115. }
  116. //ATK-ESP8266退出透传模式
  117. //返回值:0,退出成功;
  118. // 1,退出失败
  119. u8 atk_8266_quit_trans(void)
  120. {
  121. while((USART3->SR&0X40)==0); //等待发送空
  122. USART3->DR='+';
  123. delay_ms(15); //大于串口组帧时间(10ms)
  124. while((USART3->SR&0X40)==0); //等待发送空
  125. USART3->DR='+';
  126. delay_ms(15); //大于串口组帧时间(10ms)
  127. while((USART3->SR&0X40)==0); //等待发送空
  128. USART3->DR='+';
  129. delay_ms(500); //等待500ms
  130. return atk_8266_send_cmd("AT","OK",20);//退出透传判断.
  131. }
  132. //获取ATK-ESP8266模块的AP+STA连接状态
  133. //返回值:0,未连接;1,连接成功
  134. u8 atk_8266_apsta_check(void)
  135. {
  136. if(atk_8266_quit_trans())return 0; //退出透传
  137. atk_8266_send_cmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态
  138. if(atk_8266_check_cmd("+CIPSTATUS:0")&&
  139. atk_8266_check_cmd("+CIPSTATUS:1")&&
  140. atk_8266_check_cmd("+CIPSTATUS:2")&&
  141. atk_8266_check_cmd("+CIPSTATUS:4"))
  142. return 0;
  143. else return 1;
  144. }
  145. //获取ATK-ESP8266模块的连接状态
  146. //返回值:0,未连接;1,连接成功.
  147. u8 atk_8266_consta_check(void)
  148. {
  149. u8 *p;
  150. u8 res;
  151. if(atk_8266_quit_trans())return 0; //退出透传
  152. atk_8266_send_cmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态
  153. p=atk_8266_check_cmd("+CIPSTATUS:");
  154. res=*p; //得到连接状态
  155. return res;
  156. }
  157. //键盘码表
  158. const u8* kbd_tbl[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
  159. u8* kbd_fn_tbl[2];
  160. //获取Client ip地址
  161. //ipbuf:ip地址输出缓存区
  162. void atk_8266_get_wanip(u8* ipbuf)
  163. {
  164. u8 *p,*p1;
  165. if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
  166. {
  167. ipbuf[0]=0;
  168. return;
  169. }
  170. p=atk_8266_check_cmd("\"");
  171. p1=(u8*)strstr((const char*)(p+1),"\"");
  172. *p1=0;
  173. sprintf((char*)ipbuf,"%s",p+1);
  174. }
  175. //获取AP+STA ip地址并在指定位置显示
  176. //ipbuf:ip地址输出缓存区
  177. void atk_8266_get_ip(u8 x,u8 y)
  178. {
  179. u8 *p;
  180. u8 *p1;
  181. u8 *p2;
  182. u8 *ipbuf;
  183. u8 *buf;
  184. if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
  185. {
  186. *ipbuf=0;
  187. }
  188. else
  189. {
  190. p=atk_8266_check_cmd("APIP,\"");
  191. p1=(u8*)strstr((const char*)(p+6),"\"");
  192. p2=p1;
  193. *p1=0;
  194. ipbuf=p+6;
  195. sprintf((char*)buf,"AP IP:%s 端口:%s",ipbuf,(u8*)portnum);
  196. Show_Str(x,y,200,12,buf,12,0); //显示AP模式的IP地址和端口
  197. p=(u8*)strstr((const char*)(p2+1),"STAIP,\"");
  198. p1=(u8*)strstr((const char*)(p+7),"\"");
  199. *p1=0;
  200. ipbuf=p+7;
  201. sprintf((char*)buf,"STA IP:%s 端口:%s",ipbuf,(u8*)portnum);
  202. Show_Str(x,y+15,200,12,buf,12,0); //显示STA模式的IP地址和端口
  203. }
  204. }
  205. //ATK-ESP8266模块信息显示
  206. //x,y:显示信息的起始坐标.
  207. //wanip:0,全部更新显示;1,仅更新wanip.
  208. void atk_8266_msg_show(u16 x,u16 y,u8 wanip)
  209. {
  210. u8 *p,*p1,*p2;
  211. atk_8266_send_cmd("AT+CWMODE=2","OK",20);
  212. atk_8266_send_cmd("AT+RST","OK",20);
  213. delay_ms(1000);//延时2s等待模块重启
  214. delay_ms(1000);//
  215. delay_ms(1000);
  216. delay_ms(1000);
  217. sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4",wifiap_ssid,wifiap_password); //配置模块AP模式无线参数
  218. atk_8266_send_cmd(p,"OK",1000);
  219. if(wanip==0)//全更新
  220. {
  221. atk_8266_send_cmd("AT+GMR","OK",20); //获取固件版本号
  222. p=atk_8266_check_cmd("SDK version:");
  223. p1=(u8*)strstr((const char*)(p+12),"(");
  224. *p1=0;
  225. Show_Str(x,y,240,16,"固件版本:",16,0);
  226. Show_Str(x+72,y,240,16,p+12,16,0);
  227. atk_8266_send_cmd("AT+CWMODE?","+CWMODE:",20); //获取网络模式
  228. p=atk_8266_check_cmd(":");
  229. Show_Str(x,y+16,240,16,"网络模式:",16,0);
  230. Show_Str(x+72,y+16,240,16,(u8*)ATK_ESP8266_CWMODE_TBL[*(p+1)-'1'],16,0);
  231. atk_8266_send_cmd("AT+CWSAP?","+CWSAP:",20); //获取wifi配置
  232. p=atk_8266_check_cmd("\"");
  233. p1=(u8*)strstr((const char*)(p+1),"\"");
  234. p2=p1;
  235. *p1=0;
  236. Show_Str(x,y+32,240,16,"SSID号:",16,0);Show_Str(x+56,y+32,240,16,p+1,16,0);
  237. p=(u8*)strstr((const char*)(p2+1),"\"");
  238. p1=(u8*)strstr((const char*)(p+1),"\"");
  239. p2=p1;
  240. *p1=0;
  241. Show_Str(x,y+48,240,16,"密码:",16,0);Show_Str(x+40,y+48,240,16,p+1,16,0);
  242. p=(u8*)strstr((const char*)(p2+1),",");
  243. p1=(u8*)strstr((const char*)(p+1),",");
  244. *p1=0;
  245. Show_Str(x,y+64,240,16,"通道号:",16,0);Show_Str(x+56,y+64,240,16,p+1,16,0);
  246. Show_Str(x,y+80,240,16,"加密方式:",16,0);Show_Str(x+72,y+80,240,16,(u8*)ATK_ESP8266_ECN_TBL[*(p1+1)-'0'],16,0);
  247. }
  248. }
  249. //ATK-ESP8266模块WIFI配置参数显示(仅WIFI STA/WIFI AP模式测试时使用)
  250. //x,y:显示信息的起始坐标.
  251. //rmd:提示信息
  252. //ssid,encryption,password:无线网络的SSID,加密方式,密码
  253. void atk_8266_wificonf_show(u16 x,u16 y,u8* rmd,u8* ssid,u8* encryption,u8* password)
  254. {
  255. Show_Str(x,y,240,12,rmd,12,0);//显示提示信息
  256. Show_Str(x,y+20,240,12,"SSID:",12,0);
  257. Show_Str(x,y+36,240,12,"加密方式:",12,0);
  258. Show_Str(x,y+52,240,12,"密码:",12,0);
  259. Show_Str(x+30,y+20,240,12,ssid,12,0);
  260. Show_Str(x+54,y+36,240,12,encryption,12,0);
  261. Show_Str(x+30,y+52,240,12,password,12,0);
  262. }
  263. //STA模式下的AP的TCP、UDP工作模式配置
  264. u8 atk_8266_mode_cofig(u8 netpro)
  265. {
  266. //u8 netpro;
  267. u8 ipbuf[16]; //IP缓存
  268. u8 *p;
  269. u8 key;
  270. PRESTA:
  271. netpro|=(atk_8266_netpro_sel(50,30,(u8*)ATK_ESP8266_CWMODE_TBL[1]))<<4; //网络模式选择
  272. if(netpro&0X20)
  273. {
  274. if(atk_8266_ip_set("WIFI-AP远端UDP IP设置","UDP模式",(u8*)portnum,ipbuf))goto PRESTA; //IP输入
  275. if(netpro&0X03)sprintf((char*)p,"AT+CIPSTART=1,\"UDP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标UDP服务器,及ID号,STA模式下为0
  276. else sprintf((char*)p,"AT+CIPSTART=0,\"UDP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标UDP服务器,及ID号,STA模式下为0
  277. delay_ms(200);
  278. atk_8266_send_cmd(p,"OK",200);
  279. }
  280. else if(netpro&0X10) //AP TCP Client 透传模式测试
  281. {
  282. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  283. Show_Str(30,50,200,16,"正在配置ATK-ESP模块,请稍等...",12,0);
  284. if(atk_8266_ip_set("WIFI-AP 远端IP设置","TCP Client",(u8*)portnum,ipbuf))goto PRESTA; //IP输入
  285. if(netpro&0X03)sprintf((char*)p,"AT+CIPSTART=1,\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标TCP服务器,及ID号,STA模式为client时,为1
  286. else sprintf((char*)p,"AT+CIPSTART=0,\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标TCP服务器,及ID号,STA模式为server时,为0
  287. while(atk_8266_send_cmd(p,"OK",200))
  288. {
  289. Show_Str_Mid(0,40,"WK_UP:返回重选",16,240);
  290. Show_Str(30,80,200,12,"ATK-ESP 连接TCP SERVER失败",12,0); //连接失败
  291. }
  292. }
  293. else; //服务器模式不用配置
  294. return netpro;
  295. }
  296. //IP设置
  297. //title:ip设置标题
  298. //mode:工作模式
  299. //port:端口号
  300. //*ip:ip缓存区(返回IP给上层函数)
  301. //返回值:0,确认连接;1,取消连接.
  302. u8 atk_8266_ip_set(u8* title,u8* mode,u8* port,u8* ip)
  303. {
  304. u8 res=0;
  305. u8 key;
  306. u8 timex=0;
  307. u8 iplen=0; //IP长度
  308. Show_Str_Mid(0,30,title,16,240); //显示标题
  309. Show_Str(30,90,200,16,"工作模式:",16,0); //工作模式显示
  310. Show_Str(30,110,200,16,"IP地址:",16,0); //IP地址可以键盘设置
  311. Show_Str(30,130,200,16,"端口:",16,0); //端口号
  312. kbd_fn_tbl[0]="连接";
  313. kbd_fn_tbl[1]="返回";
  314. atk_8266_load_keyboard(0,180); //显示键盘
  315. Show_Str(30+72,90,200,16,mode,16,0); //显示工作模式
  316. Show_Str(30+40,130,200,16,port,16,0); //显示端口
  317. ip[0]=0;
  318. while(1)
  319. {
  320. key=atk_8266_get_keynum(0,180);
  321. if(key)
  322. {
  323. if(key<12)
  324. {
  325. if(iplen<15)
  326. {
  327. ip[iplen++]=kbd_tbl[key-1][0];
  328. }
  329. }else
  330. {
  331. if(key==13)if(iplen)iplen--; //删除
  332. if(key==14&&iplen)break; //确认连接
  333. if(key==15){res=1;break;} //取消连接
  334. }
  335. ip[iplen]=0;
  336. Show_Str(30+56,110,200,16,ip,16,0); //显示IP地址
  337. }
  338. timex++;
  339. if(timex==20)
  340. {
  341. timex=0;
  342. }
  343. delay_ms(10);
  344. atk_8266_at_response(1);//WIFI模块发过来的数据,及时上传给电脑
  345. }
  346. return res;
  347. }
  348. //测试界面主UI
  349. void atk_8266_mtest_ui(u16 x,u16 y)
  350. {
  351. Show_Str_Mid(0,y,"ATK_ESP8266 WIFI模块测试",16,240);
  352. Show_Str(x,y+25,200,16,"请选择:",16,0);
  353. Show_Str(x,y+45,200,16,"KEY0:WIFI STA+AP",16,0);
  354. Show_Str(x,y+65,200,16,"KEY1:WIFI STA",16,0);
  355. Show_Str(x,y+85,200,16,"WK_UP:WIFI AP",16,0);
  356. atk_8266_msg_show(x,y+125,0);
  357. }
  358. //ATK-ESP8266模块测试主函数
  359. void atk_8266_test(void)
  360. {
  361. // u16 rlen=0;
  362. u8 key;
  363. u8 timex;
  364. Show_Str_Mid(0,30,"ATK-ESP8266 WIFI模块测试",16,240);
  365. while(atk_8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线
  366. {
  367. atk_8266_quit_trans();//退出透传
  368. atk_8266_send_cmd("AT+CIPMODE=0","OK",200); //关闭透传模式
  369. Show_Str(40,55,200,16,"未检测到模块!!!",16,0);
  370. delay_ms(800);
  371. Show_Str(40,55,200,16,"尝试连接模块...",16,0);
  372. }
  373. while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显
  374. atk_8266_mtest_ui(32,30);
  375. while(1)
  376. {
  377. delay_ms(10);
  378. atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑
  379. key=KEY_Scan(0);
  380. if(key)
  381. {
  382. LCD_Clear(WHITE);
  383. POINT_COLOR=RED;
  384. switch(key)
  385. {
  386. case 1://KEY0
  387. Show_Str_Mid(0,30,"ATK-ESP WIFI-AP+STA 测试",16,240);
  388. Show_Str_Mid(0,50,"正在配置ATK-ESP8266模块,请稍等...",12,240);
  389. atk_8266_apsta_test(); //串口以太网测试
  390. break;
  391. case 2://KEY1
  392. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  393. Show_Str_Mid(0,50,"正在配置ATK-ESP8266模块,请稍等...",12,240);
  394. atk_8266_wifista_test();//WIFI STA测试
  395. break;
  396. case 4://WK_UP
  397. atk_8266_wifiap_test(); //WIFI AP测试
  398. break;
  399. }
  400. atk_8266_mtest_ui(32,30);
  401. timex=0;
  402. }
  403. if((timex%20)==0)LED0=!LED0;//200ms闪烁
  404. timex++;
  405. }
  406. }