| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2557 人关注过本帖
标题:为什么一加上strstr函数就死掉了呢,求教
只看楼主 加入收藏
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:9 
为什么一加上strstr函数就死掉了呢,求教
这个是关于GSM模块的一个程序,当收到短信时按短信内容动作,并且发送一次温湿度数据,温湿度函数RH();,编译通过,但是程序烧写进单片机后过不了 strstr(Buf_First_Serial,"+CMTI");这句话。请各位大神帮忙看看
程序代码:
#include "Intrins.h"
#include<reg51.h>
#include<string.h>
#include "1602.H"


#define uchar unsigned char
#define uint unsigned int
//char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
#define Buf1_Max 100                     //串口1缓存长度



sbit led1 = P1^0;                    //LED1黄色指示灯
sbit led2 = P2^5;                    //LED2绿色指示灯
sbit led3 = P2^6;                    //LED3红色指示灯
sbit led4 = P2^7;                  //启动TC35I信号
sbit CALL = P1^1;
sbit SETWD = P1^0;
uchar fflag=0,flag11=0;
xdata unsigned char Buf_First_Serial[Buf1_Max];
unsigned int  First_Int = 0;
/////////////////////
sbit DHT=P1^2;
///////////////////////////////

/////////
/////////
/**************************************************/
uchar  temp; 
uchar  hbcd,lbcd; 
uchar  U8FLAG,k;
uchar  U8count,U8temp;
uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar  U8comdata;
xdata uchar  sd[3],wd[3];
void Serial_Init(void);
void Send_ASCII(unsigned char *b);
void Send_Hex(unsigned char c);     
void Delay_ms(unsigned int time);    
/**************************************************/
/**************************************************/
void delay_ms1(unsigned int x)
{
    unsigned int i,j;
    i=0;
    for(i=0;i<x;i++)
    {
       j=108;
           ;
       while(j--);
    }
}

void Delay_ms(unsigned int time)
{
     unsigned char j;
     for(;time>0;time--)
         {
              j = 150;
              while(j--)
                ;
         }
}
//
///**************************串口1初始化函数**************************/
//
void Serial_Init(void)        //串口初始化函数
{
     SCON = 0x50;            //串口:方式1,允许发送和接收
     TMOD = 0x21;            //定时器1:模式2,8位自动重装模式,用于产生波特率    
     TH1 = 0xFD;             //11.0592MHZ晶振,波特率为9600
     TL1 = 0xFD;   
     TR1 = 1;                //开启定时器1 
     //TR0=0;  
     ES = 1;                 //开启串口中断
     EA = 1;                 //开启全局中断
}
///***************************发送字符(ASCII)函数*********************/
//
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                  //关串口中断
    for (b; *b!='\0';b++)
       {
           SBUF = *b;
           while(TI!=1);    //等待发送完成
        TI = 0;          //清除发送中断标志位
    }       
    ES = 1;                  //开串口中断
}
//
///************************发送字符(十六进制)函数*********************/
//
void Send_Hex(unsigned char c)         
{
    ES = 0;                  //关串口中断
    SBUF = c;
    while(TI!=1);            //等待发送完成
    TI = 0;                  //清除发送中断标志位
    ES = 1;                  //开串口中断
}
//
///*********************************END*******************************/
///*********************************发送换行回车函数*******************************/
//
void Send_LR(void)
{
    Send_Hex(0x0D);    
    Send_Hex(0x0A);    
}
//
///*****************************清除串口1缓存数据函数******************************/
//
void CLR_Buf1(void)
{
    unsigned int k;
    for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
    {
        Buf_First_Serial[k] = 0x30;
    }
    First_Int = 0;              //接收字符串的起始存储位置
}
//
///**********************判断缓存中是否含有指定的字符串函数************************/
//
unsigned char Hand(unsigned char *a)
{ 
    if(strstr(Buf_First_Serial,a)!=NULL)
        return 1;
    else
        return 0;
}
//
void Second_AT_Command1(unsigned char *b)         
{
    unsigned char i;
    unsigned char *c;
    c = b;                                        //保存字符串地址到c
    CLR_Buf1(); 
    i = 0;
    while(i == 0)                    
    {
        if( !Hand("OK")) 
        {
                b = c;                            //将字符串地址给b
                   for (b; *b!='\0';b++)
                   {
                    Send_Hex(*b);
                }
                Send_LR();    
               Delay_ms(800);
        }
         else
            i = 1;
    }
    CLR_Buf1(); 
}
//
void Second_AT_ERROR1(unsigned char *b)         
{
    unsigned char i;
    unsigned char *c;
    c = b;                                        //保存字符串地址到c
    CLR_Buf1(); 
    i = 0;
    while(i == 0)                    
    {
        if((!Hand("OK"))&&(!Hand("ERROR"))) 
        {
                b = c;                            //将字符串地址给b
                   for (b; *b!='\0';b++)
                   {
                    Send_Hex(*b);
                }
                Send_LR();
                Delay_ms(800);    
        }
         else
        {
            i = 1;
        }
    }
    CLR_Buf1(); 
}
//
void AT_Comm(unsigned char *b)         
{
    unsigned char *c;
    c = b;                                        //保存字符串地址到c
    CLR_Buf1(); 
    b = c;                            //将字符串地址给b
    for (b; *b!='\0';b++)
      {
        Send_Hex(*b);
    }
    Send_LR();    
       Delay_ms(800);
    CLR_Buf1(); 
}

/*********************************设置成TEXT文本模式*****************************/

void Set_Text_Mode(void)
{
    Second_AT_Command1("ATE0");                                //取消回显    
    Second_AT_Command1("AT+CNMI=2,1");                            //新短信到来时提示    
    Second_AT_Command1("AT+CMGF=1");                            //PDU模式    
    Second_AT_Command1("AT+CSDH=0");                            //TEXT显示模式    
    //Second_AT_Command("AT+CSCS=\"GSM\"",3);                            //使用GSM字符集
    //Second_AT_Command("AT+CSMP=17,167,0,8",3);                    //设置PDU模式参数
    Second_AT_Command1("AT+CPMS=\"SM\",\"SM\",\"SM\"");        //所有操作都在MT(模块终端)中进行;    
    Second_AT_ERROR1("AT+CMGD=1");    
}

void Serial_Int(void) interrupt 4 
{    
    ES = 0;                                         //关串口中断,防止中断嵌套
    if(TI)                                         //如果是发送中断,则不做任何处理
    {
        TI = 0;                                  //清除发送中断标志位
    }
    if(RI)                                         //如果是接送中断,则进行处理
    {    
        RI = 0;                                 //清除接收中断标志位
        Buf_First_Serial[First_Int] = SBUF;      //将接收到的字符串存到缓存中
        First_Int++;                            //缓存指针向后移动
        if(First_Int > Buf1_Max)                   //如果缓存满,将缓存指针指向缓存的首地址
        {
            First_Int = 0;
        }
    }
    ES = 1;                                         //开启串口中断
}

///***************************************END**************************************/


////////////////////////////////////////
////////////////////////////////////////////////
///////////////////   DHT11       ///////////////
////////////////////////////////////////////////
//SendData(uchar *a)
//{
//    outdata[0] = a[0]; 
//    outdata[1] = a[1];
//    outdata[2] = a[2];
//    outdata[3] = a[3];
//    outdata[4] = a[4];
//    count = 1;
//    SBUF=outdata[0];
//}
void Delay(int j)
{  uchar i;
   for(;j>0;j--)
  {     
    for(i=0;i<27;i++);
  }
}
void  Delay_10us(void)
{
    uchar i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
    
void  COM(void)
{
    uchar i;
    for(i=0;i<8;i++)       
    {   U8FLAG=2;    
           while((!DHT)&&U8FLAG++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
          U8temp=0;
        if(DHT)U8temp=1;
            U8FLAG=2;
        while((DHT)&&U8FLAG++);
           //超时则跳出for循环          
           if(U8FLAG==1) break;
           //判断数据位是0还是1     
              
        // 如果高电平高过预定0高电平值则数据位为 1 
        U8comdata<<=1;
           U8comdata|=U8temp;        //0
     }//rof
       
}

//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM(); 
//--------------------------------
void RH(void)
{
  //主机拉低18ms 
   DHT=0;
   Delay(180);
   DHT=1;

 //总线由上拉电阻拉高 主机延时20us
   Delay_10us();
   Delay_10us();
   Delay_10us();
   Delay_10us();

 //主机设为输入 判断从机响应信号 
   DHT=1;

 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      
   if(!DHT)         //T !      
   {
     U8FLAG=2;
     //判断从机是否发出 80us 的低电平响应信号是否结束     
      while((!DHT)&&U8FLAG++);
      U8FLAG=2;
     //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
      while((DHT)&&U8FLAG++);
     //数据接收状态         
       COM();
       U8RH_data_H_temp=U8comdata;
       COM();
       U8RH_data_L_temp=U8comdata;
       COM();
       U8T_data_H_temp=U8comdata;
       COM();
       U8T_data_L_temp=U8comdata;
       COM();
       U8checkdata_temp=U8comdata;
       DHT=1;
     //数据校验 
     
       U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
       if(U8temp==U8checkdata_temp)
       {
             U8RH_data_H=U8RH_data_H_temp;
             U8RH_data_L=U8RH_data_L_temp;
          U8T_data_H=U8T_data_H_temp;
             U8T_data_L=U8T_data_L_temp;
             U8checkdata=U8checkdata_temp;
       }//fi
   }//fi

}
//---------------------------------------------
void main(void) 
{ 
  uchar tshi,tge,sshi,sge;
  Serial_Init();

 // CLR_Buf1();
  lcd_system_reset();

  while(1) 
  { 
         RH();
     sshi=U8RH_data_H/10+0x30;
     sge=U8RH_data_H%10+0x30;
     tshi=U8T_data_H/10+0x30;
     tge=U8T_data_H%10+0x30;
     lcd_char_write(0,0,sshi);    
     lcd_char_write(1,0,sge);    
     lcd_char_write(0,1,tshi);    
     lcd_char_write(1,1,tge);    
        led1=0;
      Delay_ms(500);
      strstr(Buf_First_Serial,"+CMTI");
       led1=0;
      Delay_ms(500);
        //return 1; 
        
    
        //return 0;
    
    //    if(Hand("+CMTI")) 
     // {    
        CLR_Buf1();
        flag11=1;
        Send_ASCII("AT+CMGR=1");                    //发送读取信息指令
        Send_LR();   
        Delay_ms(500);  
//         if(strstr(Buf_First_Serial,"onled1")!=NULL)
    //       {
    //        led1 = 0;
//           }
//         if(strstr(Buf_First_Serial,"offled1")!=NULL)
//           {
//            led1 = 1;
//           }
//         if(strstr(Buf_First_Serial,"onled3")!=NULL)
//           {
//            led2 = 0;
//           }
//         if(strstr(Buf_First_Serial,"offled3")!=NULL)
//           {
//            led2 = 1;
//           }
//        Second_AT_ERROR1("AT+CMGD=1");
        Delay_ms(50);
        CLR_Buf1(); 
    //    }
    if(flag11)
      {
        RH();
        sd[0]='s';
        sd[1]=((U8RH_data_H%100)/10)+0x30;
        sd[2]= (U8RH_data_H%10)+0x30;
        wd[0]='w';
        wd[1]=((U8T_data_H%100)/10)+0x30;
        wd[2]= (U8T_data_H%10)+0x30;
        flag11=0;                               
        Delay_ms(100);
        led4=1;
    //    Second_AT_Command1("AT+CMGF=1");
        Delay_ms(100);
        led4=0;
    //    AT_Comm("AT+CMGS=\"521061\"");
        Delay_ms(100);
        led4=1;
        Send_Hex(sd[0]);
        Send_Hex(sd[1]);
        Send_Hex(sd[2]);
        Send_Hex(wd[0]);
        Send_Hex(wd[1]);
        Send_Hex(wd[2]);
        Delay_ms(10);
        Send_LR();
        Delay_ms(10);
        Send_Hex(0x1A);
        Send_LR();
        Delay_ms(200);
           CLR_Buf1(); 
        Delay_ms(200);
      }
      led1=0;
      Delay_ms(500);
      led1=1;
      Delay_ms(500);



    } 
} 

void t0(void) interrupt 1 using 0 

{ 
  TH0=(65536-50000)/256; 
  TL0=(65536-50000)%256; 
} 
搜索更多相关主题的帖子: 单片机 短信 
2013-11-22 14:51
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
收藏
得分:0 
在线等待,急
2013-11-22 14:59
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:15 
for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
{
    Buf_First_Serial[k] = 0x30; ==> Buf_First_Serial[k] = 0;
}

总有那身价贱的人给作业贴回复完整的代码
2013-11-22 15:18
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
收藏
得分:0 
之前单独的短信收发串口调试是正确的,那是不是说这个写0x30是可以的?
2013-11-22 15:26
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
你这个Buf_First_Serial没有字符串结束符'\0'

总有那身价贱的人给作业贴回复完整的代码
2013-11-22 15:28
baiqtd123456
Rank: 2
等 级:论坛游民
帖 子:8
专家分:78
注 册:2013-11-22
收藏
得分:5 
二楼正解,Buf_First_Serial未初如化,可能会溢出,访问非法内存。
2013-11-22 15:33
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
收藏
得分:0 
按君所说改过后真的好了,真心感谢!不过不明白的是写成‘0’和0x00清零的区别在哪里,若是写30没为什么短信还是能收发呢,Buf应该空了才能收或者发呀
2013-11-22 15:40
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
收藏
得分:0 
哦,明白了,可能读温湿度的时候字节超了,收发别的指令的时候不至于超。
2013-11-22 15:54
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 7楼 吓人感染
写C代码居然不清楚'\0'对字符串的重要性!!!

总有那身价贱的人给作业贴回复完整的代码
2013-11-22 16:07
吓人感染
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2013-11-22
收藏
得分:0 
这个。。。我能说是基础太差了吗。。。大一没有好好学啊,细节上的问题好多一知半解的,以后还请多多指教哦
2013-11-22 16:13
快速回复:为什么一加上strstr函数就死掉了呢,求教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026269 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved