读书人

小弟我用AT89S52控制TC35i但是无法读取

发布时间: 2012-02-08 19:52:21 作者: rapoo

求助:我用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]中
}



------解决方案--------------------


先写个函数,封装发送数据
比如

C/C++ code
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 );
[解决办法]
C/C++ code
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]中 } 

读书人网 >移动平台

热点推荐