如题,用51可以控制SIM900A发短信,但是接收总是读取不了,是比较出了问题,还是中断保存函数出了问题,原子哥来帮帮忙!感谢[C]
纯文本查看 复制代码
/*作者:陈奕均时间:2015、3、4功能:实现GSM短信控制 51模块上的开关 open-灯全亮 ,close-灯全灭 *****************************************/#include
#include#define uchar unsigned char#define uint unsigned int#define FOSC_110592M //单片机晶振//uchar SIM900A_CMti[]="+CMTI";uchar SIM900A_OPEN[]="open";uchar SIM900A_CLOSE[]="close";char read_data[70]={1,1,1,1}; // 保存串口接收到的信息uchar receiveready;void Delay1ms(uint c);//延时void SerialInit();//初始化串口void Uart1Send(uchar c); //void Uart1Sends(uchar *str); //串口发送指令void GSM_Iint();//GSM初始化void receive_ready(void); //判断是否接收到短信 这个感觉有问题char *LookFor_Str(uchar *s, uchar *t); //对比短信内容void main(){ P1=0x01; GSM_Iint(); P1=0x02; Delay1ms(1000); while(1) { P1=0x04; //程序达到 指示灯Uart1Sends(read_data); //发送到 电脑 检测 read_data receive_ready(); //等待短信到来,如到来 receiveready=1 if(receiveready) { uchar *p; P1=0x08; Uart1Sends("AT+CMGR=1rn"); //读取短信内容 Delay1ms(3000);//p=strstr(read_data,SIM900A_OPEN);//if(p!=NULL)//{P1=0XFF;Delay1ms(3000);} //p=strstr(read_data,SIM900A_CLOSE);//if(p!=NULL)//{P1=0x00; } } }}/************1毫秒延时*******/void Delay1ms(uint c) { uchar a,b;for (; c>0; c--){ for (b=199;b>0;b--) { for(a=1;a>0;a--); } } }/********************串口初始化*****/void SerialInit(){ TMOD=0x20;//定时器1模式2:10位自动重装 //补充:SIM900A的接收串口能自动识别 2400-115200//#ifdef FOSC_12M //这里根据晶振大小设置不同的数值初始化串口// TH1=0xf3; //装入初值,波特率:2400// TL1=0XF3; //#else TH1=0xFD; //装入初值,波特率:9600 TL1=0XFD; //#endif TR1=1; //打开定时器 /**********SCON=0X50;********/ SM0=0; //设置串行通讯工作模式,10为一步发送,波特率可变,又定时器1的溢出率控制 SM1=1; // 同上,溢出一次发送一位 REN=1; // 串行接受允许位(先设置SM0,SM1再开) EA=1; // 总中断 ES=1; // 串行口中断}/***************发送数据函数 Uart1Send*******/void Uart1Send(uchar c){ SBUF=c; while(!TI);//等待发送信号(TI=1)出现 TI=0;} //串行口连续发送char数组,遇到终止号 将停止void Uart1Sends(uchar *str){ while(*str!='