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]