我在调试单片机控制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; } }
之所以贴的这么详细,是希望大家帮忙多分析下,我的程序的打电话、接电话、发短信都实现了,就只是收短信出现问题了,调试了好几天也没进展。。。。。
|