找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1982|回复: 0
打印 上一主题 下一主题
收起左侧

ATK-RM04 WIFI模块程序

[复制链接]
跳转到指定楼层
楼主
ID:511461 发表于 2019-7-30 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT指令格式:AT指令都以”AT”开头,以<CR>(即\r,回车符)结束,模块运行后,串口默认的设置为:8位数据位、1位停止位、无奇偶校验位、硬件流控制(CTS/RTS).注意为了发送AT命令,最后还要加上<LF> (即\n,换行符)这是串口终端要求.
AT返回状态包括三种情况 OK,ERROR,和命令相关的错误原因字符串.返回状态前后都有一个<CR>字符.
   如 <CR>OK<CR> 表示AT命令执行成功.
     <CR>ERROR<CR> 表示AT命令执行失败
     <CR>NO DIAL TONE<CR> 只出现在ATD命令返回状态中,表示没有拨号音,这类返回状态要查命令手册
  还有一些命令本身是要向DCE查询数据,数据返回时,一般是+打头命令.返回格式
   <CR>+命令:命令结果<CR>

main.c:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "key.h"
  7. #include "usmart.h"
  8. #include "malloc.h"  
  9. #include "MMC_SD.h"
  10. #include "ff.h"  
  11. #include "exfuns.h"
  12. #include "fontupd.h"
  13. #include "text.h"      
  14. #include "common.h"
  15. #include "touch.h"      
  16. #include "usart2.h"      
  17. //ALIENTEK Mini STM32开发板扩展实验15
  18. //ATK-RM04 WIFI模块测试实验
  19. //广州市星翼电子科技有限公司  


  20. int main(void)
  21. {
  22.         u8 key,fontok=0;           
  23.         delay_init();                     //延时函数初始化
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级         
  25.         uart_init(115200);                 //串口初始化为9600                        
  26.         LCD_Init();                                //初始化液晶
  27.         LED_Init();                 //LED初始化         
  28.         KEY_Init();                                //按键初始化                                                                                                                     

  29.         tp_dev.init();                        //触摸屏初始化
  30.         mem_init();                                //初始化内存池            
  31.         exfuns_init();                        //为fatfs相关变量申请内存  
  32.   f_mount(fs[0],"0:",1);         //挂载SD卡  
  33.                   f_mount(fs[1],"1:",1);         //挂载FLASH.
  34.         key=KEY_Scan(0);  
  35.         if(key==KEY0_PRES)                //强制校准
  36.         {
  37.                 LCD_Clear(WHITE);        //清屏
  38.                 tp_dev.adjust();          //屏幕校准  
  39.                 LCD_Clear(WHITE);        //清屏
  40.         }
  41.         fontok=font_init();                //检查字库是否OK
  42.         if(fontok||key==KEY1_PRES)//需要更新字库(字库不存在/KEY1按下)                        
  43.         {
  44.                 LCD_Clear(WHITE);                           //清屏
  45.                 POINT_COLOR=RED;                        //设置字体为红色                                
  46.                 LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
  47.                 while(SD_Initialize())                //检测SD卡
  48.                 {
  49.                         LCD_ShowString(60,70,200,16,16,"SD Card Failed!");
  50.                         delay_ms(200);
  51.                         LCD_Fill(60,70,200+60,70+16,WHITE);
  52.                         delay_ms(200);                    
  53.                 }                                                                                                                     
  54.                 LCD_ShowString(60,70,200,16,16,"SD Card OK");
  55.                 LCD_ShowString(60,90,200,16,16,"Font Updating...");
  56.                 key=update_font(20,110,16);//更新字库
  57.                 while(key)//更新失败               
  58.                 {                                          
  59.                         LCD_ShowString(60,110,200,16,16,"Font Update Failed!");
  60.                         delay_ms(200);
  61.                         LCD_Fill(20,110,200+20,110+16,WHITE);
  62.                         delay_ms(200);                       
  63.                 }                  
  64.                 LCD_ShowString(60,110,200,16,16,"Font Update Success!");
  65.                 delay_ms(1500);      
  66.                 LCD_Clear(WHITE);//清屏               
  67.         }  
  68.         atk_rm04_init();                //初始化RM04模块
  69.         atk_rm04_test();                //进入RM04测试
  70. }

  71. common.c:
  72. #include "common.h"
  73. void atk_rm04_init(void)
  74. {
  75. #if AT_MODE_CONFIG==0
  76.         RCC->APB2ENR|=1<<2;            //PA时钟使能         
  77.         GPIOA->CRL&=0XFFF0FFFF;         
  78.         GPIOA->CRL|=3<<4*4;                //PA4推挽输出
  79.         ES_CTRL=1;                                //PA4输出高
  80. #endif
  81.         USART2_Init(115200);        //初始化串口2        
  82. }
  83. //usmart支持部分
  84. //将收到的AT指令应答数据返回给电脑串口
  85. //mode:0,不清零USART2_RX_STA;
  86. //     1,清零USART2_RX_STA;
  87. void atk_rm04_at_response(u8 mode)
  88. {
  89.         if(USART2_RX_STA&0X8000)                //接收到一次数据了
  90.         {
  91.                 USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
  92.                 printf("%s",USART2_RX_BUF);        //发送到串口
  93.                 if(mode)USART2_RX_STA=0;
  94.         }
  95. }
  96. //ATK-RM04发送命令后,检测接收到的应答
  97. //str:期待的应答结果
  98. //返回值:0,没有得到期待的应答结果
  99. //    其他,期待应答结果的位置(str的位置)
  100. u8* atk_rm04_check_cmd(u8 *str)
  101. {
  102.       
  103.         char *strx=0;
  104.         if(USART2_RX_STA&0X8000)                //接收到一次数据了
  105.         {
  106.                 USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
  107.                 strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
  108.         }
  109.         return (u8*)strx;
  110. }
  111. //向ATK-RM04发送命令
  112. //cmd:发送的命令字符串(不需要添加回车了)
  113. //ack:期待的应答结果,如果为空,则表示不需要等待应答
  114. //waittime:等待时间(单位:10ms)
  115. //返回值:0,发送成功(得到了期待的应答结果)
  116. //       1,发送失败
  117. u8 atk_rm04_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
  118. {
  119.         u8 res=0;
  120.         USART2_RX_STA=0;
  121.         u2_printf("%s\r",cmd);        //发送命令
  122.         if(ack&&waittime)                //需要等待应答
  123.         {
  124.                 while(--waittime)        //等待倒计时
  125.                 {
  126.                         delay_ms(10);
  127.                         if(USART2_RX_STA&0X8000)//接收到期待的应答结果
  128.                         {
  129.                                 if(atk_rm04_check_cmd(ack))break;//得到有效数据
  130.                                 USART2_RX_STA=0;
  131.                         }
  132.                 }
  133.                 if(waittime==0)res=1;
  134.         }
  135.         return res;
  136. }
  137. //ATK-RM04退出透传模式
  138. //返回值:0,退出成功;
  139. //       1,退出失败
  140. u8 atk_rm04_quit_trans(void)
  141. {
  142. #if AT_MODE_CONFIG==1        //使用串口特殊序列退出透传,进入AT模式
  143.         while(DMA1_Channel7->CNDTR!=0);        //等待通道7传输完成   
  144.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  145.         while((USART2->SR&0X40)==0);        //等待发送空
  146.         USART2->DR='+';      
  147.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  148.         while((USART2->SR&0X40)==0);        //等待发送空
  149.         USART2->DR='+';      
  150.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  151.         while((USART2->SR&0X40)==0);        //等待发送空
  152.         USART2->DR='+';      
  153.         delay_ms(500);                                        //等待500ms
  154.         while((USART2->SR&0X40)==0);        //等待发送空
  155.         USART2->DR=0X1B;      
  156.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  157.         while((USART2->SR&0X40)==0);        //等待发送空
  158.         USART2->DR=0X1B;      
  159.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  160.         while((USART2->SR&0X40)==0);        //等待发送空
  161.         USART2->DR=0X1B;      
  162.         delay_ms(15);                                        //大于串口组帧时间(10ms)
  163.         return atk_rm04_send_cmd("at","at",20);//退出透传判断.
  164. #else                                        //使用ES/RST引脚控制,退出透传,进入AT模式
  165.         ES_CTRL=0;                        //拉低ES/RST
  166.         delay_ms(120);                //等待120ms
  167.         ES_CTRL=1;                        //ES/RST恢复
  168.         return 0;
  169. #endif
  170. }
  171. //获取ATK-RM04模块的连接状态
  172. //返回值:0,未连接;1,连接成功.
  173. u8 atk_rm04_consta_check(void)
  174. {
  175.         u8 *p;
  176.         u8 res;
  177.         if(atk_rm04_quit_trans())return 0;                        //退出透传
  178.         atk_rm04_send_cmd("at+S2N_Stat=?","?",50);        //发送at+S2N_Stat=?指令,查询连接状态
  179.         p=atk_rm04_check_cmd("\r\n");
  180.         res=*(p+2);                                                                        //得到连接状态      
  181.         atk_rm04_send_cmd("at+out_trans=0","ok",50);//发送at+out_trans=0,进入透传模式
  182.         return res;
  183. }
  184. //键盘码表
  185. const u8* kbd_tbl[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
  186. u8* kbd_fn_tbl[2];
  187. //加载键盘界面(尺寸为240*140)
  188. //x,y:界面起始坐标(320*240分辨率的时候,x必须为0)
  189. void atk_rm04_load_keyboard(u16 x,u16 y)
  190. {
  191.         u16 i;
  192.         POINT_COLOR=RED;
  193.         LCD_Fill(x,y,x+240,y+140,WHITE);
  194.         LCD_DrawRectangle(x,y,x+240,y+140);                                                  
  195.         LCD_DrawRectangle(x+80,y,x+160,y+140);         
  196.         LCD_DrawRectangle(x,y+28,x+240,y+56);
  197.         LCD_DrawRectangle(x,y+84,x+240,y+112);
  198.         POINT_COLOR=BLUE;
  199.         for(i=0;i<15;i++)
  200.         {
  201.                 if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl,16,80);
  202.                 else Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80);
  203.         }                                                            
  204. }
复制代码

全部资料51hei下载地址:
AT指令集018.zip (619.52 KB, 下载次数: 15)
ATK-RM04 WIFI模块测试实验.7z (716.41 KB, 下载次数: 21)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表