ah ok I'll send a code
#include <usart.h>
#include <p18f4550.h>
#pragma config FOSC = HSPLL_HS //HS oscillator, PLL enabled, HS used by USB
#pragma config PLLDIV = 2 //this is used to get 4Mhz out of a 8Mhz xtal and multiply it to 96Mhz
#pragma config WDT = OFF //disable watch dog timer
#pragma config LVP = OFF //disable low voltage programming
//note: at 96Mhz 1000000 delay is equal to 2.35s in the real world...
//rom memory for constants
const rom char gsmAT[] = "AT";
const rom char gsmTxtMode[] = "AT+CMGF=1;&W"; //set gsm to text mode then save
const rom char gsmIsinTxtMode[] = "AT+CMGF?";
const rom char gsmBaudRate[] = "AT+IPR?";
const rom char gsmEchoOff[] = "ATE0";
const rom char gsmReadMessage[] = "AT+CMGR=1";
const rom char gsmDeleteMessage[] = "AT+CMGD=1";
const rom char gsmDeleteInboxMessages[] = "AT+CMGDA=\"DEL INBOX\"";
const rom char gsmSendSMSMessage[] = "AT+CMGS=";
const rom char gsmSendSMSNumber[] = "+639088893767";
const rom char gsmSendSMSSpacing[] = "\r\n";
const rom char gsmSendSMSContent[] = "test";
const rom char gsmSetBaudRate[] = "AT+IPR=57600;&W"; //set gsm to baudrate to 57600 then save
//data memory
#define bufferLength 20
unsigned char bufferCtr=0, x=0, y=0;
unsigned short long z = 0;
char gsmCMDResponseBufferForATEBD[bufferLength];//buffer for response of at, txt mode, echo off, baud rate and Delete; feeds either OK or +CMS ERROR: <number>
char gsmReadMessageResponseBuffer[100];
char gsmResponse[6];
char retries = 0;
char gsmSendSMSMessageBuffer[8];
char gsmSendSMSNumberBuffer[15];
char gsmSendSMSSpacingBuffer[2];
char gsmSendSMSContentBuffer[6];
//prototype
void initBuffer(void);
void sendATtoGSM(void);
void str2ram(static char *, static char rom *);
void setGSMtoTextMode(void);
void setGSMEchoOff(void);
void delay(unsigned long);
void commitGSMReadMessage(void);
void commitGSMDeleteMessage(void);
void commitGSMDeleteInboxMessages(void);
void commitGSMSendMessage(void);
void setGSMInitConfig(void);
void checkIfGSMisReady(void);
void checkGSMBaudRate(void);
void trialAT(void);
void initUSART(void);
void turnOnOrOffGSM(void);
void customGSMResponse(static char *, unsigned char);
void setGSMBaudRate(void);
void sendUART_rom( static const rom char *);
unsigned char responseExpected(char[], char[], unsigned char, unsigned char);
void gsmSetSystemDebugMode(void);
void gsmSetSystemNormalMode(void);
void warningGSMinPDUMode(void);
void commitInterpretMessage(void);
//prototype upto here
void main(){
ADCON1 = 0x0F; //adcon controls all AN port, it can set it to either digital or analog; set (AN0:AN12) to digital input
CMCON = 0x07; //configure PORTA comparators as digital input
TRISA = 0; //set port A to output
PORTA = 0;
TRISE = 0x2; //set PORT E0 to output, PORTE1 to input;
PORTE = 0;
PORTA = 0b00001111;//this is because bit7 is unimplemented that is why only 7 bits are mentioned here
delay(1000000);//supposively this is 2 seconds
PORTA = 0;
TRISD = 0;
PORTD = 0;
PORTDbits.RD1 = PORTEbits.RE1;
delay(1000000);
if(PORTEbits.RE1 == 1){//this will cause the gsm to reset intentionally
turnOnOrOffGSM();
}
PORTDbits.RD1 = PORTEbits.RE1;
delay(1000000);
while(PORTEbits.RE1 != 1){//this block will keep the gsm on
turnOnOrOffGSM();
}
PORTAbits.RA0 = 1;
delay(5000000);//wait for 10 seconds before using gsm
if(PORTEbits.RE1 == 0) //for some reason the block above fails to keep the gsm on
turnOnOrOffGSM();
checkIfGSMisReady();//we will validate the gsm first...
PORTAbits.RA1 = 1;
initBuffer();//if above initialization fails, this will still initialize the buffer
setGSMInitConfig();
PORTAbits.RA2 = 1;
commitGSMReadMessage();
PORTAbits.RA3 = 1;
//commitGSMDeleteMessage();
//commitInterpretMessage();
//commitGSMSendMessage();
commitGSMDeleteInboxMessages();
PORTA = 0;
while(1);
}
void sendUART_rom(static const rom char *data){
do{
while(BusyUSART())
;
putcUSART(*data);
}while(*data++!='\0');//condition to continue to the last pointer address however do not include null
}
void initBuffer(){
for(bufferCtr=0; bufferCtr<6; bufferCtr++)
gsmCMDResponseBufferForATEBD[bufferCtr] = ' ';
}
void checkIfGSMisReady(){
x = 1;
while(x){
initUSART();
delay(100000);
trialAT();
for(y=0; y<6; y++){
z=100000;
while(!DataRdyUSART() && z!=0)
z--;
if(!DataRdyUSART())
gsmResponse[y] = '*';
else
gsmResponse[y] = getcUSART();
}
if(gsmResponse[2] == 'O' && gsmResponse[3] == 'K')
x=0;
delay(50000);
retries++;
PORTA = retries%16;
if(retries%16==0){//this is a fail safe feature just in case the gsm does not respond properly it will force the gsm to restart
turnOnOrOffGSM();
}
CloseUSART();
}
}
void checkIfGSMisInTextMode(){//this will inquire about the current status of the GSM
initBuffer();
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmIsinTxtMode);//check if now gsm is in text mode
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
while(!('1'==gsmCMDResponseBufferForATEBD[9])){
setGSMtoTextMode();
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmIsinTxtMode);//check if now gsm is in text mode
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
delay(1000000);
}
initBuffer();
}
void checkGSMBaudRate(){//this will inquire about the current status of the GSM
initBuffer();
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmBaudRate);//inquire first if gsm is in text mode
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
while(!('5'==gsmCMDResponseBufferForATEBD[8] && '7'==gsmCMDResponseBufferForATEBD[9] && '6'==gsmCMDResponseBufferForATEBD[10]
&& '0'==gsmCMDResponseBufferForATEBD[11] && '0'==gsmCMDResponseBufferForATEBD[12])){
setGSMBaudRate();
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmBaudRate);//check if now gsm is in text mode
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
delay(1000000);
}
initBuffer();
}
void setGSMtoTextMode(){
initBuffer();
while(!('O'==gsmCMDResponseBufferForATEBD[2] && 'K'==gsmCMDResponseBufferForATEBD[3])){
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmTxtMode);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
delay(1000000);
}
initBuffer();
}
void setGSMBaudRate(){
while(!('O'==gsmCMDResponseBufferForATEBD[2] && 'K'==gsmCMDResponseBufferForATEBD[3])){
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmSetBaudRate);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmTxtModeResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
delay(1000000);
}
initBuffer();
}
void setGSMEchoOff(){
while(!('O'==gsmCMDResponseBufferForATEBD[2] && 'K'==gsmCMDResponseBufferForATEBD[3])){
initUSART();
putcUSART(0xA);//new line;
putcUSART(0x0D);//carriage return "\r"
sendUART_rom(gsmEchoOff);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmEchoOffResponseBuffer, 6);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
delay(1000000);
}
initBuffer();
}
void delay(unsigned long ctr){
while(ctr!=0)
ctr--;
}
void commitGSMReadMessage(){
initUSART();
delay(500000);//delay for a second before reading data
putcUSART(0xA);//new line;
sendUART_rom(gsmReadMessage);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmReadMessageResponseBuffer, 70);
customGSMResponse(gsmReadMessageResponseBuffer, 100);
CloseUSART();
delay(50000);
}
void commitGSMDeleteMessage(){
initBuffer();
while(!('O'==gsmCMDResponseBufferForATEBD[2] && 'K'==gsmCMDResponseBufferForATEBD[3])){
initUSART();
delay(50000);
putcUSART(0xA);//new line;
sendUART_rom(gsmDeleteMessage);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmReadMessageResponseBuffer, 70);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
CloseUSART();
}
delay(50000);
}
void commitGSMDeleteInboxMessages(){
initBuffer();
initUSART();
delay(50000);
putcUSART(0xA);//new line;
sendUART_rom(gsmDeleteInboxMessages);
putcUSART(0x0D);//carriage return "\r"
//getsUSART(gsmReadMessageResponseBuffer, 70);
customGSMResponse(gsmCMDResponseBufferForATEBD, bufferLength);
delay(4000000);//wait for the gsm to completely delete all messages before closing usart
CloseUSART();
delay(50000);
}
void setGSMInitConfig(){//write initial settings of gsm
checkGSMBaudRate();
checkIfGSMisInTextMode();//checking and setting done in a single fashion
}
void str2ram(static char *dest, static char rom *src){
while ((*dest++ = *src++) != '\0')
;
}
void commitGSMSendMessage(){
initUSART();
delay(8000000);//allow gsm to breathe
putcUSART(0xA);//new line
putcUSART(0x0D);//carriage return
str2ram(gsmSendSMSMessageBuffer, gsmSendSMSMessage);
putsUSART(gsmSendSMSMessageBuffer);//send message command
putcUSART(0x22);//"
str2ram(gsmSendSMSNumberBuffer, gsmSendSMSNumber);
putsUSART(gsmSendSMSNumberBuffer);//number
putcUSART(0x22);//"
str2ram(gsmSendSMSSpacingBuffer, gsmSendSMSSpacing);
putsUSART(gsmSendSMSSpacingBuffer);//number
delay(50000);
str2ram(gsmSendSMSContentBuffer, gsmSendSMSContent);
putsUSART(gsmSendSMSContentBuffer);//content
putcUSART(0x1A);//control z : 0x1A in hex, 26 in deci
delay(8000000);//allow gsm to breathe
CloseUSART();
}
void trialAT(){
putcUSART(0xA);//new line;
sendUART_rom(gsmEchoOff);
putcUSART(0x0D);//carriage return "\r"
CloseUSART();
delay(100000);
initUSART();
sendUART_rom(gsmAT);
putcUSART(0x0D);//carriage return "\r"
}
void initUSART(){
OpenUSART(USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX & //FOSC 48000000
USART_BRGH_HIGH, 51); //baud rate is equal to SPGRGH SETTING found at page 251 of data sheet//51 is equal to 57600
//fOSC/(16 * (val + 1)) at high speed
//fOSC/(64 * (val + 1)) at low speed
// OpenUSART(USART_TX_INT_OFF &
// USART_RX_INT_ON &
// USART_ASYNCH_MODE &
// USART_EIGHT_BIT &
// USART_CONT_RX &
// USART_BRGH_LOW, 77); //since our FOSC acutally is 48Mhz not just 8Mhz due to PLLDiv and our desired baud rate is 9600
}
void turnOnOrOffGSM(){
PORTEbits.RE0 = 1;//one long press
delay(2500000); //approx 5s
PORTEbits.RE0 = 0;
delay(8000000);//approx 16s
}
void customGSMResponse(static char *destination, unsigned char len){
char messageBuffer[100];
char *messagePointer;
unsigned char messageFlag = 1;
for(y=0; y<len; y++){
z=500000;
while(!DataRdyUSART() && z!=0){
z--;
if(z==0){
messageBuffer[y] = '*';
break;
}
}
if(z!=0)
messageBuffer[y] = getcUSART();
}
messagePointer = 0;
messagePointer = &messageBuffer[0];
while((*destination++ = *messagePointer++) != '\0');
}
unsigned char responseExpected(char expectedResponse[], char GSMResponse[], unsigned char expectedLen, unsigned char responseLen){
//from here on we verify two things, we veriry both length filtered message and content
unsigned char isCorrect = 1;
unsigned char ctr=0;
char messageBuffer[100];//It seems as though it doesn't matter if its 100 or 6 since it doesn't seem to affect the data memory
for(y=0; y<responseLen; y++)//this block will count the number of characters in the response
if(GSMResponse[y] == 0xA || GSMResponse[y] == 0xD || GSMResponse[y] == ' ')
ctr++;
if(expectedLen != (responseLen - ctr))
isCorrect = 0;
if(isCorrect == 1){
for(y=0; y<responseLen; y++)//this block will extract the message for easy comparison
if(GSMResponse[y] == 0xA || GSMResponse[y] == 0xD || GSMResponse[y] == ' ')
;
else{
messageBuffer[x] = GSMResponse[y];
x++;
}
for(y=0; y<expectedLen; y++)//this block will compare the extracted message to the expected message
if(messageBuffer[y] != expectedResponse[y])
isCorrect = 0;
}
return isCorrect;
}
void commitInterpretMessage(){//this block will check for the message either ^0000^ for normal mode and ^0001^ for debug mode and for future options
y = -1;
for(x=0; x<100; x++)//this block will track the locatio of the first ^
if(gsmReadMessageResponseBuffer[x] == 'z'){
y = x;
break;
}
if(y!=-1){//first z has been found
if(gsmReadMessageResponseBuffer[y] == 'z' && gsmReadMessageResponseBuffer[y + 1] == '0' && gsmReadMessageResponseBuffer[y + 2] == '0' &&
gsmReadMessageResponseBuffer[y + 3] == '0' && gsmReadMessageResponseBuffer[y + 4] == '0' && gsmReadMessageResponseBuffer[y + 5] == 'z')
gsmSetSystemNormalMode();
else if(gsmReadMessageResponseBuffer[y] == 'z' && gsmReadMessageResponseBuffer[y + 1] == '0' && gsmReadMessageResponseBuffer[y + 2] == '0' &&
gsmReadMessageResponseBuffer[y + 3] == '0' && gsmReadMessageResponseBuffer[y + 4] == '1' && gsmReadMessageResponseBuffer[y + 5] == 'z')
gsmSetSystemDebugMode();
}
else
warningGSMinPDUMode();
}
void gsmSetSystemDebugMode(){
for(x=0; x<16; x++){
PORTA = x%16;
delay(500000);
}
}
void gsmSetSystemNormalMode(){
for(x=0; x<16; x++){
PORTA = x%8;
delay(500000);
}
}
void warningGSMinPDUMode(){
for(x=0; x<16; x++){
PORTA = x%4;
delay(500000);
}
}