We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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; }