|
|
View previous topic :: View next topic |
Author |
Message |
aldinlapinig
Joined: 16 Dec 2005 Posts: 22
|
GSM with PIC interface Help needed!!! |
Posted: Tue Aug 08, 2006 2:33 am |
|
|
Hello all,
I am developing a program that will interface a GSM module with PIC through RS232. Can anybody who have tried doing this give me an idea on how I could analyze the reponse from the GSM module evry after I send an AT command to the it? To make this clearer, I'll explain the process I did which unfortunately stuck me up because I couldn't come up with a better algorithm to analyze the reponses of the GSM. Here are what I did: (actually, what the program will do)
* I send AT command to the gsm module.
* I wait for a coressponding time (depending on the command I send) for the response to be received in the serial input buffer.If data is available within the specified time, I read it. Otherwise communication error will be declared.
Example:
tx : "AT"<cr>
rcv : AT<cr><cr><lf>OK<cr><lf>
tx : "AT+IPR=38400"<cr>
rcv : AT+IPR=38400<cr><cr><lf>OK<cr><lf>
tx : "AT+CPIN"<cr>
rcv : AT+CPIN<cr><cr><lf>+CPIN: READY<cr><lf><cr><lf>OK<cr><lf>
Now, the problem I am encountering is that, the module would give me different responses on different AT commands (which is normal) and I don't know how to make a better algorithm for my program to get a certain part of the response I need. I got no problem with the first 2 of the examples above because I only need to get the "OK" status. The problem is detecting other responses and status of the communication like device is "READY" message is "READ" or "UNREAD", the "ERROR ###"... and so on... Is there any other way aside from parsing the data I receive? It would create a very long program to extract the status of the communication just to extract "OK", "READY", "REC READ", ERROR", the "ERROR ###"... Hope I stated the problem clearly enough... thanx guys. Need your help on this.
Have a good day!
kind regards,
aldin |
|
|
jaime
Joined: 25 Nov 2005 Posts: 56 Location: Porto - Portugal
|
|
Posted: Tue Aug 08, 2006 3:57 am |
|
|
I have a litle system that uses a cell phone to control a light.
I use state machine to do the job. I use a outine to read rx interrupt and then analyse what the cell phone sends...
This is my rda routine
Code: | #int_rda
void trata_rda()
/*
two examples of what we can receive
case 1:
LF CR O K CR LF
case 2:
LF CR + C P B R: xxxxxxxxxxxxxxx CR LF CR LF O K CR LF
the program must detect only the LF if it's not CR or LF the program puts in the
buffer[x]
*/
{
temp=getc();
if(temp==0x0A)
{
if(!start_pack)
{
start_pack=true; //start of message
x=0;
}
else if(start_pack && buffer[0]=='+' && !middle_pack && !ok_pack)
middle_pack=true;
else if(start_pack && buffer[0]=='+' && middle_pack && !ok_pack)
ok_pack=true;
else
{
receive_pack=true; //we got the message
buffer[x]=0;
//uncomment the next line to debug
//printf("buffer=%s\r",buffer);
}
}
else if(temp!=0x0A && temp!=0x0D && !ok_pack)
{
buffer[x]=temp;
x++;
}
} |
This is my debug function
Code: | void debug_data()
{
/*
when receive something in the buffer[] we debug to know what's inside
we can have in buffer[] 2 things.
case 1:
short message like:
OK, RING, ERROR, BUSY, NO DIAL TONE.
this type of message only actives a flag
case2:
Long message like:
+CLCC:...
+CPBR:...
this type of message we must decode inside the message
*/
if(!middle_pack)
{
if (buffer[0]=='O') //receive OK
ok=true;
else if(buffer[0]=='R') //receive a ring
ring=true;
else if(buffer[0]=='A') //receive a echo
ok=true;
else
error=true; //receive another short message
}
else
{
//ve se o que recebeu é um +clcc
if(buffer[2]=='L' && buffer[3]=='C' && buffer [4]=='C')
{
clcc=true;
incognito=true; //é um clcc. pesquisa a flag recebida
for(f=1;f<=x;f++) //the caller number is inside " "
{
if(!achei && buffer[f]==0x22 ) //procura a primeira aspa 0x22 = "
achei=true;
else if(achei && buffer[f]!=0x22)//estamos dentro das aspas. guarda o
{ //numero chamador
chamador[i]=buffer[f];
i++;
chamador[i]=0;
incognito=false;
}
else if(achei && buffer[f]==0x22)//segunda aspa indica q acabou o nume
break; //ro chamador
}
}
else if(buffer[2]=='P' && buffer[3]=='B' && buffer [4]=='R')
{
cpbr=true;
for(f=1;f<=x;f++) //the number is inside " "
{
if(!achei && buffer[f]==0x22 ) //0x22 = "
achei=true;
else if(achei && buffer[f]!=0x22)
{
permitido[i]=buffer[f];
i++;
permitido[i]=0;
}
else if(achei && buffer[f]==0x22)
break;
}
}
else if(buffer[2]=='P' && buffer[3]=='B' && buffer [4]=='S')
{
cpbs=true; //the lengh of the card is after,
for(f=1;f<=x;f++)
{
if(!achei && buffer[f]==0x2C ) //0x2D = ,
achei=true;
else if (!encontrei && achei && buffer[f]==0x2C)
encontrei=true;
else if(encontrei)
{
maximo[i]=buffer[f];
i++;
maximo[i]=0;
}
}
sim=atoi(maximo); //convert ascii to decimal
}
}
start_pack=middle_pack=ok_pack=false; //reset das flags de controlo
receive_pack=false;
achei=encontrei=false;
i=f=0;
x=0;
buffer[0]='0';
i=0;
} |
Hope it helps |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|