搜索
bottom↓
回复: 8

新手求助!GTM900b模块51单片机读取短信的问题

[复制链接]

出0入0汤圆

发表于 2013-4-22 20:39:19 | 显示全部楼层 |阅读模式
以下为我的代码,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[Buf_Max];    //定义缓存数组

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);    //声明发送字符(十六进制)函数
bit  Hand(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[i] = 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[k] = 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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-4-22 20:39:49 | 显示全部楼层
自己的帖子自己顶,求论坛内大神帮忙

出0入0汤圆

 楼主| 发表于 2013-4-22 20:40:40 | 显示全部楼层
再顶一下。。。。

出0入0汤圆

 楼主| 发表于 2013-4-22 20:41:56 | 显示全部楼层
别沉,求帮助,求关注

出0入0汤圆

 楼主| 发表于 2013-4-22 20:48:58 | 显示全部楼层
再为自己顶一次啊

出0入0汤圆

发表于 2013-5-23 15:36:27 | 显示全部楼层
我也遇到这个问题了,单片机怎么提取手机发来的信息??

出0入0汤圆

发表于 2013-5-24 21:14:25 | 显示全部楼层
这个很简单,首先 ,让模块处于短信提示状态,当收到短信时,模块发出提示,然后根据模块提示,读出对应的短信!很简单,关键是做出错的处理

出0入0汤圆

发表于 2014-4-14 19:48:56 | 显示全部楼层
帮顶,最近也要玩这个模块。
话说。楼主 解决了吗?

出0入13汤圆

发表于 2014-8-12 13:51:26 | 显示全部楼层
楼主 解决了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表