Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ComGPS by
Revision 1:821bd360ec5b, committed 2015-03-03
- Comitter:
- pfe
- Date:
- Tue Mar 03 13:35:34 2015 +0000
- Parent:
- 0:674a094baf00
- Child:
- 2:4cf92185ed38
- Commit message:
- Decod Msg GPS
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_Decod_Function/DecMsgGPGGA.h Tue Mar 03 13:35:34 2015 +0000
@@ -0,0 +1,187 @@
+unsigned short DecodageGPGGA(unsigned short *P_MsgGPS,unsigned short Ldata) //-------------------------------------------------------
+{
+ unsigned short CommaNbr;
+ unsigned short ii,jj;
+ MSG_GPGGA_Valid = 0;
+ P0_Msg=P_MsgGPS;
+ P_Msg =P0_Msg;
+ ii = 0;
+ if(*P_Msg!='G')goto LabFin;
+ P_Msg++;
+ if(*P_Msg!='P')goto LabFin;
+ P_Msg++;
+ if(*P_Msg!='G')goto LabFin;
+ P_Msg++;
+ if(*P_Msg!='G')goto LabFin;
+ P_Msg++;
+ if(*P_Msg!='A')goto LabFin;
+
+ P_Msg = P0_Msg;
+
+ CommaNbr = 0;
+ for(ii=0;ii<Ldata;ii++)
+ {
+ if(*P_Msg==',')
+ {
+ PosV[CommaNbr] = ii;
+ CommaNbr++;
+ }
+ P_Msg++;
+ }
+ if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA
+ //par le nombre des vergules
+//UTC of position
+ //extraction du temps UTC
+ jj=0;//Identification de la position de la première virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=9) goto LabFin;//Vérification de la longueur du message de temps
+ Set_Data(jj);
+ Validation_StrToFloat(DL);
+ if(Npt !=1) goto LabFin;
+ if(Pospt!=6) goto LabFin;
+ //Vérification de Time "hhmmss"
+ hh=10*(Data[0]-48)+(Data[1]-48);//Extraction de l'heur
+ mm=10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes
+ ss=10*(Data[4]-48)+(Data[5]-48);//Extraction des secondes
+ if((hh>24)||(mm>59)||(ss>59))goto LabFin;
+
+ // 03 byte
+//Latitude of position
+ //extraction du Lattitude
+ jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=10) goto LabFin;//Vérification de la longueur du message de lattitude
+ Set_Data(jj);
+ Validation_StrToFloat(DL);
+ if(Npt !=1) goto LabFin;
+ if(Pospt!=4) goto LabFin;
+
+ //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2"
+ LatDeg =10*(Data[0]-48)+(Data[1]-48);//Extraction des degrés du lattitude
+ LatMin =10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes du lattitude
+ LatMin1=10*(Data[5]-48)+(Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+ LatMin2=10*(Data[7]-48)+(Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+ if((LatDeg>90)||(LatMin>59)||(LatMin1>99)||(LatMin2>99))goto LabFin;
+
+ // 04 byte
+ //Vérification de la direction du Lattitude LatDir(N ou S)
+ jj=2;//Identification de la position de la troisième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude
+ Set_Data(jj);
+ LatDir=Data[0];//Extraction de le direction du latitude
+ if((LatDir!='N')&&(LatDir!='S'))goto LabFin;
+
+ // 01 byte
+//Longitude of position
+ //extraction de la Longitude
+ jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=11) goto LabFin;//Vérification de la longueur du message de la longitude
+ Set_Data(jj);
+ Validation_StrToFloat(DL);
+ if(Npt !=1) goto LabFin;
+ if(Pospt!=5) goto LabFin;
+
+ //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2"
+ LongDeg =100*(Data[0]-48)+10*(Data[1]-48)+(Data[2]-48);//Extraction des degrés de la longitude
+ LongMin =10*(Data[3]-48)+(Data[4]-48);//Extraction des minutes de la longitude
+ LongMin1=10*(Data[6]-48)+(Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+ LongMin2=10*(Data[8]-48)+(Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+ if((LongDeg>180)||(LongMin>59)||(LongMin1>99)||(LongMin2>99))goto LabFin;
+
+ // 04 byte
+ //Vérification de la direction du Longitude LonDir(E ou W)
+ jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude
+ Set_Data(jj);
+ LongDir=Data[0];//Extraction de le direction de la longitude
+ if((LongDir!='E')&&(LongDir!='W'))goto LabFin;
+
+ // 01 byte
+//GPS Quality indicator
+ jj=5;//Identification de la position de la sixième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS
+ Set_Data(jj);
+ Validation_StrToFloat(DL);
+ if(Npt !=0) goto LabFin;
+ if(Pospt!=0) goto LabFin;
+ Qual=Data[0]-48;//Extraction de l'information de la qualité du MsgGPs
+ if((Qual<1)||(Qual>2))goto LabFin;
+
+ // 01 byte
+//Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2" .
+ jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude
+ Set_Data(jj);
+ SignHMSL='+';
+ if(Data[0]=='-')
+ {
+ DL=DL-1;
+ SignHMSL='-';
+ for(ii=0;ii<DL;ii++) Data[ii]=Data[ii+1];
+ }
+ Validation_StrToFloat(DL);
+ if(Npt !=1) goto LabFin;
+ if(Pospt ==0) goto LabFin;
+
+ switch (Pospt)
+ {
+ case 1: {HMSL_L = (Data[0]-48) ; HMSL_H = 0; break;}
+ case 2: {HMSL_L = (Data[1]-48)+10*(Data[0]-48); HMSL_H = 0; break;}
+ case 3: {HMSL_L = (Data[2]-48)+10*(Data[1]-48); HMSL_H = (Data[0]-48); break;}
+ case 4: {HMSL_L = (Data[3]-48)+10*(Data[2]-48); HMSL_H = (Data[1]-48)+10*(Data[0]-48); break;}
+ default : break;
+ }
+ DL=DL-Pospt-1; //La longure de chiffre après la virgule
+ switch (DL)
+ {
+ case 1: {HMSL_1 = (Data[Pospt+1]-48) ; HMSL_2 = 0; break;}
+ case 2: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 0; break;}
+ case 3: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = Data[Pospt+3]-48; break;}
+ case 4: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 10*(Data[Pospt+3]-48)+Data[Pospt+4]-48; break;}
+ default : break;
+ }
+ // 05 byte
+ //Antenna height unit
+ jj=9;//Identification de la position de la dixième virgule dans le MsgGPS
+ DL=Get_Length(jj);
+ if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur
+ Set_Data(jj);
+ HUnite=Data[0];//Extraction de l'unité de la hauteur
+ if((HMSL_H>35)||(HUnite!='M'))goto LabFin;
+ MSG_GPGGA_Valid=1;
+ /* UserWR_buffer[0]++;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[1] = hh;
+ UserWR_buffer[2] = mm;
+ UserWR_buffer[3] = ss;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[4] = LatDeg;
+ UserWR_buffer[5] = LatMin;
+ UserWR_buffer[6] = LatMin1;
+ UserWR_buffer[7] = LatMin2;
+ UserWR_buffer[8] = LatDir;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[9] = LongDeg;
+ UserWR_buffer[10] = LongMin;
+ UserWR_buffer[11] = LongMin1;
+ UserWR_buffer[12] = LongMin2;
+ UserWR_buffer[13] = LongDir;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[14] = Qual;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[15] = HMSL_H;
+ UserWR_buffer[16] = HMSL_L;
+ UserWR_buffer[17] = HMSL_1;
+ UserWR_buffer[18] = HMSL_2;
+ UserWR_buffer[19] = SignHMSL;
+ UserWR_buffer[20] = HUnite;
+// -----------------------------------------------------------------------------
+*/
+LabFin:
+return MSG_GPGGA_Valid;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_Decod_Function/GPS_Init.h Tue Mar 03 13:35:34 2015 +0000
@@ -0,0 +1,57 @@
+unsigned short *P0_Msg,*P_Msg;
+unsigned short MSG_GPGGA_Valid;
+unsigned short MSG_GPRMC_Valid;
+unsigned short DL,Npt,Pospt;
+unsigned short Start,End;
+
+unsigned short hh,mm,ss;
+unsigned short LatDeg,LatMin,LatMin1,LatMin2,LatDir;
+unsigned short LongDeg,LongMin,LongMin1,LongMin2,LongDir;
+unsigned short Qual;
+unsigned short SignHMSL,HMSL_L,HMSL_H,HMSL_1,HMSL_2,HUnite;
+unsigned short dd,yy,mn,val;
+
+unsigned short Data[16],PosV[16];
+//------------------------------------------------------------------------------
+//Calcul de la longueur des sous message
+unsigned short Get_Length(unsigned short index)
+ {
+ unsigned short LongData;
+ LongData=PosV[index+1]-PosV[index]-1;
+ return LongData;
+ }
+//Décomposition du message en Sub message
+void Set_Data(unsigned short index)
+ {
+ unsigned short ii,jj;
+ ii=0;
+ Start = PosV[index]+1;
+ index++;
+ End = PosV[index];
+ P_Msg = P0_Msg+Start;
+ for(jj=Start;jj<End;jj++)
+ {
+ Data[ii]=*P_Msg;
+ P_Msg++;
+ ii++;
+ }
+ }
+//Vérification des sub message
+void Validation_StrToFloat(unsigned short LongData)
+ {
+ unsigned short ii;
+ Npt=0;
+ Pospt=0;
+ for(ii=0;ii<LongData;ii++)
+ {
+ if(Data[ii]=='.')
+ {
+ Npt++;
+ Pospt=ii;
+ }
+ else if((Data[ii]<48)||(Data[ii]>57)) Npt=Npt+2;
+ }
+ }
+//------------------------------------------------------------------------------
+#include "DecMsgGPGGA.h" // GPGGA
+//------------------------------------------------------------------------------
--- a/main.cpp Sun Mar 01 11:39:40 2015 +0000
+++ b/main.cpp Tue Mar 03 13:35:34 2015 +0000
@@ -1,24 +1,87 @@
#include "mbed.h"
#include "C12832.h"
-
-
-Serial GPS(p13, p14); //Pin13 TX, pin14 RX.
+#include "GPS_Init.h"
C12832 lcd(p5, p7, p6, p8, p11);
+Serial pc(USBTX,USBRX); // communication PC à 9600 baud/sec par défaut
+Serial GPS(p9, p10); //Pin9 TX, pin10 RX.
+
+unsigned short UserWR_buffer[32];
+unsigned short NbDataRec,En,Ldata;
+unsigned short MsgGPSRx[65]; // Déclaration d'un vecteur de 65 charactères
+
+
int main() {
- GPS.baud(9600);
- unsigned char GPS_DATA;
+ GPS.baud(9600); // vérifier que votre GPS est à 9600, le plus souvent ils sont à 9600 !!!!!
+ char gps_mess;
lcd.cls();
lcd.locate(0,0);
lcd.printf("GPS FIX");
+
while(1){
+//
if(GPS.readable()){
- GPS_DATA=GPS.getc();
- lcd.locate(0,15);
- lcd.printf("%d",GPS_DATA);
- }
+ gps_mess=GPS.getc();
+ if (gps_mess=='$'){
+ NbDataRec=0;//Initialisation de bbb à 0
+ En=1;
+ while(En){
+ while(!GPS.readable());
+ gps_mess = GPS.getc(); //Lecture du message GPS via USART
+ MsgGPSRx[NbDataRec] = gps_mess; //Stockage du message GPS dans un vecteur
+ NbDataRec++;
+ if((gps_mess==0x0D)||(NbDataRec==65)) En=0; // Vérification de la fin du message
+ }
+ Ldata=NbDataRec;
+ DecodageGPGGA(MsgGPSRx,Ldata);
+
+ if (MSG_GPGGA_Valid){
+ lcd.locate(0,10);
+ lcd.printf("MSG GPS Valid");
+ UserWR_buffer[0]++;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[1] = hh;
+ UserWR_buffer[2] = mm;
+ UserWR_buffer[3] = ss;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[4] = LatDeg;
+ UserWR_buffer[5] = LatMin;
+ UserWR_buffer[6] = LatMin1;
+ UserWR_buffer[7] = LatMin2;
+ UserWR_buffer[8] = LatDir;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[9] = LongDeg;
+ UserWR_buffer[10] = LongMin;
+ UserWR_buffer[11] = LongMin1;
+ UserWR_buffer[12] = LongMin2;
+ UserWR_buffer[13] = LongDir;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[14] = Qual;
+ //-----------------------------------------------------------------------------
+ UserWR_buffer[15] = HMSL_H;
+ UserWR_buffer[16] = HMSL_L;
+ UserWR_buffer[17] = HMSL_1;
+ UserWR_buffer[18] = HMSL_2;
+ UserWR_buffer[19] = SignHMSL;
+ UserWR_buffer[20] = HUnite;
+ pc.printf("%d",hh); // afficher sur la console de PC.
+ MSG_GPGGA_Valid=0;
+ }
+ }
+ }
+
+ // Vous ne pouvez pas afficher un message brut car il fait au moins 40 caractères et en plus le contenue
+ // est brut donc il faut le décoder !!!!! donc affichage à revoir.
+ // Contentez vous d'afficher cela sur le port USB du PC.
+ // il vous faidra pour cela installer le drivers Mbed je le mets en partage sir le compte google drive
+ //il suffit de le lancer
+
+ // afficher sur la console de PC.
+ // utiliser pour cela le programme Terminal.exe que je mets en partage aussi
+ // Vous trouverez le driver terminal + le logiciel Terminal dans le répértoir GPS dans google drive
+
+ //lcd.locate(0,15);
+ //lcd.printf("%d",GPS_DATA); Pas possible pour le moment
+
}
-
-
-
-}
\ No newline at end of file
+ }
