[资料分享与下载] LY_KL26Z板学习之GSM短信的接收与回复

[复制链接]
 楼主| 芙蓉洞 发表于 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
根据以上格式,可以找到对方号码 短信内容及发送日期,

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

  5.         第一步,找到 +CMGR字头
  6.         第二步,找到下一个关键字 READ","
  7.         第三步,以第二步的内容向后移到“后面就是对方号码,处理到”后结束
  8.         第四步,以第三步移到的位置向后跳过两个“ 后,再向后找到第一个“为日期的启点,读到”结束
  9.         第五步,以第四步移到的位置再向后移动两次,之后都是短信内容以0x0d为结束
  10.         
  11. */
  12. INT8U CMGR_RD(INT8U *str,INT8U *str_tel,INT8U *str_code)
  13. {   INT16U i,j;
  14.           //INT8U  r;
  15.             
  16.           //得到的内容是当前字符串在数组里的位置+1
  17.     i= strsearch("+CMGR: ",str);
  18.           if(i)
  19.                 {   i=i+6;
  20.                            i= strsearch("READ",",str);
  21.                          if(i)
  22.                          {  i=i+6; j=0;
  23.                                  //----电话号码---------
  24.                                  for( ;i<50;i++)
  25.                             {
  26.                                                 if(str[i]=='"')
  27.                                           { i++; break; }
  28.                                                 str_tel[j++]=str[i];
  29.                                        
  30.                                         }               
  31.                                  str_tel[j++]=0;
  32.                                         //------------------------
  33.                                         i++;//跳过,号
  34.                                         i++;//跳过“号
  35.                                          for( ;i<60;i++)
  36.                             { if(str[i]=='"')
  37.                                           { i++; break; }
  38.                                         }
  39.                                 //--------------------
  40.                                          i++;
  41.                                         if(str[i]=='"')
  42.                                         { i++;
  43.                                                 //-----日期,时间-----这里跳过------------
  44.                                                  for( ;i<80;i++)
  45.                             { if(str[i]=='"')
  46.                                           { i++; break; }
  47.                                         }
  48.                             //-----------------
  49.                                          i=i+2;j=0;
  50.                      //----内容-----------------------
  51.                                         for( ;i<250;i++)
  52.                             {
  53.                                                 if(str[i]=='"')
  54.                                           { i++; break; }
  55.                                                 str_code[j++]=str[i];
  56.                                        
  57.                                         }               
  58.                                   str_code[j++]=0;
  59.                                         //号码对比,不能所有的号码都 要处理
  60.                                          i= strsearch("15000298662",str_tel);
  61.                                          if(i)
  62.                        {
  63.                                                  return (1);
  64.                                          }
  65.                                          else
  66.                                          {  
  67.                                            return (2);
  68.                                          }
  69.                                 //-----------------------        
  70.                                         }
  71.                          }
  72.                 }
  73.   return (0);
  74. }        
  75.         
  76.         
  77. /*
  78.          GSM 读到一条短信,连读到50个内容,有就做相应的处理
  79. AT+CMGR=1
  80. AT+CMGR=2
  81. 如果有内容进行  短信号码及内容还有接收日期的处理
  82. 当读到短信 后一定要删除当前短信,要不然会一直读到内容

  83. */
  84. INT8U gms_sms_read(INT8U *str,INT8U *str_tel,INT8U *str_code)
  85. {
  86.    INT8U t,i;
  87.          INT8U tmp[3];
  88.    //英文短信
  89.    strcpya(str,"AT+CMGF=1\x0d");  com1_send(str);         
  90.         t=1;
  91.          do{   
  92.                      tmp[0]=(t/10)+'0';
  93.                       tmp[1]=(t%10)+'0';
  94.                       tmp[2]=0;//读一条短信
  95.                   strcpya(str,"AT+CMGR=");
  96.                         strcata(str,tmp);
  97.                         strcata(str,"\x0d");
  98.                                           com1_send(str);
  99.                         myDelay(200);        
  100.                 //-------调用短信内容对比-----------------
  101.                          i= CMGR_RD(at_buff2,str_tel,str_code);
  102.                       if(i==1)
  103.                                         { //回复一条短信回去 ,TEXT  OK
  104.                                                 gms_sms_send(str,str_tel,"TEST OK!");
  105.                                         // 删除已处理的短信
  106.                                                 strcpya(str,"AT+CMGD=");  strcata(str,tmp);
  107.                           strcata(str,"\x0d");
  108.                                              com1_send(str);
  109.                                                  return (1);
  110.                                         }        
  111.                                         else if(i==2)//删除这条短信
  112.                                         {  // 删除已没有用的短信
  113.                                             strcpya(str,"AT+CMGD=");
  114.                           strcata(str,tmp);
  115.                           strcata(str,"\x0d");
  116.                                              com1_send(str);
  117.                                         }
  118.                                           myDelay(500);  myDelay(500);
  119.                  
  120.     }while(t++<10);//最大次数
  121.                                          
  122.                                          
  123. return (0);
  124. }


 楼主| 芙蓉洞 发表于 2015-10-10 07:39 | 显示全部楼层
以上两个函数是读到短信内容及短信内容和电号码的读取,并对指定号码回复短信
下面再赋短信发送的处理
  1. /*
  2. 发送字符串
  3. */
  4. INT8U com1_send(INT8U *ptr)
  5. {  at_cont2=0;
  6.     while(*ptr)
  7.     {
  8.         uart1SendChar(*ptr);
  9.         if(*ptr==0)
  10.         { break;}
  11.       ptr++;
  12.            }
  13.                   myDelay(10);
  14.                  //等待回复
  15.                   if(at_cont2)//接收到内容标志
  16.                   {  myDelay(20);at_cont2=0;         return(1);
  17.                          }
  18.                                 return(0);
  19. }


  20. /*
  21. GSM 短信的发送
  22. AT+CMGF=1
  23. AT+CMGS="13818120592"
  24. 12345
  25. 等待发送成功
  26. */
  27. INT8U gms_sms_send(INT8U *start,INT8U *str_tel,INT8U * str_code)
  28. {
  29.           INT8U i,t;

  30.             strcpya(tmp_buff,"AT+CMGF=1\x0d");
  31.                                           i=com1_send(tmp_buff);
  32.           //原型 AT+CMGS="13818120592"
  33.                                           strcpya(tmp_buff,"AT+CMGS="");
  34.                                           strcata(tmp_buff,str_tel);
  35.                                           strcata(tmp_buff,""\x0d");                                       
  36.                                           i=com1_send(tmp_buff);
  37.                                         //-----内容  TEST-----------------------
  38.                                           strcpya(tmp_buff,str_code);
  39.                   strcata(tmp_buff,"\x1a");                 
  40.                                            i=com1_send(tmp_buff);
  41.                   for(t=0;t<200;t++)
  42.                                         {          myDelay(100);
  43.                                            i= strsearch("+CMGS: ",at_buff2);
  44.                                              if(i)
  45.                                                          {return (1);
  46.                                                  }                 
  47.                                         }
  48.                                         return (0);
  49.                                           
  50.         }
 楼主| 芙蓉洞 发表于 2015-10-10 07:39 | 显示全部楼层
短信发送相对简单些,只要连续做AT指令的发送就可以实现 ,最后只要知道是发送成功还是失败就可以了,

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

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


 楼主| 芙蓉洞 发表于 2015-10-10 07:40 | 显示全部楼层
把代码放到这里

Demo_Uart_GSM.zip

953.14 KB, 下载次数: 2

FSL_TICS_Jeremy 发表于 2015-10-12 08:22 | 显示全部楼层
谢谢;楼主分享!!:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

398

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

42

主题

398

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部