嵌入式软件设计第11次实验报告
学号:140201229 姓名:何丹
组别:第4组 实验地点:D19
一、实验目的:
1、了解短信AT指令的使用方法。
2、掌握使用短信AT指令驱动SIM900A发送和接收短信的方法。
二、实验内容:
1.使用AT命令进行模块测试,发送和接收短信。
2.编写程序利用触摸屏完成固定号码短信的发送和接收。(需要加上AT测试命令模块、手机SIM卡检测模块、手机信号质量检测模块等等。)
三、实验过程描述及结果展示:
设备:移动SIM卡,充电器,SIM900A板子,连接线,耳机
(一)硬件处理过程
1、用串口连接STM32_MODE与SIM900A,并将SIM卡装进SIM900A卡套里。
2、连接电源。供电后长按开机按钮,使电话开机。
3、将USART1跳线棒和USART3跳线棒拔掉,用跳线将COM3TX(发送)与COM1RXD(接收),COM1RX(发送)与 COM3TXD(接收)相连接。
(二)测试处理过程:AT命令_拨打电话
1测试本机是否可用(AT+CPIN?)
2测试本机是否有信号(AT+CSQ)
3发送与接收短信
发送短信:
接收短信:
(三)实验处理过程:
按下图进行设计,并实现功能:
主函数部分:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "touch.h"
#include "text.h"
#include "w25qxx.h"
#include "malloc.h"
#include "ff.h"
#include "exfuns.h"
#include <string.h>
const u16 POINT_COLOR_TBL[OTT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
extern u16 USART3_RX_STA;
extern u8 USART3_RX_BUF[400];
unsigned char cnt=0;
unsigned char *SMS=0;
u8 SMS_string[11]={"AT+CMGR="};
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);
//串口3发送数据示例代码
// USART_SendData(USART3,send_string[i]);
// while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
//串口3接收数据示例代码
// while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
// receive_string[i] = (USART_ReceiveData(USART3));
int main(void)
{
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
uart3_init(115200);
LED_Init(); //初始化LED
LCD_Init(); //LCD初始化
tp_dev.init(); //触摸屏初始化
LCD_Clear(BLACK);
POINT_COLOR=YELLOW;//设置字体为黄色
BACK_COLOR = BLACK;
//初始化SIM900A
//发AT测试命令
//设置短信的新消息提示AT+CNMI=2,1
{
unsigned char temp;
unsigned char send_string0[] = {"AT+CNMI=2,1\x0d\x0a"};
unsigned char send_string1[] = {"AT+CMGF=1\r\n"};
unsigned char send_string2[] = {"AT+CSCS=\"GMS\"\r\n"};
for(temp=0;temp<2;temp++)
{
USART_SendData(USART3,'A');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
USART_SendData(USART3,'T');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
USART_SendData(USART3,0x0d);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
USART_SendData(USART3,0x0a);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
}
delay_ms(100);
for(temp=0;temp<13;temp++)//发送AT命令"AT+CNMI=2,1\x0d\x0a"
{
USART_SendData(USART3,send_string0[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
}
delay_ms(100);
for(temp=0;temp<11;temp++)//发送AT命"AT+CMGF=1\r\n"
{
USART_SendData(USART3,send_string1[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
}
delay_ms(100);
for(temp=0;temp<15;temp++)//发送AT命"AT+CSCS=\"GMS\"\r\n"
{
USART_SendData(USART3,send_string2[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
}
delay_ms(100);
}
USART3_RX_STA = 0;
//以下代码构建短信发送菜单
{
Show_Str(30,30,200,24,"命令按钮区",24,1);
Show_Str(248,30,200,24,"文本区",24,1);
LCD_DrawRectangle(30,70,174,118);
Show_Str(42,82,200,24,"AT测试按钮",24,1);
LCD_DrawRectangle(248,70,452,118);
LCD_DrawRectangle(30,142,222,190);
Show_Str(42,154,204,24,"卡状态测试按钮",24,1);
LCD_DrawRectangle(248,142,452,190);
LCD_DrawRectangle(30,214,198,262);
Show_Str(42,226,204,24,"信号测试按钮",24,1);
LCD_DrawRectangle(248,214,452,262);
LCD_DrawLine(0,282,479,282);
Show_Str(42,338,204,24,"发送按钮:",24,1);
LCD_DrawRectangle(30,326,162,374);
Show_Str(168,310,204,16,"发送号码",16,1);
LCD_ShowString(256,310,88,16,16,"13051530910");
LCD_DrawRectangle(248,302,452,334);
Show_Str(168,358,204,16,"发送内容",16,1);
LCD_ShowString(256,358,150,16,16,"This is test text!");
LCD_DrawRectangle(248,350,452,382);
LCD_DrawLine(0,402,479,402);
Show_Str(42,458,204,24,"接收按钮:",24,1);
LCD_DrawRectangle(30,446,162,494);
Show_Str(168,430,204,16,"来信号码:",16,1);
LCD_DrawRectangle(248,422,452,454);
Show_Str(168,478,204,16,"提示灯",16,1);
Show_Str(42,510,204,16,"短信内容",16,1);
LCD_DrawRectangle(30,526,452,766);
{
int i;
POINT_COLOR=YELLOW;
for(i=20;i<22;i++)
{
LCD_Draw_Circle(272,486,i);
}
}
}
//以下代码为扫描触摸屏检测按键
while(1)
{
tp_dev.scan(0);
if(tp_dev.x[0]>30 && tp_dev.x[0]<174 && tp_dev.y[0]>70 && tp_dev.y[0]<118)//"AT测试按钮"按键区域
{
u8 i;
u8 send_string[]={"AT\r\n"};
u8 receive_string[20] ={0};
char *p_display;
receive_string[19]='\0';
while(tp_dev.sta & 0x80)//等待触摸屏按键松开
tp_dev.scan(0);
USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失
for(i=0;i<4;i++)
{
USART_SendData(USART3,send_string[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
//清除触摸值
tp_dev.x[0]=0xFFFF;
tp_dev.y[0]=0xFFFF;
}
if(tp_dev.x[0]>30 && tp_dev.x[0]<222 && tp_dev.y[0]>142 && tp_dev.y[0]<190)//"SIM卡状态测试按钮"按键区域
{
u8 i;
u8 send_string[]={"AT+CPIN?\r\n"};
u8 receive_string[32]={0};
u8 *p_display;
receive_string[31]='\0';
while(tp_dev.sta & 0x80)//等待触摸屏按键松开
tp_dev.scan(0);
USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失
for(i=0;i<10;i++)
{
USART_SendData(USART3,send_string[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
//清除触摸值
tp_dev.x[0]=0xFFFF;
tp_dev.y[0]=0xFFFF;
}
if(tp_dev.x[0]>30 && tp_dev.x[0]<198 && tp_dev.y[0]>214 && tp_dev.y[0]<262)//信号状态测试按钮
{
u8 i;
u8 send_string[]="AT+CSQ\r\n";
u8 receive_string[32]={0};
u8 *p_display;
receive_string[31]='\0';
while(tp_dev.sta & 0x80)//等待触摸屏按键松开
tp_dev.scan(0);
USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失
for(i=0;i<8;i++)
{
USART_SendData(USART3,send_string[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
//清除触摸值
tp_dev.x[0]=0xFFFF;
tp_dev.y[0]=0xFFFF;
}
if(tp_dev.x[0]>30 && tp_dev.x[0]<162 && tp_dev.y[0]>326 && tp_dev.y[0]<374)//发送固定短信测试按钮
{
u8 i;
u8 send_string1[]="AT+CMGS=\"13051530910\"\r\n";
u8 send_string2[]={"CHEN YAO AI HE DAN\x1A"};
while(tp_dev.sta & 0x80)//等待触摸屏按键松开
tp_dev.scan(0);
USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失
for(i=0;i<23;i++)
{
USART_SendData(USART3,send_string1[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
delay_ms(100);
for(i=0;i<20;i++)
{
USART_SendData(USART3,send_string2[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
//清除触摸值
tp_dev.x[0]=0xFFFF;
tp_dev.y[0]=0xFFFF;
}
if(tp_dev.x[0]>30 && tp_dev.x[0]<162 && tp_dev.y[0]>446 && tp_dev.y[0]<494)//有短信提示后短信接收按钮
{
u8 i;
u8 send_string[100]={"AT+CMGR="};
u8 data_r_n[]={"\r\n\n"};
u8 *p_display;
while(tp_dev.sta & 0x80)//等待触摸屏按键松开
tp_dev.scan(0);
USART_ClearFlag(USART3,USART_FLAG_TC);//加上此句,串口发送的第一个字节就不会丢失
strcat(send_string,SMS);
strcat(send_string,data_r_n);
for(i=0;i<12;i++)
{
USART_SendData(USART3,send_string[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);//等待发送结束
}
//清除同心圆,表示短信已经阅读
{
int i;
POINT_COLOR=BLACK;
for(i=0;i<20;i++)
{
LCD_Draw_Circle(272,486,i);
}
POINT_COLOR=YELLOW;
}
//清除触摸值
tp_dev.x[0]=0xFFFF;
tp_dev.y[0]=0xFFFF;
}
//以下代码根据串口3收到的信息作出相应的动作
if(USART3_RX_STA & 0x8000)//接收到了一次数据
{
char *p_display;
USART3_RX_BUF[USART3_RX_STA & 0x7FFF] =0;//添加结束符号
if(p_display=strstr((const char *)USART3_RX_BUF,(const char *)"AT\r\n"))//当收到的是反馈时
{
p_display=p_display+6;
LCD_ShowString(260,82,240,24,24,(u8 *)p_display);
}
if(p_display=strstr((const char *)USART3_RX_BUF,(const char *)"AT+CPIN?"))//当收到SIm卡状态查询
{
p_display=p_display+19;
LCD_ShowString(260,154,240,24,24,(u8 *)p_display);
}
if(p_display=strstr((const char *)USART3_RX_BUF,(const char *)"AT+CSQ"))//当收到信号强度测试命令
{
p_display=p_display+10;
LCD_ShowString(260,226,240,24,24,(u8 *)p_display);
}
if(p_display=strstr((const char *)USART3_RX_BUF,(const char *)"+CMTI:"))//当收到新消息提示符
{
p_display=p_display+12;
SMS=p_display;
//画同心圆表示来短信了
{
int i;
POINT_COLOR = RED;
for(i=0;i<20;i++)
{
LCD_Draw_Circle(272,486,i);
}
POINT_COLOR=YELLOW;
}
LCD_ShowString(260,226,240,24,24,(u8 *)p_display);
}
if(p_display = strstr((const char *)USART3_RX_BUF,(const char *)"+32"))//当收到消息正文后
{
p_display=p_display+6;
LCD_ShowString(38,534,320,16,16," ");//用40个空格清除上一条信息
LCD_ShowString(38,534,320,16,16,p_display);
//给出短信号码并在LCD上显示
{
p_display = strstr((const char *)USART3_RX_BUF,(const char *)"+86");
p_display=p_display+3;
LCD_ShowString(256,430,88,16,16," ");//用11个空格清除电话号码
LCD_ShowString(256,430,88,16,16,p_display);
}
}
USART3_RX_STA = 0;
}
}
}
四、总结及实验心得:
通过本次实验我学习到了GSM模块SIM900A的短信AT指令和短信AT指令驱动SIM900A发送和接收短信的方法。
在做实验的时候出现很多问题。首先,主函数部分已经编写好程序后,出现了许多错误。通过前几节课的学习,已经能够处理简单的实验报错处理。但是错误处理完毕之后,还是不能运行。只好找到老师帮忙处理,老师看了我编写的代码后,也觉得没有问题,错误到底是出现在哪里呢?反复排查sim卡信号,以及是否能够成功pin通后,才发现原来是因为sim卡的短信容量满了,导致短信接收与发送都没有反应。排除错误后,才发现自己已经能够成功运行短信AT指令驱动SIM900A发送和接收短信了。
实验做完后总是感觉自己又有了新的突破,感觉自己学习到的东西可以实现这么多功能。有了上次课的积累,进一步熟悉GSM模块SIM900A的使用方法,实现电话的接打。现在又可以实现短信的收发。对GSM模块SIM900A的使用有了更进一步的了解。老师一直在很用心的教我们,没有一点的保留的教我们。当我们遇到不懂的时候耐心给我们讲解。老师教我们在实验中发现问题的时候,要自己多动脑,多独立思考,最终解决问题。才能加深对知识的理解,达到“双赢”的效果。老师的话说完,让我受益匪浅,对老师心生尊敬。