This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with GSM switch and 89c51

I have to make this project for my school but i can't make it run. I've problems with message extraction and with the interrupt. Please help.
This is my code

#include <reg51.h>
#include <string.h>

sbit Water=P2^0;
sbit Window=P2^1;

//declarations

void clear(void);
void tx0(unsigned char);
void delay_sms (unsigned int);
void SMSString(char*text) ;
void init();
void read_text(unsigned char * , unsigned char * , unsigned char *);

unsigned char j,abc;
unsigned char idata msg1[150];
unsigned char rec_no[20];
unsigned char time_date[20];
unsigned char choice=0;
unsigned char idata tmp10[16];

void serial () interrupt 4
{
msg1[abc]=SBUF;
abc++;
RI=0;
}

void main (void)
{
clear();
init();

Window=0;
Water=0;


SMSString("AT\r"); // AT commands to initialize gsm modem
delay_sms(1000);

SMSString( "ATe0\r"); // turn off echo
delay_sms(1000);

SMSString( "AT&W\r"); // save settings
delay_sms(1000);

SMSString( "AT+CMGF=1\r"); // select text mode for sms
delay_sms(1000);

SMSString( "AT+CNMI=2,1,0,0,0\r"); // notification of new sms
delay_sms(1000);

SMSString( "AT+CMGR=1\r"); // AT command to read sms
delay_sms(1000);

do
{
IE=0X90;   // Enable serial interrupt
delay_sms(1000);

// i get a response like this

// +CMGR: "REC UNREAD","+3069********",,"11/04/09,11:26:48+12"
// Window on
// OK
// I think that's the format the 8051 get +CMTI: "SM",1\r+CMGR: "REC UNREAD","+306982037789",,"11/04/09,11:26:48+12"\rStatus\n\rOK\r
// read sms and store in buffer msg1

read_text(msg1,rec_no,time_date);

if(strncmp("Water on",msg1,8)==0)
{
Water=1;
strncpy(tmp10,"Water   Window  ",16);
tmp10[6]=Water;
tmp10[15]=Window;
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>");
delay_sms(1000);
SMSString(tmp10);
SMSString("\n\r");
delay_sms(1000);
}
else  if(strncmp("Water off",msg1,9)==0)
{
Water=0;
strncpy(tmp10,"Water   Window  ",16);
tmp10[6]=Water;
tmp10[15]=Window;
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>");
delay_sms(1000);
SMSString(tmp10);
SMSString("\n\r");
delay_sms(1000);
}
else  if(strncmp("Window on",msg1,9)==0)
{
Window=1;
strncpy(tmp10,"Water   Window  ",16);
tmp10[6]=Water;
tmp10[15]=Window;
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>");
delay_sms(1000);
SMSString(tmp10);
SMSString("\n\r");
delay_sms(1000);
}
else  if(strncmp("Window off",msg1,10)==0)
{
Window=0;
strncpy(tmp10,"Water   Window  ",16);
tmp10[6]=Water;
tmp10[15]=Window;
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>");
delay_sms(1000);
SMSString(tmp10);
SMSString("\n\r");
delay_sms(1000);
}
else  if(strncmp("Status",msg1,6)==0)
{
strncpy(tmp10,"Water   Window  ",16);
tmp10[6]=Water;
tmp10[15]=Window;
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>");
delay_sms(1000);
SMSString(tmp10);
SMSString("\n\r");
delay_sms(1000);
}
else
{
SMSString("AT+CMGS=\"");
SMSString(rec_no);
SMSString("\"+<CR>\r");
delay_sms(1000);
SMSString("Wrong Command");
SMSString("\n\r");
delay_sms(1000);

SMSString(rec_no);
delay_sms(1000);

SMSString(msg1);
delay_sms(1000);
}
SMSString("AT+CMGD=1\r");
delay_sms(1000);

IE=0X00;   // Disable serial interrupt
delay_sms(1000);

}
while(1);
}

void init(void)
{
j=0;
abc=0;
TL1=0XFD; //9600 @ 11.0592
TH1=0xFD;
TMOD=0x20;
SCON=0x50;
TR1=1;
}

void SMSString(unsigned char* text) //function to send SMS using GSM modem
{
while (*text)
{
tx0(*text++);
}
}


void tx0(unsigned char x) //send data to serial port 0
{
EA=0;
SBUF=x;
while(TI==0);
TI=0;
EA=1;
}


void delay_sms (unsigned int count)
{
unsigned int i;
    while(count) {
        i = 115;
                while(i>0) i--;
        count--;
}
}

void read_text( unsigned char *msg,unsigned char *no ,unsigned char *time)
{
unsigned char *temp;
temp=msg;

do
msg++;
while(*msg!='+');

do
msg++;
while(*msg!='+');

do
msg++;
while(*msg!='+');         //  reaching number

do
*no++=*msg++;
while(*msg!='"');         // reaching time

*no++='\0';
msg++;
msg++;
msg++;
do
*time++=*msg++;
while(*msg!='"');         // reaching message
*time='\0';
do
msg++;
while(*msg!='\r');
msg++;
do
*temp++=*msg++;
while(*msg!='\n');       // reaching the end of message
*temp='\0';
}

void clear(void)
{
unsigned char a;
for(a=0;a<100;a++)
msg1[a]=0x00;
}