一,在处理前要先对短信接收与发送的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);
}
|