标题:
ATK-RM04 WIFI模块程序
[打印本页]
作者:
aaaaaa。
时间:
2019-7-30 14:38
标题:
ATK-RM04 WIFI模块程序
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)
2019-7-30 14:37 上传
点击文件名下载附件
下载积分: 黑币 -5
ATK-RM04 WIFI模块测试实验.7z
(716.41 KB, 下载次数: 21)
2019-7-30 20:51 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1