首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动平台 >

小弟我用AT89S52控制TC35i但是无法读取消息内容

2012-02-08 
求助:我用AT89S52控制TC35i但是无法读取消息内容大家好!春节刚过,在此给大家拜个晚年!本人用AT89S52控制TC

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

热点排行