Question

I posted a similar question yesterday But I am not able to edit the code and post more problems, so i am reposting it here. I have connected the gsm modem to LPC2148 and i am sending a simple message "vehicle" to my mobile. I have put in print statements in between so that I know where the program is. It runs all the print statements but the message is not sent!

So here is the code

Main.c

    #include "i2c.h"                      
    #include "LPC214x.H"                                    // LPC2148 MPU Register
    #include <stdio.h>
    #include "gsm.h"
    #include "lcd.h"
    #include "buzzer.h"


    extern int msgflag;                                                     
    /* Main Program Start Here */
    int main(void)
    {  

       PINSEL0 = 0x00000000;        // Enable GPIO on all pins
    PINSEL1 = 0x00000000;
    PINSEL2 = 0x00000000;


      lcd_init();                                           // Initial LCD
      lcd_write_control(0x01);                              // Clear Display  (Clear Display,Set DD RAM Address=0) 
        goto_cursor(0x00);                                  // Set Cursor Line-1
        //lcd_print("gps");                     // Display LCD Line-1  
         lcd_print("gsm");
         gsmperform();  

 }

gsm.c

#include<lpc214x.h>                                                  /*Header file*/
#include "gsm.h"                                                     //header file
#include "lcd.h"
extern unsigned char cmgf[]="AT+CMGF=1";                            //Text format in GSM modem
extern unsigned char cmgs[]="AT+CMGS=\"+919844420844\"";            //Mobile number to which the msg is sent
//extern unsigned char msg[]="*\0";                                //secret code
extern unsigned char msg[]="vehicle";                                  //secret code
extern unsigned char readall[]="AT+CMGR=\"REC UNREAD\"\r\n";
//static unsigned char lat[10];
//static unsigned char lon[11];
//extern int blink;
unsigned char content[7];
void txu1(unsigned char data)                 //Transmit a byte of data through UART1
{
while(!(U1LSR & 0x20));                         // Wait until UART1 ready to send character  
    U1THR = data; 
    lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("data");                      // Display LCD Line-1  
}
unsigned char rxu1()
{
unsigned char p;
while ((U1LSR&0x01)!=1);
p=U1RBR;
return p;
}
/*unsigned char rxu0()
{
unsigned char p;
while ((U0LSR&0x01)!=1);
p=U0RBR;
return p;
}
*/
void sendstring(unsigned char *p)            //Sends a string of data through UART1
{
while(1)
{
if(*p=='\0') break;
txu1(*p++);
}
}
void delaygsm()                           //delay function
{
int i,j;
for(i=0;i<60000;i++)
for(j=0;j<51;j++);
}
void delay2()                             //delay function
{
int i,j;
for(i=0;i<60000;i++)
for(j=0;j<200;j++);
}
unsigned char recuart1()             //recieves a byte from UART1
{
unsigned char p;
while ((U1LSR&0x01)!=1);
p=U1RBR;
return p;
}






void sendmsg(void)
{

sendstring(cmgf);
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("cmgf");                      // Display LCD Line-1  
txu1(0x0d);                                     // equivalent of 
txu1(0x0a);                                     //   enter key
delaygsm();
sendstring(cmgs);
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("cmgs");                      // Display LCD Line-1  
txu1(0x0d);
txu1(0x0a);  
delaygsm();
sendstring(msg);
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("msg");                       // Display LCD Line-1  
//sendstring(lat);
//sendstring(lon);
txu1(0x1a);
delay2();
txu1(0x1a);
}
void initgsm()                               //Initialization of UART0,UART1 and ISR
{
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("begin init");                        // Display LCD Line-1  
    U0LCR=0x83;
U0DLL=0x61;
U0DLM=0x00;
U0LCR=0x03;
U1LCR=0x83;
U1DLL=0x61;
U1DLM=0x00;
U1LCR=0x03;
U1IER=0x01;
U1FCR=0x07;

*/
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("end init");                      // Display LCD Line-1 
    sendmsg();
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("in sendmsg");                        // Display LCD Line-1  

}
void gsmperform(void)
{
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("begin gsm");                     // Display LCD Line-1  
PINSEL0|=0x00050005;
PINSEL1|=0x00000000;
PINSEL2|=0x00000000;

/* nsk   PINSEL0 &= 0xFFF0FFFF;                                 // Reset P0.8,P0.9 Pin Config
  PINSEL0 |= 0x00010000;                                    // Select P0.8 = TxD(UART1)
  PINSEL0 |= 0x00040000;                                    // Select P0.9 = RxD(UART1)
  */


initgsm();
sendstring("ATe0\r\n");
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("ATe0");                      // Display LCD Line-1  
delaygsm();
sendstring("AT+CMGD=1,4\r\n");
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("AT+CMGD");                       // Display LCD Line-1  
delaygsm();
sendstring("AT+CNMI=1,0,0,0\r\n");
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("AT+CNMI");                       // Display LCD Line-1  
delaygsm();
lcd_write_control(0x01);                            // Clear Display  (Clear Display,Set DD RAM Address=0) 
    goto_cursor(0x00);                                  // Set Cursor Line-1
    lcd_print("end gsm");                       // Display LCD Line-1  
}
Was it helpful?

Solution

There are a couple of things here that are fundamentally the wrong way to handle AT commands.

First of all, never, never, never, ever use delays like the function delaygsm. You must change the logic for processing so that you after sending a command, you do absolutely nothing but reading responses from the modem until you get a final result code before starting on the next command. See this answer for details on that.

Turning off echo with ATE0 only gives you slightly less text to parse, but there is no way around. You MUST read and parse the responses given back by the modem. It is not that complicated, just follow the directions given in the answer linked above.

Also notice that AT command lines should be terminated with '\r' (or written as 0x0d) only and nothing else, see this answer for details.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top