单片机/MCU论坛
直播中

云和彼端的山

7年用户 3经验值
私信 关注
[问答]

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

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


typedef unsigned int u16;
typedef unsigned char u8;


#define led P0

***it led1=P0^0;                //监控单片机执行情况
***it led2=P0^1;                //监控单片机执行情况
***it led3=P0^2;                //监控单片机执行情况
***it led4=P0^3;                //监控单片机执行情况
***it led5=P0^4;               //监控单片机执行情况
***it 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]='';
                        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!='')    //遇到空格跳出循环
    {
        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_***uf()                //清空缓存器
{
        u16 k;
        for(k=0;k<50;k++)
        {
                Recive_table[k]='0';
        }
}

void main()
{
        UsartInit();  //串口初始化
        CLR_***uf();
        led=0x00;         //关闭所有LED灯

        while(!Hand("+EIND: 2"))  //等待GSM初始化完成
        {
                delay(5);
        }
        delay(50000);
        led1=1;                        //握手成功
        CLR_***uf();

        GSM_Set("AOT");            //发送明显错误的AT指令
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AOT");
                delay(5);
        }
        led2=1;                         //灯依然会亮且程序继续执行
        CLR_***uf();


        GSM_Set("AT+CMGF=1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CMGF=1");
                delay(5);
        }
        CLR_***uf();
        led3=1;          //设置为接受英文短信成功
       
        GSM_Set("AT+CNMI=2,1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CNMI=2,1");
                delay(5);
        }
        CLR_***uf();
        led4=1;              //设置为来短信提示模式成功

        GSM_Set("AT+CMGD=1");
        delay(5);
        while(!Hand("OK"))
        {
                GSM_Set("AT+CMGD=1");
                delay(5);
        }
        CLR_***uf();            //删除1号位置短信成功
          
        while(1)
        {   
                if(Recive_finish==1)
                {   
                        ES=0;
                        Recive_finish=0;
                        if(Hand("+CMTI:"))
                        {
                                led5=1;
                                CLR_***uf();
                                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;
        }         
}


回帖(1)

alonggege

2019-7-13 12:54:11
不错,很好的经验分享,感谢
举报

更多回帖

×
20
完善资料,
赚取积分