为什么一加上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;
}









