新手求助!GTM900b模块51单片机读取短信的问题
以下为我的代码,51单片机在keil4下编译的,想要实现功能:通过手机发短信到gtm900b模块上, 如“kjdq01”,开启继电器1。但目前遇到问题是,我通过电脑的串口和gsm模块连接,通过串口助手看过,程序就卡在 AT OK处,后面的指令如AT+CPMS都出现不了.我感觉程序是卡在while(!Hand("OK"))处了,因为对这部分不是很了解,求论坛的大神解答。还有当我注释掉所有的while(!Hand("OK"))时候,程序是可以走的。但是当我发短信去启动的时候,程序又没反应了。问题在这步if(strstr(Rec_Buf,"+CMTI")!=0),不知道是不是Rec_Buf里没有接受到缓存数导致的,不知道要怎么改。请求帮助!!!谢谢#include<reg52.h>
#include<string.h>
#include<intrins.h>
#define Buf_Max 200 //缓存长度200
#define Delay_Time 2000//延时长度
sbit jdq1 = P3^6;//继电器1
sbit jdq2 = P0^1;//继电器2
sbit jdq3 = P0^2;//继电器1
sbit jdq4 = P0^3;//继电器2
sbit jdq5 = P0^4;//继电器1
sbit jdq6 = P0^5;//继电器2
sbit jdq7 = P0^6;//继电器1
sbit jdq8 = P0^7;//继电器2
sbit jdq9 = P0^7;//继电器1
sbit jdq10 = P2^6; //继电器2
sbit jdq11 = P2^5; //继电器1
sbit jdq12 = P2^4; //继电器2
sbit jdq13 = P2^3; //继电器1
sbit jdq14 = P2^2; //继电器2
sbit jdq15 = P2^1; //继电器1
sbit jdq16 = P2^0; //继电器2
sbit pwon=P3^7; //模块启动
unsigned char i = 0; //定义缓存指针
unsigned char Rec_Buf; //定义缓存数组
void Serial_Init(void); //声明串口初始化函数
void Send_ASCII(unsigned char *b); //声明发送字符(ASCII码)函数
void Delay_ms(unsigned int time);//声明延时函数
void CLR_Buf(void); //声明清除缓存内容
void Send_Hex(unsigned char b); //声明发送字符(十六进制)函数
bitHand(unsigned char *a); //声明判断缓存中是否含有指定的字符串函数
/**********************************主函数******************************/
void main(void)
{
Serial_Init(); //初始化串口
CLR_Buf(); //清除缓存内容
pwon=0;
Delay_ms(1000); //延时
pwon=1; //启动模块
jdq1=1;jdq2=1;jdq3=1;jdq4=1;jdq5=1;jdq6=1;jdq7=1;jdq8=1;
Send_ASCII("AT"); //发送联机指令
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
{
Send_ASCII("AT"); //发送联机指令
Delay_ms(6000); //延时
}
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行
Delay_ms(Delay_Time); //延时
while(!Hand("OK")) //等待设置成功
{
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行
Delay_ms(Delay_Time); //延时
}
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Delay_ms(Delay_Time); //延时
while(!Hand("OK")) //等待设置成功
{
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Delay_ms(Delay_Time); //延时
}
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGF=1");//文本(TEXT)模式
Delay_ms(Delay_Time); //延时
while(!Hand("OK")) //等待设置成功
{
Send_ASCII("AT+CMGF=1");//文本(TEXT)模式
Delay_ms(Delay_Time); //延时
}
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGD=1");//删除存储器的已读、未读,已发送、未发送短信
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容*/
/* Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CSCA="shoujihao"");//文本(TEXT)模式
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
*/
while(1)
{
if(strstr(Rec_Buf,"+CMTI")!=0) //若缓存字符串中含有"+CMTI"就表示有新的短信
{
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGR=1"); //发送读取信息指令
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
if(strstr(Rec_Buf,"kjdq01")!=NULL) //如果信息内容是"open1"
jdq1 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq01")!=NULL) //如果信息内容是"close1"
jdq1 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq02")!=NULL)//如果信息内容是"open2"
jdq2 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq02")!=NULL) //如果信息内容是"close2"
jdq2 = 1; //熄灭LED8指示灯
if(strstr(Rec_Buf,"kjdq03")!=NULL) //如果信息内容是"open1"
jdq3 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq03")!=NULL) //如果信息内容是"close1"
jdq3 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq04")!=NULL) //如果信息内容是"open2"
jdq4 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq04")!=NULL) //如果信息内容是"close2"
jdq4 = 1;
if(strstr(Rec_Buf,"kjdq05")!=NULL) //如果信息内容是"open1"
jdq5 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq05")!=NULL) //如果信息内容是"close1"
jdq5 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq06")!=NULL) //如果信息内容是"open2"
jdq6 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq06")!=NULL) //如果信息内容是"close2"
jdq6 = 1;
if(strstr(Rec_Buf,"kjdq07")!=NULL) //如果信息内容是"open1"
jdq7 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq07")!=NULL) //如果信息内容是"close1"
jdq7 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq08")!=NULL)//如果信息内容是"open2"
jdq8 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq08")!=NULL) //如果信息内容是"close2"
jdq8 = 1; //熄灭LED8指示灯
if(strstr(Rec_Buf,"kjdq09")!=NULL) //如果信息内容是"open1"
jdq9 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq09")!=NULL) //如果信息内容是"close1"
jdq9 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq10")!=NULL) //如果信息内容是"open2"
jdq10 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq10")!=NULL) //如果信息内容是"close2"
jdq10 = 1;
if(strstr(Rec_Buf,"kjdq11")!=NULL) //如果信息内容是"open1"
jdq11 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq11")!=NULL) //如果信息内容是"close1"
jdq11= 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq12")!=NULL) //如果信息内容是"open2"
jdq12 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq12")!=NULL) //如果信息内容是"close2"
jdq12 = 1;
if(strstr(Rec_Buf,"kjdq13")!=NULL) //如果信息内容是"open1"
jdq13 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq13")!=NULL) //如果信息内容是"close1"
jdq13 = 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq14")!=NULL) //如果信息内容是"open2"
jdq14 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq14")!=NULL) //如果信息内容是"close2"
jdq14 = 1;
if(strstr(Rec_Buf,"kjdq15")!=NULL) //如果信息内容是"open1"
jdq15 = 0; //点亮LED7指示灯
if(strstr(Rec_Buf,"gjdq15")!=NULL) //如果信息内容是"close1"
jdq15= 1; //熄灭LED7指示灯
if(strstr(Rec_Buf,"kjdq16")!=NULL) //如果信息内容是"open2"
jdq16 = 0; //点亮LED8指示灯
if(strstr(Rec_Buf,"gjdq16")!=NULL) //如果信息内容是"close2"
jdq16 = 1;
if(strstr(Rec_Buf,"quankai")!=NULL) //全开
P0=P2 = 0;
if(strstr(Rec_Buf,"quanguan")!=NULL) //全关
P0=P2 =0XFF;
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGD=1"); //删除读取后的信息
Delay_ms(Delay_Time); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
}
//if(strstr(Rec_Buf,"RING")!=NULL) //有电话时两路继电器吸合
// {
// jdq1=0;
//jdq2=0;
// }
}
}
/***************************串口初始化函数*****************************/
/*函数原型:void Serial_Init(void)
/*函数功能:串口初始化
/*输入参数:无
/*输出参数:无
/**********************************************************************/
void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;
TR1 = 1; //开启定时器1
ES = 1; //开启串口中断
EA = 1; //开启全局中断
}
/****************************串口中断处理函数**************************/
/*函数原型:void Serial_Int(void)
/*函数功能:串口中断处理
/*输入参数:无
/*输出参数:无
/**********************************************************************/
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; //开启串口中断
}
/****************************发送字符(ASCII)函数***********************/
/*函数原型:void Send_ASCII(unsigned char *b)
/*函数功能:发送字符(ASCII码)
/*输入参数:unsigned char *b
/*输出参数:无
/**********************************************************************/
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
}
/****************************time ms延时函数***************************/
/*函数原型:Delay_ms(unsigned int time)
/*函数功能:延时Time ms
/*输入参数:time
/*输出参数:无
/**********************************************************************/
void Delay_ms(unsigned int time)
{
unsigned char j;
for(;time>0;time--)
{
j = 1500;
while(j--);
}
}
/**************************清除缓存数据函数****************************/
/*函数原型:void CLR_Buf(void)
/*函数功能:清除缓存数据
/*输入参数:无
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //将缓存内容清零
{
Rec_Buf = 0;
}
i = 0; //接收字符串的起始存储位置
}
/*************************发送字符(十六进制)函数********************/
/*函数原型:void Send_Hex(unsigned char c)
/*函数功能:发送字符(十六进制)
/*输入参数:unsigned char c
/*输出参数:无
/*调用模块:无
/******************************************************************/
void Send_Hex(unsigned char c)
{
ES = 0; //关串口中断
SBUF = c;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
ES = 1; //开串口中断
}
/*****************判断缓存中是否含有指定的字符串函数******************/
/*函数原型:bit Hand(unsigned char *a)
/*函数功能:判断缓存中是否含有指定的字符串
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1---含有 0---不含有
/*调用模块:无
/*******************************************************************/
bit Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
} 自己的帖子自己顶,求论坛内大神帮忙 再顶一下。。。。 别沉,求帮助,求关注 再为自己顶一次啊 我也遇到这个问题了,单片机怎么提取手机发来的信息?? 这个很简单,首先 ,让模块处于短信提示状态,当收到短信时,模块发出提示,然后根据模块提示,读出对应的短信!很简单,关键是做出错的处理 帮顶,最近也要玩这个模块。
话说。楼主 解决了吗?
楼主 解决了吗?
页:
[1]