求助:我用AT89S52控制TC35i但是无法读取消息内容
大家好!春节刚过,在此给大家拜个晚年!
本人用AT89S52控制TC35i,通过“AT+CMGR=5<CR>”读取短消息,但是得不到内容(位置5上是存在信息的),就连“+CMGR:”也不返回;好像只返回了2个字符;我的TC35i设置的是Text模式(“AT+CMGF=1<CR>”);程序是用C编的,读取消息时使用的是查询方式(如果用中断方式,结果也是一样),通过“AT+CMGR=5<CR>”。捣鼓了好几天了还是出不来。希望得到大家的帮助,谢谢!!
我的程序清单如下:
// 设置波特率
void setup_t1(void)
{unsigned char j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET1=0;
for(j=0;j<250;j++) xianshi(1,1,1,1);//为了便于观察状态而设置的显示信息
}
// 设置串口
void setup_ck(void)
{unsigned char j;
SCON=0x50;
PCON=0x00;
EA=1;
ES=1;
for(j=0;j<250;j++) xianshi(2,2,2,2); //为了便于观察状态而设置的显示信息
}
//////////////////////////////////////////////////////////////
// 设置为文本格式
// AT指令:AT+CMGF=1<CR>
void setcmgftxt(void)
{unsigned char j,msgtemp,k=0;
ES=0;
SBUF='A';while(!TI); TI=0;
SBUF='T';while(!TI); TI=0;
SBUF='+';while(!TI); TI=0;
SBUF='C';while(!TI); TI=0;
SBUF='M';while(!TI); TI=0;
SBUF='G';while(!TI); TI=0;
SBUF='F';while(!TI); TI=0;
SBUF='=';while(!TI); TI=0;
SBUF='1';while(!TI); TI=0;
SBUF=0x0d;while(!TI);TI=0;
while(1)
{
while(!RI);RI=0;
msgtemp=SBUF;
switch (k)
{
case 0:
k=((msgtemp=='O'||msgtemp=='o')?++k:0);
break;
case 1:
k=((msgtemp=='K'||msgtemp=='k')?++k:0);
break;
case 2:
k++;
break;
case 3:
k++;
break;
}//switch结束
if(k==4)
{
for(j=0;j<250;j++) xianshi(3,3,3,3); //为了便于观察状态而设置的显示信息
break;
}
}
ES=1;
}
////////////////////////////////////////////
void SetCnmi(void)
{
unsigned char data j,k=0,msgtemp;
ES=0;//关串口中断
SBUF='A';while(!TI); TI=0;
SBUF='T';while(!TI); TI=0;
SBUF='+';while(!TI); TI=0;
SBUF='C';while(!TI); TI=0;
SBUF='N';while(!TI); TI=0;
SBUF='M';while(!TI); TI=0;
SBUF='I';while(!TI); TI=0;
SBUF='=';while(!TI); TI=0;
SBUF='1';while(!TI); TI=0;
SBUF=',';while(!TI); TI=0;
SBUF='1';while(!TI); TI=0;
SBUF=',';while(!TI); TI=0;
SBUF='0';while(!TI); TI=0;
SBUF=',';while(!TI); TI=0;
SBUF='0';while(!TI); TI=0;
SBUF=',';while(!TI); TI=0;
SBUF='1';while(!TI); TI=0;
SBUF=0x0d;while(!TI); TI=0;
while(1)
{
while(!RI);RI=0;
msgtemp=SBUF;
switch (k)
{
case 0:
k=((msgtemp=='O'||msgtemp=='o')?++k:0);break;
case 1:
k=((msgtemp=='K'||msgtemp=='k')?++k:0);break;
case 2:
k++;
break;
case 3:
k++;
break;
}//switch结束
if(k==4)
{
for(j=0;j<250;j++) xianshi(4,4,4,4); //为了便于观察状态而设置的显示信息
break;
}
}
ES=1;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 从SIM卡中读取一条短消息
// AT指令:AT+CMGR=1<CR>
void read_msg(unsigned char imsg)
{
unsigned char j,msgtemp;
buffzero(iobuf, 0, IOBUF_SIZE);//缓冲区清0,备接收信息内容
offset = 0;//缓冲区指针清0
type = 1;send=1;//两个标志位,程序的其他部分中有用
ES=0;
for(j=0;j<150;j++) xianshi(1,5,5,1); //为了便于观察状态而设置的显示信息
SBUF='A';while(!TI); TI=0;
SBUF='T';while(!TI); TI=0;
SBUF='+';while(!TI); TI=0;
SBUF='C';while(!TI); TI=0;
SBUF='M';while(!TI); TI=0;
SBUF='G';while(!TI); TI=0;
SBUF='R';while(!TI); TI=0;
SBUF='=';while(!TI); TI=0;
SBUF=imsg;while(!TI); TI=0;
SBUF=0x0d;while(!TI); TI=0;
while(1)
{
while(!RI);RI=0;
msgtemp=SBUF; // 串口在接收字符
if(send==1)
{
switch(type)
{
case 1://接收消息内容
switch(num3)
{
case 1:
num3 = ((msgtemp=='+') ? ++num3 : 1);
for(j=0;j<50;j++) xianshi(num3,num3,8,8);
//调试时在此显示了两次1,1,8,8后程序重新开始,说明读出的字符并不是'+'
break;
case 2:
num3 =((msgtemp=='C') ? ++num3 : 1);
break;
case 3:
num3 = ((msgtemp=='M') ? ++num3 : 1);
break;
case 4:
num3 = ((msgtemp=='G')? ++num3 : 1);
break;
case 5:
num3 = ((msgtemp=='R')? ++num3 : 1);
break;
case 6:
um3 = (input_temp==':' ? ++num3 : 1);
break;
case 7:// 接收到了'+CMGR:'
for(j=0;j<150;j++) xianshi(6,6,7,7);//便于调试时观察所设
if (msgtemp=='%'&&hefaflag==0)
{ for(j=0;j<150;j++) xianshi(7,7,7,7);
//清空iobuf,准备将新消息内容
buffzero2(iobuf, 0, IOBUF_SIZE);
idx_iobuf = -2;//将前3个%中的后2个省略不要
type=2;//跳转到case 2:
}
break;
default:
num3=1;
break;
}//内switch结束
break;
case 2://收到合法消息时,将内容***存入iobuf[0~2]
if(idx_iobuf<0)
idx_iobuf++;
else
iobuf[idx_iobuf++]=msgtemp;//暂不考虑存储出界问题
if(iobuf[3]=='%'&&iobuf[4]=='%')
{for(j=0;j<50;j++) xianshi(iobuf[0],iobuf[1],iobuf[2],6);hefaflag=1;}
break;
}//外switch结束
}//if(send==1)结束
if(hefaflag==1) break;
}//while(1)结束
ES=1;
}
// 主函数
void main(void)
{
unsigned char data j;
delay(1);
// 初始化串口
setup_t1();
setup_ck();
delay(3);
// 设置为文本格式发送/接收短消息
setcmgftxt();
delay(3);
SetCnmi();
read_msg('5');
// 从SIM卡中读取新到短消息 ,并将内容的前3位存于iobuf[0]~[2]中
}
------解决方案--------------------
先写个函数,封装发送数据
比如
void sendc( unsigned char *c ){ SBUF = c; while(!TI); TI=0; }void sends( unsigned char *s, unsigned char len ){ while( len ) { sendc( *s++ ); len--; }}sends( "AT+CMGR=5\r", 10 );
[解决办法]
void getc( void ){ while(!RI); RI=0; return SBUF; }void sendc( unsigned char *c ){ SBUF = c; while(!TI); TI=0; }void sends( unsigned char *s, unsigned char len ){ while( len ) { sendc( *s++ ); len--; }}// 设置波特率 void setup_t1(void) { unsigned char j; TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; ET1=0; for(j=0;j <250;j++) xianshi(1,1,1,1);//为了便于观察状态而设置的显示信息 } // 设置串口 void setup_ck(void) { unsigned char j; SCON=0x50; PCON=0x00; EA=1; ES=1; for(j=0;j <250;j++) xianshi(2,2,2,2); //为了便于观察状态而设置的显示信息 } ////////////////////////////////////////////////////////////// // 设置为文本格式 // AT指令:AT+CMGF=1 <CR> void setcmgftxt(void) { unsigned char j,msgtemp,k=0; ES=0; sends( "AT+CMGF=1\r", 10 ); while(1) { msgtemp=getc(); switch (k) { case 0: k=((msgtemp=='O' | |msgtemp=='o')?++k:0); break; case 1: k=((msgtemp=='K' | |msgtemp=='k')?++k:0); break; case 2: k++; break; case 3: k++; break; }//switch结束 if(k==4) { for(j=0;j <250;j++) xianshi(3,3,3,3); //为了便于观察状态而设置的显示信息 break; } } ES=1; } //////////////////////////////////////////// void SetCnmi(void) { unsigned char data j,k=0,msgtemp; ES=0;//关串口中断 sends( "AT+CNMI=1,1,1,0,0,1\r", 20 ); while(1) { msgtemp=getc(); switch (k) { case 0: k=((msgtemp=='O' | |msgtemp=='o')?++k:0);break; case 1: k=((msgtemp=='K' | |msgtemp=='k')?++k:0);break; case 2: k++; break; case 3: k++; break; }//switch结束 if(k==4) { for(j=0;j <250;j++) xianshi(4,4,4,4); //为了便于观察状态而设置的显示信息 break; } } ES=1; } /////////////////////////////////////////////////////////////////////////////////////////// // 从SIM卡中读取一条短消息 // AT指令:AT+CMGR=1 <CR> void read_msg(unsigned char imsg) { unsigned char j,msgtemp; buffzero(iobuf, 0, IOBUF_SIZE);//缓冲区清0,备接收信息内容 offset = 0;//缓冲区指针清0 type = 1;send=1;//两个标志位,程序的其他部分中有用 ES=0; for(j=0;j <150;j++) xianshi(1,5,5,1); //为了便于观察状态而设置的显示信息 SBUF='A';while(!TI); TI=0; SBUF='T';while(!TI); TI=0; SBUF='+';while(!TI); TI=0; SBUF='C';while(!TI); TI=0; SBUF='M';while(!TI); TI=0; SBUF='G';while(!TI); TI=0; SBUF='R';while(!TI); TI=0; SBUF='=';while(!TI); TI=0; SBUF=imsg;while(!TI); TI=0; SBUF=0x0d;while(!TI); TI=0; while(1) { while(!RI);RI=0; msgtemp=SBUF; // 串口在接收字符 if(send==1) { switch(type) { case 1://接收消息内容 switch(num3) { case 1: num3 = ((msgtemp=='+') ? ++num3 : 1); for(j=0;j <50;j++) xianshi(num3,num3,8,8); //调试时在此显示了两次1,1,8,8后程序重新开始,说明读出的字符并不是'+' break; case 2: num3 =((msgtemp=='C') ? ++num3 : 1); break; case 3: num3 = ((msgtemp=='M') ? ++num3 : 1); break; case 4: num3 = ((msgtemp=='G')? ++num3 : 1); break; case 5: num3 = ((msgtemp=='R')? ++num3 : 1); break; case 6: um3 = (input_temp==':' ? ++num3 : 1); break; case 7:// 接收到了'+CMGR:' for(j=0;j <150;j++) xianshi(6,6,7,7);//便于调试时观察所设 if (msgtemp=='%'&&hefaflag==0) { for(j=0;j <150;j++) xianshi(7,7,7,7); //清空iobuf,准备将新消息内容 buffzero2(iobuf, 0, IOBUF_SIZE); idx_iobuf = -2;//将前3个%中的后2个省略不要 type=2;//跳转到case 2: } break; default: num3=1; break; }//内switch结束 break; case 2://收到合法消息时,将内容***存入iobuf[0~2] if(idx_iobuf <0) idx_iobuf++; else iobuf[idx_iobuf++]=msgtemp;//暂不考虑存储出界问题 if(iobuf[3]=='%'&&iobuf[4]=='%') {for(j=0;j <50;j++) xianshi(iobuf[0],iobuf[1],iobuf[2],6);hefaflag=1;} break; }//外switch结束 }//if(send==1)结束 if(hefaflag==1) break; }//while(1)结束 ES=1; } // 主函数 void main(void) { unsigned char data j; delay(1); // 初始化串口 setup_t1(); setup_ck(); delay(3); // 设置为文本格式发送/接收短消息 setcmgftxt(); delay(3); SetCnmi(); read_msg('5'); // 从SIM卡中读取新到短消息 ,并将内容的前3位存于iobuf[0]~[2]中 }