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