查看: 4120|回复: 10

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

[复制链接]
  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
    发表于 2015-10-3 16:16:09 | 显示全部楼层 |阅读模式

    一,在处理前要先对短信接收与发送的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. }
    复制代码
    以上两个函数是读到短信内容及短信内容和电号码的读取,并对指定号码回复短信
    下面再赋短信发送的处理
    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.         }
    复制代码
    短信发送相对简单些,只要连续做AT指令的发送就可以实现 ,最后只要知道是发送成功还是失败就可以了,

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

    硬件连接图: GSM-连接图.jpg
    软件效果图:
    123.png

    源代码:
    Demo_Uart_GSM.zip (953.14 KB, 下载次数: 5)
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-4-28 12:41
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    280

    帖子

    0

    高级会员

    Rank: 4

    积分
    802
    最后登录
    2021-9-5
    发表于 2015-10-3 16:32:01 | 显示全部楼层
    不错,值得学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-20 20:56
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    449

    帖子

    0

    高级会员

    Rank: 4

    积分
    984
    最后登录
    2018-9-20
    发表于 2015-10-3 18:20:55 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-3-12 12:14
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    7

    主题

    556

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1601
    最后登录
    2017-3-12
    发表于 2015-10-3 19:37:38 | 显示全部楼层
    好强大
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16715
    最后登录
    1970-1-1
    发表于 2015-10-3 20:02:51 | 显示全部楼层
    本帖最后由 lkl0305 于 2015-10-3 20:07 编辑

    不错,学习了


    00000.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2015-10-3 20:08:07 | 显示全部楼层
    不错啊,调试sim9000A费短信费
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-4 11:23
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    235

    帖子

    0

    高级会员

    Rank: 4

    积分
    598
    最后登录
    2016-12-12
    发表于 2015-10-4 10:32:32 | 显示全部楼层
    不错,可以做手机了
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-10-4 21:31:52 | 显示全部楼层
    有意思,关键是先要有一块GSM模块
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    443

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1120
    最后登录
    2016-9-23
    发表于 2015-10-4 22:22:02 | 显示全部楼层

    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-10-9 15:46:31 | 显示全部楼层
    不错,谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-29 05:02 , Processed in 0.106617 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表