| 如题,用51可以控制SIM900A发短信,但是接收总是读取不了,是比较出了问题,还是中断保存函数出了问题,原子哥来帮帮忙!感谢
 
[mw_shl_code=c,true]/*
作者:陈奕均
时间:2015、3、4
功能:实现GSM短信控制 51模块上的开关
      open-灯全亮  ,close-灯全灭
	  *****************************************/
#include <reg51.h>
#include<string.h>
#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=1\r\n"); //	读取短信内容
     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数组,遇到终止号\0将停止
void Uart1Sends(uchar *str)
{
  while(*str!='\0')
  {
   SBUF=*str;
   while(!TI);
   TI=0;
   str++;
  }
}
/*******************************************/
//查找字符串,在s中查找t
//返 回 值: s_temp(t在s中的位置)成功 0失败
char *LookFor_Str(uchar *s, uchar *t)
{
	uchar    *s_temp;       
	uchar    *m_temp;       
	uchar    *t_temp;     
	if (s == 0 ||t == 0) return 0;
	for (s_temp = s; *s_temp != '\0'; s_temp++)
	{
		m_temp = s_temp;
		for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
		if (*t_temp == '\0') return 1;
	}
	return 0;
}
/****************GSM初始化******************/
void GSM_Iint()
{
  SerialInit();
  Uart1Sends("AT+CSCS=\"GSM\"\r\n"); //	设置GSM字符
  Delay1ms(3000);
  Uart1Sends("AT+CMGF=1\r\n");		 //设置TEXT文本模式
  Delay1ms(3000);
  Uart1Sends("AT+CMGD=1,4\r\n");	  //删除所有短信
  Delay1ms(3000);
  Uart1Sends("AT+CNMI=2,1\r\n");	   //新消息自动提醒
  Delay1ms(3000);
}
void receive_ready(void)	//检测是否有短信来。
{
	uchar i,p;
	p=LookFor_Str(read_data,"CMTI");
	if(p)		 //如果有新短信(TI)来,模块会通过串口向单片机发送字符串,如果收到CMTI:
	{													 //	此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
 	receiveready=1;
	P1=0x10;
	Delay1ms(3000);
	}
	else
	{
	    P1=0x20;
		Delay1ms(3000);
		for(i=0;i<70;i++)
		{
			read_data=0x00;
		}
	
	}
}
/*************串口中断接受数据 存入read_data[70]*****/ 
void Serial_interrupt() interrupt 4
{					   
  int i=0;
  EA=0;
  if(RI)
  {
   if(i<70)
   {
    read_data[i++]=SBUF;
   }
   RI=0;
   EA=1;
  }
}						   [/mw_shl_code]
 
本人QQ:328580842,谢了! |