打印
[资料分享与下载]

LY_KL26Z板学习之GSM短信的接收与回复

[复制链接]
769|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
芙蓉洞|  楼主 | 2015-10-10 07:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一,在处理前要先对短信接收与发送的AT指令有所了解

   GSM模块接收到内容会自动 存到SIM卡上,并做相应的提示,这里我只做连续读取SIM卡上的短信

格式为 AT+CMGR=1到AT+CMGR=10 ,只读前10条短信,暂时只处理英文短信,短信格式为

   +CMGR: "REC UNREAD","1252015000298662","","15/10/03,15:53:49+32"

     13124214
根据以上格式,可以找到对方号码 短信内容及发送日期,

赋一段代码:
/*
        短信内容分析
        +CMGR: "REC READ","1069032505055671328","","2014/11/15 10:22:32+32"
4E164E0A67096211966A77404F60FF0C4E0D752872EC575073A9624B673AFF0C0031003051438F665238592A7ED9529BFF0C5C3150CF59294E0A63899985997C30024E0B8F7D6EF46EF400200068007400740070003A002F002F0074002E0063006E002F00520050005900450056006C0057002090008BA256DE590D0054004430106EF46EF462538F663011

        第一步,找到 +CMGR字头
        第二步,找到下一个关键字 READ","
        第三步,以第二步的内容向后移到“后面就是对方号码,处理到”后结束
        第四步,以第三步移到的位置向后跳过两个“ 后,再向后找到第一个“为日期的启点,读到”结束
        第五步,以第四步移到的位置再向后移动两次,之后都是短信内容以0x0d为结束
        
*/
INT8U CMGR_RD(INT8U *str,INT8U *str_tel,INT8U *str_code)
{   INT16U i,j;
          //INT8U  r;
            
          //得到的内容是当前字符串在数组里的位置+1
    i= strsearch("+CMGR: ",str);
          if(i)
                {   i=i+6;
                           i= strsearch("READ\",",str);
                         if(i)
                         {  i=i+6; j=0;
                                 //----电话号码---------
                                 for( ;i<50;i++)
                            {
                                                if(str[i]=='"')
                                          { i++; break; }
                                                str_tel[j++]=str[i];
                                       
                                        }               
                                 str_tel[j++]=0;
                                        //------------------------
                                        i++;//跳过,号
                                        i++;//跳过“号
                                         for( ;i<60;i++)
                            { if(str[i]=='"')
                                          { i++; break; }
                                        }
                                //--------------------
                                         i++;
                                        if(str[i]=='"')
                                        { i++;
                                                //-----日期,时间-----这里跳过------------
                                                 for( ;i<80;i++)
                            { if(str[i]=='"')
                                          { i++; break; }
                                        }
                            //-----------------
                                         i=i+2;j=0;
                     //----内容-----------------------
                                        for( ;i<250;i++)
                            {
                                                if(str[i]=='"')
                                          { i++; break; }
                                                str_code[j++]=str[i];
                                       
                                        }               
                                  str_code[j++]=0;
                                        //号码对比,不能所有的号码都 要处理
                                         i= strsearch("15000298662",str_tel);
                                         if(i)
                       {
                                                 return (1);
                                         }
                                         else
                                         {  
                                           return (2);
                                         }
                                //-----------------------        
                                        }
                         }
                }
  return (0);
}        
        
        
/*
         GSM 读到一条短信,连读到50个内容,有就做相应的处理
AT+CMGR=1
AT+CMGR=2
如果有内容进行  短信号码及内容还有接收日期的处理
当读到短信 后一定要删除当前短信,要不然会一直读到内容

*/
INT8U gms_sms_read(INT8U *str,INT8U *str_tel,INT8U *str_code)
{
   INT8U t,i;
         INT8U tmp[3];
   //英文短信
   strcpya(str,"AT+CMGF=1\x0d");  com1_send(str);         
        t=1;
         do{   
                     tmp[0]=(t/10)+'0';
                      tmp[1]=(t%10)+'0';
                      tmp[2]=0;//读一条短信
                  strcpya(str,"AT+CMGR=");
                        strcata(str,tmp);
                        strcata(str,"\x0d");
                                          com1_send(str);
                        myDelay(200);        
                //-------调用短信内容对比-----------------
                         i= CMGR_RD(at_buff2,str_tel,str_code);
                      if(i==1)
                                        { //回复一条短信回去 ,TEXT  OK
                                                gms_sms_send(str,str_tel,"TEST OK!");
                                        // 删除已处理的短信
                                                strcpya(str,"AT+CMGD=");  strcata(str,tmp);
                          strcata(str,"\x0d");
                                             com1_send(str);
                                                 return (1);
                                        }        
                                        else if(i==2)//删除这条短信
                                        {  // 删除已没有用的短信
                                            strcpya(str,"AT+CMGD=");
                          strcata(str,tmp);
                          strcata(str,"\x0d");
                                             com1_send(str);
                                        }
                                          myDelay(500);  myDelay(500);
                 
    }while(t++<10);//最大次数
                                         
                                         
return (0);
}


相关帖子

沙发
芙蓉洞|  楼主 | 2015-10-10 07:39 | 只看该作者
以上两个函数是读到短信内容及短信内容和电号码的读取,并对指定号码回复短信
下面再赋短信发送的处理
/*
发送字符串
*/
INT8U com1_send(INT8U *ptr)
{  at_cont2=0;
    while(*ptr)
    {
        uart1SendChar(*ptr);
        if(*ptr==0)
        { break;}
      ptr++;
           }
                  myDelay(10);
                 //等待回复
                  if(at_cont2)//接收到内容标志
                  {  myDelay(20);at_cont2=0;         return(1);
                         }
                                return(0);
}


/*
GSM 短信的发送
AT+CMGF=1
AT+CMGS="13818120592"
12345
等待发送成功
*/
INT8U gms_sms_send(INT8U *start,INT8U *str_tel,INT8U * str_code)
{
          INT8U i,t;

            strcpya(tmp_buff,"AT+CMGF=1\x0d");
                                          i=com1_send(tmp_buff);
          //原型 AT+CMGS="13818120592"
                                          strcpya(tmp_buff,"AT+CMGS=\"");
                                          strcata(tmp_buff,str_tel);
                                          strcata(tmp_buff,"\"\x0d");                                       
                                          i=com1_send(tmp_buff);
                                        //-----内容  TEST-----------------------
                                          strcpya(tmp_buff,str_code);
                  strcata(tmp_buff,"\x1a");                 
                                           i=com1_send(tmp_buff);
                  for(t=0;t<200;t++)
                                        {          myDelay(100);
                                           i= strsearch("+CMGS: ",at_buff2);
                                             if(i)
                                                         {return (1);
                                                 }                 
                                        }
                                        return (0);
                                          
        }

使用特权

评论回复
板凳
芙蓉洞|  楼主 | 2015-10-10 07:39 | 只看该作者
短信发送相对简单些,只要连续做AT指令的发送就可以实现 ,最后只要知道是发送成功还是失败就可以了,

注明: AT指令的接收采用的是自动接收,放在一个指令的数组 at_buff2中,如果想知道都收到什么内容,只要对at_buff2数据进行查询

硬件连接图:
软件效果图:


使用特权

评论回复
地板
芙蓉洞|  楼主 | 2015-10-10 07:40 | 只看该作者
把代码放到这里

Demo_Uart_GSM.zip

953.14 KB

使用特权

评论回复
5
FSL_TICS_Jeremy| | 2015-10-12 08:22 | 只看该作者
谢谢;楼主分享!!:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

398

帖子

3

粉丝