搜索
bottom↓
回复: 7

tc35i模块接收短信的处理出问题,大家帮忙,谢谢!

[复制链接]

出0入0汤圆

发表于 2011-12-20 16:07:18 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include<string.h>
#include<stdio.h>
#define Buf_Max 50 //缓存长度200
#define Delay_Time 3000  //延时长度
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^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();             //清除缓存内容
           Delay_ms(8000);        //延时
         while(1)
          {
           Send_ASCII("AT"); //发送联机指令
           Send_Hex(0x0d);   //发送回车符   
           Send_Hex(0x0a);   //发送换行符
           Delay_ms(1000);   //延时
           LED1 = 0;                 //点亮握手成功指示灯
           CLR_Buf();//清除缓存内容
           Send_ASCII("AT+IPR=9600"); //发送联机指令
           Send_Hex(0x0d);   //发送回车符   
           Send_Hex(0x0a);   //发送换行符
           Delay_ms(1000);     //延时
          
           Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行         
           Send_Hex(0x0d);           //发送回车符
             Send_Hex(0x0a);           //发送换行符
           Delay_ms(1000);     //延时
           CLR_Buf();                //清除缓存内容
           LED3 = 0;                 //点亮设置成功指示灯
           Delay_ms(1000);     //延时
           Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式
           Send_Hex(0x0d);           //发送回车符
           Send_Hex(0x0a);           //发送换行符
           Delay_ms(1000);     //延时
           CLR_Buf();                //清除缓存内容
           LED4 = 0;                 //点亮设置成功指示灯
           Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
           Send_Hex(0x0d);           //发送回车符
           Send_Hex(0x0a);           //发送换行符
           Delay_ms(1000);     //延时
           CLR_Buf();                //清除缓存内容
           LED5 = 0;                 //点亮设置成功指示灯
                CLR_Buf();                   //清除缓存内容
                Send_ASCII("AT+CMGR=1");     //发送读取信息指令
                Send_Hex(0x0d);              //发送回车符
                Send_Hex(0x0a);              //发送换行符
                Delay_ms(1000);        //延时
                LED6= 0;  
                 Delay_ms(50);                 //点亮设置成功指示灯
               
                if(strstr(Rec_Buf,"what is the temperature now")!=NULL)        
                 LED8=0;                  
        else CLR_Buf();       
        CLR_Buf();
        Send_ASCII("AT+CMGD=1");  //删除第一条信息
           Send_Hex(0x0d);           //发送回车符
           Send_Hex(0x0a);           //发送换行符
           Delay_ms(1000);     //延时
           CLR_Buf();                //清除缓存内容
           LED2 = 0;                 //点亮设置成功指示灯                       
           Delay_ms(1000);     //延时
   }                                         
}

/***************************串口初始化函数*****************************/
/*函数原型: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++;               //缓存指针向后移动
                        //Rec_Buf = '\0';
                        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;                   //开串口中断
}
/****************************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;
}
麻烦大家帮我看看程序,是想让tc35i模块接收一条短信如果短信的内容是what is the temperature now,则LED8小灯亮,没接收到或接收到的内容不对小灯不亮,可是灯怎么都不亮,用串口调试软件可以看到模块握手等指令都返回OK,也能看到接收到了内容为what is the temperature now的短信,但灯就是不亮。最后问题就集中在这个判断上if(strstr(Rec_Buf,"what is the temperature now")!=NULL) ,我查了很多资料,感觉也没有不妥的地方,故请教大家,谢谢啊!!

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-12-20 17:15:39 | 显示全部楼层
what is the temperature now?
这也太长了吧,干嘛不少判断些
用W801g模块,lz说的这些功能可以在模块直接实现

出0入0汤圆

发表于 2011-12-20 17:46:56 | 显示全部楼层
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行   
   Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式  
   CLR_Buf();                //清除缓存内容
   Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示 灯
   CLR_Buf();                   //清除缓存内容



   这些设置不要放到主循环里面,设置一次就可以了!





Send_ASCII("AT+CMGR=1");     //发送读取信息指令



  你的这个指令是不确定的,因为你的卡内的短信的地址是不一定在第一条.你可以把所有处理后的短信全部删除,也可以一条条读,一直把所有未读短信读完,处理完.

出0入0汤圆

发表于 2011-12-20 18:13:34 | 显示全部楼层
记号

出0入0汤圆

 楼主| 发表于 2011-12-20 18:42:00 | 显示全部楼层
呜呜,我把程序弄成这样就是因为另一个和这个小灯情况类似的语句它不执行,所以只要解决了这个小灯,所有问题都不是问题了,请大家帮帮我啊,明天就要答辩了!

出0入0汤圆

发表于 2011-12-20 18:48:44 | 显示全部楼层
LZ是研究生?

出0入0汤圆

 楼主| 发表于 2011-12-20 21:27:48 | 显示全部楼层
if(strcmp(Rec_Buf,"")==0)        
                 LED8=0;                  
        else CLR_Buf();       
我想我找到根源了,我用以上语句判断,最后灯亮了,那就应该是,Rec_Buf[]最后接收到的内容为空,我想可能是中断的问题吧,自己又不是很了解

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 09:18

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

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