7071|3

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机控制GPRS模块MC52I收短信问题 [复制链接]

我在调试单片机控制GPRS模块MC52I收短信程序时,出现这样的问题:GPRS模块上电后,给模块发短信,第一条短信读不了,再给模块发短信时,可以读取短信的时间及内容,之后每给模块发短信,读取的都是第二条短信的时间及内容,如给GPRS模块发短信通过超级终端可以看到AT+CMGR=2 891683108200705F0040D91683145251245F100002130914154052303ED,液晶显示上是这条短信的显示内容,再次给模块发短信,通过超级终端还是看到AT+CMGR=3  891683108200705F0040D91683145251245F100002130914154052303ED,内容还是上一条短信的内容,液晶显示也是这条,不知道到底是什么原因,求高手指点!

收短信的AT指令如下:

来短信:+CMTI: "MT",3

读短信:at+cmgr=3


+CMGR: 0,,25

0891683108200705F0040D91683145252284F700002130915142422305B6DA4D8603

 

OK

部分程序:

比较:

 case '+':    //+
   if(0x43==buf[1] &&0x4D==buf[2] && 0x54==buf[3]&& 0x49==buf[4])  //+CMTI 接收短信  

 {
    flag_sms_rec=1;  //置标志位
    flag_cmgf[0]=buf[12];     //提取短信索引号

    flag_cmgf[1]=buf[13];
    flag_cmgf[2]=buf[14];
   }

   if(0x43==buf[1] && 0x4D==buf[2]&& 0x47==buf[3]&& 0x52==buf[4]&& 0x3A==buf[5])  //+CMGR:
    flag_sms_rec=20;   //置标志位

case 'O':    //O
   if(0x4B==buf[1])
    flag_at=1;       //返回OK的标志位
   break;

模块初始化:INT8U i;
 INT8U buf_send[30];  //全局变量修改为局部变量

    strcpy(buf_send,"AT+CFUN=1\r\n");
 Send_String(buf_send);

 delays(2000);
    while(1!=flag_at)
 {
  delays(1);
 }
 flag_at=0;

 delays(100);
 
    strcpy(buf_send,"AT+COPS=0\r\n");
 Send_String(buf_send);
 
 delays(2000);
 while(1!=flag_at)
 {
  delays(1);
 }
 flag_at=0;
 delays(100);

 strcpy(buf_send,"AT+CNMI=2,1,0,0,1\r\n");
 Send_String(buf_send);

 delays(2000);
 while(1!=flag_at)
 {
  delays(1);
 }
 flag_at=0;
 delays(100);

 strcpy(buf_send,"AT+CLIP=1\r\n");
 Send_String(buf_send);

 delays(2000);
 while(1!=flag_at)
 {
  delays(1);
 }
 flag_at=0;
 delays(100);

 strcpy(buf_send,"AT+CMGF=0\r\n");
 Send_String(buf_send);

 delays(2000);
 while(1!=flag_at)
 {
  delays(1);
 }
 flag_at=0;
 delays(100);

 for(i=0x31;i<0x34;i++)
 {
  Send_String("AT+CMGD=");
  Send_Byte(i);
  Send_String("\r\n");
  delays(2000);
  while(1!=flag_at)
 {
  delays(1);
 }
  flag_at=0;
  delays(100);
 }
来短信:

if(1==flag_sms_rec)            //新信息
        {
            Disp_SMS_Rec();Send_String("AT\r\n");
   Send_String("AT+CMGR=");
         key=flag_cmgf[0];
   Send_Byte(key);
   if(flag_cmgf[1]!=0x0D)
   {
    Send_Byte(flag_cmgf[1]);
    if(flag_cmgf[2]!=0x0D)
     Send_Byte(flag_cmgf[2]);
   }
   Send_Byte(0x0D);Send_Byte(0x0A);
   delays(1000);en_disp16(6,48,ansii[0x10]); 
            SMS_Rec();en_disp16(6,48,ansii[0x11]);
            delays(100);
   flag_sms_rec=3;
        }

将收到的短信内容复制到sms_buf[120]中:

if(20==flag_sms_rec)
 {
  SMS_BufCopy();
  flag_sms_rec=2;
 }

 

void SMS_BufCopy(void)
{
 INT8U i=0;sms_buf[120]=0; 
 do
 {
  sms_buf=buf;
  buf=0x0;
  i++;
 }while(i<120);
}

将收到的短信内容解码:

void SMS_Rec(void)
{
 INT8U i,j,start,length,sms_type;
 //08 91683108200704F0 040D 91683115278548F7 0000 21205161058123 0A804D2F623A6D288212
 j=0;
 for(i=0;i<60;i++)
 Send_Byte(sms_buf);
 start=sms_buf[1]-0x30;   //信息中心号码长度
 start=(start+3)*2;   //用户号码91683115278548F7
 length=sms_buf[start-1];  //用户号码长度0D
 if(length>='0' && length<='9')
  length=length-0x30;
 if(length>='A' && length<='Z')
  length=length-0x34;
 for(i=start;i<(start+length);i++) //保存接收短信号码,首地址为号码长度
 {
  sms_tel[j++]=sms_buf;
 }
 length_tel=j;
 change(sms_tel,length_tel);
 
//  for(i=0;i<j;i++)
// {
//  Send_Byte(sms_tel);
//    }
     
 start=start+length+3;
 sms_type=sms_buf[start++];   //保存接收短信内容编码格式,8对应UCS2,4对应8bit,0对应7bit

 j=0;          //保存接收短信时间21205161058123 
 for(i=start;i<(start+14);i++)
 {
  sms_time[j++]=sms_buf;
 }
 change(sms_time,0x0E);        

 j=0;          //保存接收短信内容
 start=start+14;      
 length=(sms_buf[start]-0x30)*0x10; //接收短信内容长度0A    
           
 if(sms_buf[start+1]>='0' && sms_buf[start+1]<='9')
  length=length+(sms_buf[++start]-0x30);
 if(sms_buf[start+1]>='A' && sms_buf[start+1]<='Z')
  length=length+(sms_buf[++start]-0x37);

 if('0'==sms_type)     //编码格式为8bit和UCS2时,长度无调整
 {
  length=length-length/8;
 }

 length=length*2;

 for(i=start+1;i<=(start+length);i++)
 {
  sms_text[j++]=sms_buf;
 }
 length_text=j;
 if('0'==sms_type)
 {
  length_text=Decode_bit(sms_text,length_text);
 }
 if('8'==sms_type)
 {
  length_text+=0x80;
 }
}

之所以贴的这么详细,是希望大家帮忙多分析下,我的程序的打电话、接电话、发短信都实现了,就只是收短信出现问题了,调试了好几天也没进展。。。。。

 

此帖出自单片机论坛

最新回复

楼主,你好,最近我也在使用GPRS模块,可以交流下嘛????QQ:1126163471  详情 回复 发表于 2012-5-7 19:34
点赞 关注
 

回复
举报

1万

帖子

139

TA的资源

版主

沙发
 
建议你仔细阅读理解GPRS模块的手册和AT指令集,先要保证模块的配置正确,然后检查相关指令,可以先在PC平台上用超级终端或串口调试助手输入AT指令,然后仔细分析回应,这有助于理解AT指令。
掌握正确的方法远比你贴出代码让人帮着查错有价值得多。
此帖出自单片机论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
嗯,说的有道理,谢谢!
此帖出自单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 楼主 xialitian 的帖子

楼主,你好,最近我也在使用GPRS模块,可以交流下嘛????QQ:1126163471
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表