嵌入式软件设计第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的使用有了更进一步的了解。老师一直在很用心的教我们,没有一点的保留的教我们。当我们遇到不懂的时候耐心给我们讲解。老师教我们在实验中发现问题的时候,要自己多动脑,多独立思考,最终解决问题。才能加深对知识的理解,达到“双赢”的效果。老师的话说完,让我受益匪浅,对老师心生尊敬。

posted @ 2017-04-06 09:59  bgd140201229  阅读(189)  评论(0编辑  收藏  举报