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

8051 interfacing with sim300

i am able to send msg from gsm to the mobile phone but am not able to receive data from the GSM.
eg..in this code when i send AT to the gsm , i get garbage value on the LCD instead of OK..but with the hyperterminal, the communication is proper with both the 8051 and GSM.

#include<stdio.h>
#include<at89x51.h>
#define port P1
#define dataport P2                             // Data port for LCD
sbit rs = port^2;
sbit rw = port^3;
sbit en = port^4;
 int p;
 unsigned char msg[20];
//generates delay in milli seconds
void delay_ms(unsigned int i)
{
unsigned int j;
        while(i-->0)
        {
                for(j=0;j<500;j++)
                {
                        ;
                }
        }
}

void command(unsigned char dost)
   {
   dataport=dost;                  //put the value on pin
   rs=0;
   rw=0;
   en=1;         //strobe the enable pin
   delay_ms(5);
   en=0;
   }



void lcddisplay(unsigned char word)
   {
   dataport=word;           //put the value on pin
   rs=1;
   rw=0;
   en=1;          //strobe the enable pin
   delay_ms(5);
   en=0;
   }

                void lcd_data_string(unsigned char *str)        // Function to display string on LCD
{
        int i=0;
        while(str[i]!='\0')
        {
          lcddisplay(str[i]);
          i++;
          delay_ms(1);
        }
        return;
}

//Function to initialize RS232 Serial Port
void serial_init()
{
        SCON=0x50;   //setup for 8-bit data
        TMOD=0x20;       //setup timer 1 for auto-reload
        TH1=0xfd; //Baud Rate 9600
                TL1=0xfd;
        TR1=1;       //turn on timer 1
        TI=1;            //indicate ready to transmit
}



//This function displays a null-terminated string on the RS232 port
void send_serial(unsigned char *s)
{
while(*s!=0x0)
{
SBUF=*s;
while(!TI)
{
}
TI=0;
s++;
}
}

int i;

void tx0(unsigned char x) //send data to serial port 0
{
EA=0;
SBUF=x;
while(TI==0);
TI=0;
EA=1;
}
void lcd()
{
        command(0x38);                                          // For using 8-bit 2 row LCD
        delay_ms(1);
        command(0x0F);                                          // For display on cursor blinking
        delay_ms(1);
        command(0x80);                                          // Set the cursor on first position of LCD
        delay_ms(1);
}
    char receive(void)
   { // unsigned char m;
        while (RI != 1) {;}     //wait to receive data

 msg[++p]=SBUF;           // save value of data
 RI=0;
 return (msg[p]);

}

void main()
{
p=(-1);
delay_ms(80);
lcd();
delay_ms(50);
serial_init();   //Initialize Serial port.

while(1)
{ int m;
send_serial(" AT");
delay_ms(400);
tx0(0x0D);

m=receive();
command(0x06);
lcddisplay(m);

}
}

Parents
  • It doesn't matter if you poll or use interrupts.

    But you shouldn't base your communication on delays. You should synchronize the communication based on what characters you get back from the modem. Your code doesn't seem to care about any responses from the modem. Do you get any echo back? Do you get any OK back if you send AT? The communication with a modem is a dialogue. So treat it as such instead of just sending out a string and then dummy-wait before starting to listen.

Reply
  • It doesn't matter if you poll or use interrupts.

    But you shouldn't base your communication on delays. You should synchronize the communication based on what characters you get back from the modem. Your code doesn't seem to care about any responses from the modem. Do you get any echo back? Do you get any OK back if you send AT? The communication with a modem is a dialogue. So treat it as such instead of just sending out a string and then dummy-wait before starting to listen.

Children