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;
}
}
#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;
}
}