51单片机和sim900a模块连接, 为什么一直AT握手指令不成功

2019-07-15 19:07发布

51单片机和sim900a模块连接,
为什么一直AT握手指令成功不了????????????????
求大神帮忙







/************************主函数**************************/

void main()
{  
  //int j;


  IGT=0;
  DelayMs(1000);        //延时1s
  IGT=1;
  Serial_Init();        //调用串口初始化函数        gsm用
  //ti = 1;
  CLR_Buf();             //清除缓存内容
  DelayMs(300);        //延时1F   给GSM找网时间,必须注意
  while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令         //每次默认开回显ATE1
   {
         Send_ASCII("AT"); //发送联机指令
         Send_Hex(0x0d);   //发送回车符   
         Send_Hex(0x0a);   //发送换行符
         DelayMs(60000);   //延时
    }
  CLR_Buf();                //清除缓存内容
  //LED1 = 0;                 //点亮握手成功指示灯

  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CSCS="GSM"");//GSM网络
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容

                        
  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CPMS="SM","SM","SM"");//所有操作都在MT(模块终端)中进行
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容
  //LED2 = 0;                 //点亮设置成功指示灯

  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGF=0");//设置PDU模式
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容
  //LED3 = 0;                 //点亮设置成功指示灯
  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGDA=6");//删除所有短信
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容

  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGF=1");//设置文本模式
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容


  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGDA="DEL ALL"");//删除所有短信
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容
//  LED3 = 0;                 //点亮设置成功指示灯

                        
  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));       //等待设置成功
  CLR_Buf();                //清除缓存内容
// LED3 = 0;                 //点亮设置成功指示灯

  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));              //等待设置成功
  CLR_Buf();                //清除缓存内容
// LED4 = 0;                 //点亮设置成功指示灯

  DelayMs(delay_time);     //延时
  Send_ASCII("AT+CMGD=1");  //删除第一条信息
  Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
  DelayMs(delay_time);     //延时
  while(!Hand("OK"));              //等待设置成功
  CLR_Buf();                //清除缓存内容
  //LED5 = 0;                 //点亮设置成功指示灯





                    
                    DelayMs(delay_time);        //延时
                        Send_ASCII("AT");     //发送读取信息指令
                        Send_Hex(0x0d);              //发送回车符
                         Send_Hex(0x0a);              //发送换行符
                        DelayMs(delay_time);        //延时
                while(!Hand("OK"));          //等待设置成功
                //LED1 = 1;
                    DelayMs(delay_time);        //延时
                        Send_ASCII("AT+CMGF=0");     //发送PDU指令
                        Send_Hex(0x0d);              //发送回车符
                         Send_Hex(0x0a);              //发送换行符
                        DelayMs(delay_time);        //延时
                while(!Hand("OK"));          //等待设置成功
               // LED2 = 1;
                    DelayMs(delay_time);        //延时
                        Send_ASCII("AT+CSCS="GSM"");     //发送读取信息指令
                        Send_Hex(0x0d);              //发送回车符
                         Send_Hex(0x0a);              //发送换行符
                        DelayMs(delay_time);        //延时
                while(!Hand("OK"));          //等待设置成功
               // LED3 = 1;
                    DelayMs(delay_time);        //延时
                        Send_ASCII("AT+CMGS=29");     //发送读取信息指令
                        Send_Hex(0x0d);              //发送回车符
                         Send_Hex(0x0a);              //发送换行符
                        DelayMs(delay_time);        //延时
                while(!Hand("OK"));          //等待设置成功                    DelayMs(delay_time);        //延时
           // LED4 = 1;
                        Send_ASCII("0011000D91688107293201F70008A00E8B66544AFF1A5BA46E298FC79AD8");     //发送读取信息指令18710881316F 8117801813F6
            Send_Hex(0x1a);
                        Send_Hex(0x0d);              //发送回车符                                                       13659212213F 3156292112F3
                         Send_Hex(0x0a);              //发送换行符
                        DelayMs(delay_time);        //延时
                while(!Hand("OK"));          //等待设置成功
            DelayMs(20000);             //报警时长**************************************************************


}




void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率      
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;   
TR1 = 1;    //开启定时器1      TCON中的控制字
ES = 1;     //开启串口中断
EA = 1;     //开启全局中断
}
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    for (b; *b!='';b++)
            {
                SBUF = *b;
                while(TI!=1);     //等待发送完成
                        TI = 0;           //清除发送中断标志位
                }           
        ES = 1;                   //开串口中断
}
void CLR_Buf(void)
{
        unsigned char k;
    for(k=0;k<Buf_Max;k++)    //将缓存内容清零
            {
                        Rec_Buf[k] = 0;
                }
    i = 0;                    //接收字符串的起始存储位置
}
void Send_Hex(unsigned char c)         
{
    ES = 0;               //关串口中断
    SBUF = c;
    while(TI!=1);         //等待发送完成
    TI = 0;               //清除发送中断标志位
        ES = 1;               //开串口中断
}
bit Hand(unsigned char *a)
{
    if(strstr(Rec_Buf,a)!=NULL)
            return 1;
        else
                return 0;
}





void Serial_Int() interrupt 4
{        
        ES = 0;         //关串口中断,防止中断嵌套
        if(TI)         //如果是发送中断,则不做任何处理
                {
                        TI = 0;  //清除发送中断标志位
                }
        if(RI)         //如果是接送中断,则进行处理
                {
                        RI = 0; //清除接收中断标志位
                        Rec_Buf = SBUF; //将接收到的字符串存到缓存中
                        i++;               //缓存指针向后移动
                        if(i>200)          //如果缓存满,将缓存指针指向缓存的首地址
                                {
                                        i = 0;
                                }
                }
        ES = 1;         //开启串口中断
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
lizhuming
1楼-- · 2019-07-16 00:43
试试把这改改:
while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令         //每次默认开回显ATE1
   {
         Send_ASCII("AT"); //发送联机指令
         Send_Hex(0x0d);   //发送回车符   
         Send_Hex(0x0a);   //发送换行符
         DelayMs(60000);   //延时
    }
=》while(!Hand("OK"))     
   {
      
         Send_ASCII("AT ");  
         DelayMs(1000);   
    }
      
      
   

lizhuming
2楼-- · 2019-07-16 06:34
再不成功的话:
for (b; *b!='';b++)
            {
                SBUF = *b;
                while(TI!=1);     
                        TI = 0;     }      
改为:while(b != '')
   {
  SBUF=*b++;
while(!TI)
{
TI=0;
}
}

一周热门 更多>