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:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "lcd.h"
- #include "key.h"
- #include "usmart.h"
- #include "malloc.h"
- #include "MMC_SD.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "fontupd.h"
- #include "text.h"
- #include "common.h"
- #include "touch.h"
- #include "usart2.h"
- //ALIENTEK Mini STM32开发板扩展实验15
- //ATK-RM04 WIFI模块测试实验
- //广州市星翼电子科技有限公司
- int main(void)
- {
- u8 key,fontok=0;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为9600
- LCD_Init(); //初始化液晶
- LED_Init(); //LED初始化
- KEY_Init(); //按键初始化
- tp_dev.init(); //触摸屏初始化
- mem_init(); //初始化内存池
- exfuns_init(); //为fatfs相关变量申请内存
- f_mount(fs[0],"0:",1); //挂载SD卡
- f_mount(fs[1],"1:",1); //挂载FLASH.
- key=KEY_Scan(0);
- if(key==KEY0_PRES) //强制校准
- {
- LCD_Clear(WHITE); //清屏
- tp_dev.adjust(); //屏幕校准
- LCD_Clear(WHITE); //清屏
- }
- fontok=font_init(); //检查字库是否OK
- if(fontok||key==KEY1_PRES)//需要更新字库(字库不存在/KEY1按下)
- {
- LCD_Clear(WHITE); //清屏
- POINT_COLOR=RED; //设置字体为红色
- LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
- while(SD_Initialize()) //检测SD卡
- {
- LCD_ShowString(60,70,200,16,16,"SD Card Failed!");
- delay_ms(200);
- LCD_Fill(60,70,200+60,70+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(60,70,200,16,16,"SD Card OK");
- LCD_ShowString(60,90,200,16,16,"Font Updating...");
- key=update_font(20,110,16);//更新字库
- while(key)//更新失败
- {
- LCD_ShowString(60,110,200,16,16,"Font Update Failed!");
- delay_ms(200);
- LCD_Fill(20,110,200+20,110+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(60,110,200,16,16,"Font Update Success!");
- delay_ms(1500);
- LCD_Clear(WHITE);//清屏
- }
- atk_rm04_init(); //初始化RM04模块
- atk_rm04_test(); //进入RM04测试
- }
- common.c:
- #include "common.h"
- void atk_rm04_init(void)
- {
- #if AT_MODE_CONFIG==0
- RCC->APB2ENR|=1<<2; //PA时钟使能
- GPIOA->CRL&=0XFFF0FFFF;
- GPIOA->CRL|=3<<4*4; //PA4推挽输出
- ES_CTRL=1; //PA4输出高
- #endif
- USART2_Init(115200); //初始化串口2
- }
- //usmart支持部分
- //将收到的AT指令应答数据返回给电脑串口
- //mode:0,不清零USART2_RX_STA;
- // 1,清零USART2_RX_STA;
- void atk_rm04_at_response(u8 mode)
- {
- if(USART2_RX_STA&0X8000) //接收到一次数据了
- {
- USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
- printf("%s",USART2_RX_BUF); //发送到串口
- if(mode)USART2_RX_STA=0;
- }
- }
- //ATK-RM04发送命令后,检测接收到的应答
- //str:期待的应答结果
- //返回值:0,没有得到期待的应答结果
- // 其他,期待应答结果的位置(str的位置)
- u8* atk_rm04_check_cmd(u8 *str)
- {
-
- char *strx=0;
- if(USART2_RX_STA&0X8000) //接收到一次数据了
- {
- USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
- strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
- }
- return (u8*)strx;
- }
- //向ATK-RM04发送命令
- //cmd:发送的命令字符串(不需要添加回车了)
- //ack:期待的应答结果,如果为空,则表示不需要等待应答
- //waittime:等待时间(单位:10ms)
- //返回值:0,发送成功(得到了期待的应答结果)
- // 1,发送失败
- u8 atk_rm04_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
- {
- u8 res=0;
- USART2_RX_STA=0;
- u2_printf("%s\r",cmd); //发送命令
- if(ack&&waittime) //需要等待应答
- {
- while(--waittime) //等待倒计时
- {
- delay_ms(10);
- if(USART2_RX_STA&0X8000)//接收到期待的应答结果
- {
- if(atk_rm04_check_cmd(ack))break;//得到有效数据
- USART2_RX_STA=0;
- }
- }
- if(waittime==0)res=1;
- }
- return res;
- }
- //ATK-RM04退出透传模式
- //返回值:0,退出成功;
- // 1,退出失败
- u8 atk_rm04_quit_trans(void)
- {
- #if AT_MODE_CONFIG==1 //使用串口特殊序列退出透传,进入AT模式
- while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR='+';
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR='+';
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR='+';
- delay_ms(500); //等待500ms
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR=0X1B;
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR=0X1B;
- delay_ms(15); //大于串口组帧时间(10ms)
- while((USART2->SR&0X40)==0); //等待发送空
- USART2->DR=0X1B;
- delay_ms(15); //大于串口组帧时间(10ms)
- return atk_rm04_send_cmd("at","at",20);//退出透传判断.
- #else //使用ES/RST引脚控制,退出透传,进入AT模式
- ES_CTRL=0; //拉低ES/RST
- delay_ms(120); //等待120ms
- ES_CTRL=1; //ES/RST恢复
- return 0;
- #endif
- }
- //获取ATK-RM04模块的连接状态
- //返回值:0,未连接;1,连接成功.
- u8 atk_rm04_consta_check(void)
- {
- u8 *p;
- u8 res;
- if(atk_rm04_quit_trans())return 0; //退出透传
- atk_rm04_send_cmd("at+S2N_Stat=?","?",50); //发送at+S2N_Stat=?指令,查询连接状态
- p=atk_rm04_check_cmd("\r\n");
- res=*(p+2); //得到连接状态
- atk_rm04_send_cmd("at+out_trans=0","ok",50);//发送at+out_trans=0,进入透传模式
- return res;
- }
- //键盘码表
- const u8* kbd_tbl[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
- u8* kbd_fn_tbl[2];
- //加载键盘界面(尺寸为240*140)
- //x,y:界面起始坐标(320*240分辨率的时候,x必须为0)
- void atk_rm04_load_keyboard(u16 x,u16 y)
- {
- u16 i;
- POINT_COLOR=RED;
- LCD_Fill(x,y,x+240,y+140,WHITE);
- LCD_DrawRectangle(x,y,x+240,y+140);
- LCD_DrawRectangle(x+80,y,x+160,y+140);
- LCD_DrawRectangle(x,y+28,x+240,y+56);
- LCD_DrawRectangle(x,y+84,x+240,y+112);
- POINT_COLOR=BLUE;
- for(i=0;i<15;i++)
- {
- if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl,16,80);
- else Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80);
- }
- }
复制代码
全部资料51hei下载地址:
AT指令集018.zip
(619.52 KB, 下载次数: 15)
ATK-RM04 WIFI模块测试实验.7z
(716.41 KB, 下载次数: 21)
|