Sharing of codes regarding different interfacing of electronics modules.

Homepage

GSM Interfacing

#include "mbed.h"
#include <pic18f4550.h>
#include "Configuration_Header_File.h"
#include "LCD_16x2_8-bit_Header_File.h"
#include "USART_Header_File.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



void GSM_Init();
void GSM_Calling(char *);
void GSM_HangCall();
void GSM_Response();
void GSM_Response_Display();
void GSM_Msg_Read(int);
int GSM_Wait_for_Msg();
void GSM_Msg_Display();
void GSM_Msg_Delete(unsigned int);
void GSM_Send_Msg(const char* , const char*);


char buff[160];                             /* buffer to store responses and messages */
volatile char status_flag;                  /* monitor to check for any new message */
volatile int a;
unsigned int mobile_no[14];
unsigned char msg_received[60];
unsigned int position=0;
void main(void) 
{
    a=0;
    int is_message_arrived=0;
    OSCCON =0x72;       /* set internal oscillator Freq = 8 MHz*/
    LCD_Init();         /* initialize LCD */
    INTCONbits.GIE=1;   /* enable Global Interrupt */
    INTCONbits.PEIE=1;  /* enable Peripheral Interrupt */
    PIE1bits.RCIE=1;    /* enable Receive Interrupt */
    MSdelay(100);
    USART_Init(9600);   /* initialize USART communication */        
    GSM_Init();         /* check GSM responses and initialize GSM */
    
//    LCD_Clear();
//    LCD_String("Sending SMS...");
//    MSdelay(3000);
////    
//    GSM_Send_Msg("8007332284","TEST");  /*send sms on "mobile no."*/
//    MSdelay(3000);
    LCD_Clear();
    while(1)
    {   
        LCD_Clear();
        /* waiting for message to receive */
        LCD_String_xy(0,0,"waiting for msg");
    //    status_flag=0;
        if(status_flag==1)
        {
            LCD_Clear();
//            LCD_String_xy(0,0,"New msg arrive");
//            MSdelay(1000);
        //    LCD_Clear();
            is_message_arrived = GSM_Wait_for_Msg();                 /*wait for new message to read */
            if(is_message_arrived==1)
            {
                LCD_String_xy(0,0,"New msg arrive");
                GSM_Msg_Read(position);
            }
            MSdelay(3000);
            is_message_arrived==0;            
            status_flag = 0;            
        }
    MSdelay(1000);
    }
  //  while(1);
}


void GSM_Init()
{   
    while(1)
    {   
        LCD_Command(0xc0);
        USART_SendString("ATE0\r");   /* send AT to check module is ready or not*/
        MSdelay(500);
        if(strstr(buff,"OK"))
        {
            GSM_Response();                 /* find response and display it on LCD16x2 */
            memset(buff,0,160);
            break;
        }
        else
        {    
            LCD_String("Error");
        }
    }
    MSdelay(2000);

    LCD_Clear();
	LCD_String_xy(0,0,"Text Mode"); 
    LCD_Command(0xc0);
	USART_SendString("AT+CMGF=1\r");/* select message format as text */
    GSM_Response();
	MSdelay(2000);
    
    LCD_Clear();
	LCD_String_xy(0,0,"Mfd name");  
    LCD_Command(0xc0);
	USART_SendString("AT+GMI\r");   /* identify manufacturer */
    GSM_Response();
	MSdelay(2000);
    
    LCD_Clear();
	LCD_String_xy(0,0," Model No.");
    LCD_Command(0xc0);
	USART_SendString("AT+GMM\r");   /* find model no. */
    GSM_Response();
	MSdelay(2000);
    
	LCD_Clear();
	LCD_String_xy(0,0,"  IMEI No. ");
    LCD_Command(0xc0);
	USART_SendString("AT+GSN\r");   /* find IMEI no. of module */
    GSM_Response();
	MSdelay(2000);
        
    LCD_Clear();
	LCD_String_xy(0,0,"Service Provider");
    MSdelay(1000);
    LCD_Clear();
    LCD_Command(0xc0);
	USART_SendString("AT+CSPN?\r"); /* find service provider name */
    GSM_Response();
	MSdelay(2000);

}

void GSM_Msg_Delete(unsigned int position)
{
    
    a=0;
    char delete_cmd[20];    
    sprintf(delete_cmd,"AT+CMGD=%d\r",position);    /* delete message at specified position */
    USART_SendString(delete_cmd);
    MSdelay(100);
    memset(buff,0,strlen(buff));
}
int GSM_Wait_for_Msg()
{
    char i,val[4];
    
    LCD_Clear();
    a=0;
    while(1)
    {
        if(buff[a]==0x0d || buff[a]==0x0a) /*eliminate "\r \n" which is start of string */
        {
            a++;
        }
        else
            break;
    }
    
    if(strstr(buff,"CMTI:"))               /* check if any new message received */
    {   
        while(buff[a]!=',')
        {
            a++;
        }
        a++;
        
//        LCD_Command(0x80);
//        LCD_String("Position: ");        /* display position of message received */
        i=0;
        while(buff[a]!=0x0d)
        {
            val[i]=buff[a];
//            LCD_Char(buff[a]);           /* display position of new message where it is stored */
            a++;
            i++;
        } 
    position = atoi(val);
    if(position>20)
    {
        LCD_String_xy(0,0,"Msg mem full");
        memset(buff,0,strlen(buff));
        return 2;
    }
    memset(buff,0,strlen(buff));
    a=0;
      return 1;
//    GSM_Msg_Read(position);             /* read message which is recently arrived from position */
    }
    else
    {
        return 0;
    }
//    status_flag = 0; 
}

void interrupt ISR()
{
    if(RCIF)
    {
        buff[a] = RCREG;                /* read received byte from serial buffer */
        a++;
        
        if(RCSTAbits.OERR)              /* check if any overrun occur due to continuous reception */
        {           
            CREN = 0;
            NOP();
            CREN=1;
        }
        status_flag=1;                  /* use for new message arrival */
    }

}

void GSM_Send_Msg(const char *num,const char *sms)
{
    int i;
    char sms_buffer[35];
    a=0;
    sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
    USART_SendString(sms_buffer);               /*send command AT+CMGS="Mobile No."\r */
    MSdelay(200);
    while(1)
    {
        if(buff[a]==0x3e)                       /* wait for '>' character*/
        {
            a=0;
            memset(buff,0,strlen(buff));
            USART_SendString(sms);              /* send msg to given no. */
            USART_TxChar(0x1a);                 /* send Ctrl+Z then only message will transmit*/
            break;
        }  
        a++;
    }        
    MSdelay(300);
    a=0;
    memset(buff,0,strlen(buff));
    memset(sms_buffer,0,strlen(sms_buffer));
}

void GSM_Calling(char *mobile)
{
    char call[20];
    sprintf(call,"ATD%s;\r",mobile);		/* send command ATD8007xxxxxx; for calling*/
    USART_SendString(call);    
}

void GSM_HangCall()
{
    USART_SendString("ATH\r");			/*send command ATH\r to hang call*/
}

//void GSM_Response()
//{
//    unsigned int timeout=0;
//    int CRLF_Found=0;
//    char CRLF_buff[2];
//    int Response_Length=0;
//    while(1)
//    {
//        if(timeout>=60000)			/*if timeout occur then return */
//            return;
//        Response_Length = strlen(buff);		
//        if(Response_Length)
//        {
//            MSdelay(1);
//            timeout++;
//            if(Response_Length==strlen(buff))	
//            {
//                for(int i=0;i<Response_Length;i++)
//                {
//                    memmove(CRLF_buff,CRLF_buff+1,1);
//                    CRLF_buff[1]=buff[i];
//                    if(strncmp(CRLF_buff,"\r\n",2))
//                    {
//                        if(CRLF_Found++==2)	/* search for \r\n in string */
//                        {
//                            GSM_Response_Display();
//                            return;
//                        }
//                    }
//
//                }
//                CRLF_Found =0;
//
//            }
//        
//    }
//    MSdelay(1);
//    timeout++;
// }
//}

void GSM_Response(){
    unsigned int timeout=0;
    int Response_Length=0;
//    while(1){
//       if(timeout>=60000)			/*if timeout occur then return */
//            return;
//       Response_Length
        MSdelay(500);
        GSM_Response_Display();
  //  }
}
    

void GSM_Response_Display()
{
    a=0;
    int lcd_pointer=0;
    while(1)
    {
        if(buff[a]==0x0d || buff[a]==0x0a)
        {
            a++;
        }
        else
            break;
    }
    LCD_String_xy(1,0,"                   ");
    LCD_Command(0xc0);
    while(buff[a]!=0x0d)
    {  
        LCD_Char(buff[a]);
        a++;
        lcd_pointer++;
        if(lcd_pointer==15)
            LCD_Command(0x80);
    }
    a=0;
    
        memset(buff,0,strlen(buff));
        
}

void GSM_Msg_Read(int position)
{
    int i,k;
    char flag,read_cmd[10];
    i=0;
    sprintf(read_cmd,"AT+CMGR=%d\r",position);
    USART_SendString(read_cmd);                 
    MSdelay(1000);
    GSM_Msg_Display();
}

void GSM_Msg_Display()
{
    unsigned int m=0;
    if(!(strstr(buff,"+CMGR")))                 /*check for +CMGR response */
    {
            LCD_String_xy(0,0,"No message");   
    }   
    else
    {   
        a=0;
        
        while(1)
        {
            if(buff[a]==0x0d || buff[a]==0x0a)  /*wait till \r\n not over*/
            {
                a++;
            }
            else
                break;
        }
//        while(buff[a]!=0x3a)                    /*wait till string not equal to ':' */
//        {
//            a++;
//        }
        while(buff[a]!=',')
        {
            a++;
        }
        a=a+2;
        while(buff[a]!=0x22)
        {
            mobile_no[m] = buff[a];
            m++;
        }
     do
        {        
            a++;
        }while(buff[a-1]!=0x0a);
        
        LCD_Command(0xC0);
        int i=0;
            while(buff[a]!=0x0d && i<31)
            {
                    msg_received[i]=buff[a];
                    LCD_Char(buff[a]);
                    a++;
                    i++;
                    if(i==16)               /* if received message is greater than 16(for display message)*/
                        LCD_Command(0x80);  /* resume display of message from 1st line */
                    
            }
        
            a=0;
            memset(buff,0,strlen(buff));
    }
    status_flag = 0;
}

[Not found]