微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机给GSM模块发错误的AT指令也会收到返回OK

51单片机给GSM模块发错误的AT指令也会收到返回OK

时间:10-02 整理:3721RD 点击:
GSM 模块用的是有方公司的M660。想通过发短信控制led6的亮灭,但是未成功,经过调试发现,在发明显错误的AT指令的时候,也会收到OK,求大佬指导。代码如下:#include "reg51.h"       
#include <string.h>

typedef unsigned int u16;
typedef unsigned char u8;

#define led P0
sbit led1=P0^0;                //监控单片机执行情况
sbit led2=P0^1;                //监控单片机执行情况
sbit led3=P0^2;                //监控单片机执行情况
sbit led4=P0^3;                //监控单片机执行情况
sbit led5=P0^4;               //监控单片机执行情况
sbit led6=P0^5;               //远控
u16 i;                             
u8 n;
u8 Recive_table[50];
u16 Recive_finish;                //接收GSM返回信息完成标志位

void delay(u16 i)           //延时函数
{
        while(i--);         
}
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XFD;                                //计数器初始值设置,注意波特率是19200的
        TL1=0XFD;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}
void Usart() interrupt 4
{
        if(RI)
        {
                static u16 i=0;        //因为是一位一位接收,所以用static
                RI = 0;//清除接收中断标志位
                ES=0;
                Recive_table=SBUF;            //将接收到的数据缓存
                if((Recive_table == '\r'))
                {
                        Recive_table[i+1]='\0';
                        i=0;
                        Recive_finish=1;           //接收完成标志位置1
                }
                else
                        i++;     
                ES=1;
               
        }
}                                                                                 
void Send_Uart(u8 value)                        //发送一字符
{
          ES=0;
          SBUF=value;     //发送
      while(!TI);    //等待发送完毕
      TI=0;         //清发送完毕中断请求标志位
          ES=1;
}
void GSM_Set(u8 *puf) // 数组指针*puf指向字符串数组               
{
        while(*puf!='\0')    //遇到空格跳出循环
    {
        Send_Uart(*puf);  //向GSM模块发送控制指令。
        delay(5);
        puf++;      
    }
    delay(5);
    Send_Uart('\r');//回车
    delay(5);
    Send_Uart('\n');   //换行
        delay(5000);
}   
bit Hand(u8 *a)                 //检验返回信息
{
        if(strstr(Recive_table,a)!=NULL)
                return 1;         //返回信息与期望相同
        else
                return 0;          //返回信息与期望不同
}
void CLR_sbuf()                //清空缓存器
{
        u16 k;
        for(k=0;k<50;k++)
        {
                Recive_table[k]='0';
        }
}
void main()
{
        UsartInit();  //串口初始化
        CLR_sbuf();
        led=0x00;         //关闭所有LED灯
        while(!Hand("+EIND: 2"))  //等待GSM初始化完成
        {
                delay(5);
        }
        delay(50000);
        led1=1;                        //握手成功
        CLR_sbuf();
        GSM_Set("AOT");            //发送明显错误的AT指令
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AOT");
                delay(5);
        }
        led2=1;                         //灯依然会亮且程序继续执行
        CLR_sbuf();

        GSM_Set("AT+CMGF=1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CMGF=1");
                delay(5);
        }
        CLR_sbuf();
        led3=1;          //设置为接受英文短信成功
       
        GSM_Set("AT+CNMI=2,1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CNMI=2,1");
                delay(5);
        }
        CLR_sbuf();
        led4=1;              //设置为来短信提示模式成功
        GSM_Set("AT+CMGD=1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CMGD=1");
                delay(5);
        }
        CLR_sbuf();            //删除1号位置短信成功
          
        while(1)
        {   
                if(Recive_finish==1)
                {   
                        ES=0;
                        Recive_finish=0;
                        if(Hand("+CMTI:"))
                        {
                                led5=1;
                                CLR_sbuf();
                                GSM_Set("AT+CMGR=1");
                                ES=1;
                                delay(500);
                        }
                                  
                        else if(strstr(Recive_table,"op1")!=NULL)
                        {
                                led6=1;
                                GSM_Set("AT+CMGD=1");
                                delay(5);
                                while(!Hand("OK"));
                        }
                        else if(strstr(Recive_table,"cl1")!=NULL)
                        {
                                led6=0;
                                GSM_Set("AT+CMGD=1");
                                delay(5);
                                while(!Hand("OK"));
                        }
                        else
                                led6=led6;
                       
                }
                ES=1;
        }         
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top