programa para leer un GPS desde la FRDMKL25Z

Dependents:   pruebagps rastreador_satelital_2 ELJPGTarea_6

Fork of GPS by Simon Ford

Committer:
tony63
Date:
Fri Jun 06 04:04:46 2014 +0000
Revision:
1:653fe36ca211
Parent:
0:15611c7938a3
programa para leer un GPD desde la FRDMKL25Z

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tony63 1:653fe36ca211 1
simon 0:15611c7938a3 2
simon 0:15611c7938a3 3 #include "GPS.h"
simon 0:15611c7938a3 4
simon 0:15611c7938a3 5 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
tony63 1:653fe36ca211 6 _gps.baud(9600);
simon 0:15611c7938a3 7 longitude = 0.0;
simon 0:15611c7938a3 8 latitude = 0.0;
simon 0:15611c7938a3 9 }
simon 0:15611c7938a3 10
simon 0:15611c7938a3 11 int GPS::sample() {
simon 0:15611c7938a3 12 float time;
simon 0:15611c7938a3 13 char ns, ew;
simon 0:15611c7938a3 14 int lock;
simon 0:15611c7938a3 15
simon 0:15611c7938a3 16 while(1) {
simon 0:15611c7938a3 17 getline();
simon 0:15611c7938a3 18
tony63 1:653fe36ca211 19 // Chequear si en una trama GPGGA msg
simon 0:15611c7938a3 20 if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) {
tony63 1:653fe36ca211 21
simon 0:15611c7938a3 22 if(ns == 'S') { latitude *= -1.0; }
simon 0:15611c7938a3 23 if(ew == 'W') { longitude *= -1.0; }
simon 0:15611c7938a3 24 float degrees = trunc(latitude / 100.0f);
simon 0:15611c7938a3 25 float minutes = latitude - (degrees * 100.0f);
simon 0:15611c7938a3 26 latitude = degrees + minutes / 60.0f;
simon 0:15611c7938a3 27 degrees = trunc(longitude / 100.0f * 0.01f);
simon 0:15611c7938a3 28 minutes = longitude - (degrees * 100.0f);
simon 0:15611c7938a3 29 longitude = degrees + minutes / 60.0f;
simon 0:15611c7938a3 30 return 1;
tony63 1:653fe36ca211 31
simon 0:15611c7938a3 32 }
simon 0:15611c7938a3 33 }
simon 0:15611c7938a3 34 }
simon 0:15611c7938a3 35
simon 0:15611c7938a3 36 float GPS::trunc(float v) {
simon 0:15611c7938a3 37 if(v < 0.0) {
simon 0:15611c7938a3 38 v*= -1.0;
tony63 1:653fe36ca211 39 v = floor(v); //floor devuelve el entero mas grande no mayor a v
simon 0:15611c7938a3 40 v*=-1.0;
simon 0:15611c7938a3 41 } else {
simon 0:15611c7938a3 42 v = floor(v);
simon 0:15611c7938a3 43 }
simon 0:15611c7938a3 44 return v;
simon 0:15611c7938a3 45 }
simon 0:15611c7938a3 46
simon 0:15611c7938a3 47 void GPS::getline() {
tony63 1:653fe36ca211 48 while(_gps.getc() != '$'); // coje todo menos $
simon 0:15611c7938a3 49 for(int i=0; i<256; i++) {
tony63 1:653fe36ca211 50 msg[i] = _gps.getc(); //lo va gravando en la cadena msg[ ]
tony63 1:653fe36ca211 51 if(msg[i] == '\r') { // si se encuentra retorno de carro le pone el null
simon 0:15611c7938a3 52 msg[i] = 0;
tony63 1:653fe36ca211 53 return;
simon 0:15611c7938a3 54 }
simon 0:15611c7938a3 55 }
simon 0:15611c7938a3 56 error("Overflowed message limit");
simon 0:15611c7938a3 57 }