The code below doesnt work properly when i burn it into the AT89S52 micro controller. From debugging, the Value of SBUF isn't writing into the array. can any tell me what i did wrong?
#include <reg51.h>
void confirmPBready(void); void BYTEwrite( unsigned char VAL, unsigned char buffLEN, unsigned char *buffADDR); void sendAT(unsigned char *buf); bit COMP_buff2buff( unsigned char *BUFF1, unsigned char *BUFF2, unsigned char LEN); void delay(void); bit OKay( unsigned char *BUFF1, unsigned char *BUFF2, unsigned char LEN);
unsigned char rcx[13]; code char txtMOD[]="AT+CMGF=1"; code char TE_com[]="AT+CSCS=\"GSM\""; xdata unsigned char GSMRESPONSE[]="AT+CMGS=\"+2349056777712\""; unsigned char respOK[] = "OK"; unsigned char PBcheck[]="+PBREADY"; bit RXDcmpt; //this flag is set if end of a string is detected. bit PBflag; //this flag is set when the MCU gets PB ready message. bit tr; unsigned char rxd_cnt = 0; //counts as value are recievced in the serrial ISR. unsigned char SERIALcase ; //switch case in ISR. unsigned char *loc;
void main() { //INITIALIZATION SCON = 0x50; TMOD = 0x20; TH1 = 0xFD; TR1 = 1; ES = 1; EA = 1; SERIALcase = 1; //set the default of the serial switch case in ISR. PBflag = rxd_cnt = RXDcmpt = 0; //set flag to default.
while(!PBflag) { if(RXDcmpt && !PBflag) //Check if MCU recieved a value confirmPBready(); //Check if its PBready. }
BYTEwrite(0,sizeof(rcx),rcx); //clear buffer
//PBready recievd. Proceed with confirguration.
sendAT(txtMOD); tr = OKay(rcx, respOK, sizeof(respOK)); while(!tr); tr = 0; BYTEwrite(0,sizeof(rcx),rcx); //Command "AT+CMGF=1" receives OK
sendAT(TE_com); tr = COMP_buff2buff(rcx, respOK, sizeof(respOK)); while(!tr); tr = 0; BYTEwrite(0,sizeof(rcx),rcx);
//Command AT+CSCS=\"GSM\" receives OK sendAT(GSMRESPONSE); delay(); sendAT("GSM MODULE TEXT VIA CODING"); delay(); sendAT("0x1A"); }
void delay(void) { unsigned int i; for(i=0;i<25000;i++); }
void BYTEwrite( unsigned char VAL, unsigned char buffLEN, unsigned char *buffADDR) { while(buffLEN) { *buffADDR++ = VAL; //write the value into address. buffLEN--; //decrement the lenght } return; }
bit COMP_buff2buff( unsigned char *BUFF1, unsigned char *BUFF2, unsigned char LEN) { LEN-=2; while(LEN) { if(LEN ==2) break; if(*BUFF1++ != *BUFF2++) //Check if both value in address are same. return 0; //One value is different.
LEN--; //Decrement. } //AT Last, all values are the same in both buffers. return 1; }
void confirmPBready() { if( COMP_buff2buff(rcx , PBcheck, sizeof(PBcheck) ) ) //Check if the value recieved is PBready PBflag = 1; //YES. So set flag. return; }
void serial(void) interrupt 4 { unsigned char RXD_VAL;
if(RI) { RXD_VAL = SBUF; switch(SERIALcase) { case 1: if(RXD_VAL == 0x0D) {//clear the buffer if the value is 0x0D SERIALcase=2; } break; case 2: if(RXD_VAL == 0x0A) {//clear the buffer if the value is 0x0A SERIALcase = 3; // buffer must receive OD n OA first } break; case 3: //keep recieve till your recieve 0x0D if(RXD_VAL == 0x0D) {//the next character should be 0x0A. SERIALcase = 4; //check for 0x0A. } else { rcx[rxd_cnt++] = RXD_VAL; //save the value recieved in rcx buffer } break; case 4: if(RXD_VAL == 0x0A) {//If 0x0A is recieved after 0x0D, then this is the end of recieve frame. RXDcmpt = 1; //set recieve complete flag. } else { rcx[rxd_cnt++] = RXD_VAL; //save the value recieved in rcx buffer } SERIALcase = 1; //its not 0x0A, so go back to keep recieveing till you detect another 0x0D. break; } } RI = 0; }
void sendAT(unsigned char *buf) { while(*buf) { SBUF = *buf++; while(!TI); TI=0; } SBUF = 0x0D; while(!TI); TI=0; }
bit OKay( unsigned char *BUFF1, unsigned char *BUFF2, unsigned char LEN) { while(LEN) { if(*BUFF1++ != *BUFF2++) //Check if both value in address are same. return 0; //One value is different. LEN--; //Decrement. } return 1; //AT Last, all values are the same in both buffers. }
New! That's why I dislike // comments In this unformatted piece of text ....
I LOVE // comments and there is absolutotally no reason to EVER have unfromatted test.
there is only a problem with // comments when somebody believees that some characters willy nilly put in a file constitutes code
The original code did contain lots of comments that got removed in the repost.
Why take already destroyed code from the original post and try to restore to a readable state?
Why not instead return back to the source code editor and once more pick up and paste the code? The main issue wasn't that you pasted from the editor but that you posted without using the required tags around the code.
Trying to repair code broken during the posting process is like taking badly burned food and try to "repair" it to an eatable state - slow and expensive and not likely to give a good result...
http://www.keil.com/forum/62173/