一,在处理前要先对短信接收与发送的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);
- }
复制代码以上两个函数是读到短信内容及短信内容和电号码的读取,并对指定号码回复短信 下面再赋短信发送的处理 - /*
- 发送字符串
- */
- 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);
-
- }
复制代码 短信发送相对简单些,只要连续做AT指令的发送就可以实现 ,最后只要知道是发送成功还是失败就可以了,
注明: AT指令的接收采用的是自动接收,放在一个指令的数组 at_buff2中,如果想知道都收到什么内容,只要对at_buff2数据进行查询
硬件连接图:
软件效果图:
源代码:
Demo_Uart_GSM.zip
(953.14 KB, 下载次数: 5)
|