如题,用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,谢了! |