парсер жпс

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

тк у меня всё еще ничег оне влезает в нану, то начал урезать лишнее - это ЖПС парсер

/*
   This Arduino sketch will log GPS NMEA data to a SD card every second
*/

#include <SoftwareSerial.h>
#include <SD.h>


// The Arduino pins used by the GPS module
static const int GPS_ONOFFPin = A3;
static const int GPS_SYSONPin = A2;
static const int GPS_RXPin = A1;
static const int GPS_TXPin = A0;
static const int GPSBaud = 9600;
static const int chipSelect = 10;

// The GPS connection is attached with a software serial port
SoftwareSerial Gps_serial(GPS_RXPin, GPS_TXPin);


void setup()
{    
  // Init the GPS Module to wake mode
  pinMode(GPS_SYSONPin, INPUT);
  pinMode(GPS_ONOFFPin, OUTPUT);
  digitalWrite( GPS_ONOFFPin, LOW );   
  delay(5); 
  if( digitalRead( GPS_SYSONPin ) == LOW )
  {
     // Need to wake the module
    digitalWrite( GPS_ONOFFPin, HIGH ); 
    delay(5); 
    digitalWrite( GPS_ONOFFPin, LOW );      
  } 
     
  
  // Open the debug serial port at 9600
  Serial.begin(9600);
 
  // Open the GPS serial port  
  Gps_serial.begin(GPSBaud);  
   
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");   
}


int inByte = 0;         // incoming serial byte
byte pbyGpsBuffer[100];
int byBufferIndex = 0;

void loop()
{
  byte byDataByte;
  
  if (Gps_serial.available())
  {
     byDataByte = Gps_serial.read();
    
     Serial.write(byDataByte);
     pbyGpsBuffer[ byBufferIndex++ ] = byDataByte;
     
     if( byBufferIndex >= 100 )
     {
       byBufferIndex = 0;       
       File dataFile = SD.open("gps.txt", FILE_WRITE);
    
       // if the file is available, write to it:
       if (dataFile) {
        dataFile.write(pbyGpsBuffer, 100);
        dataFile.close();
      }  
      // if the file isn't open, pop up an error:
      else {
        Serial.println("error opening gps.txt");
      }        
     }      
  }
}

но чтото я гдето не верно разбираю и никак не могу понять что именно

результат работы

Tim: 200258.679
Lat: 5432.3446
Lon: 03618.1840
 
в долготе лишний символ цепляю -  0 спереди вылезает....
 
и может специ подскажете как можно еще ужать и оптимизировать код?
ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

не тот скетч, изменить 1й пост нельзя

вот код


#include <SoftwareSerial.h>

SoftwareSerial gps(A2, 255);

char ch = 0;
int cnt = 0;
int csv = 0;
int fix = 0;
int res = 1;
char dat[16];
char tim[16];
char lat[16];
char lng[16];

void setup() 
{
  Serial.begin(9600);
  gps.begin(9600);
}

void loop() 
{
  if(gps.available())
  {
    ch=gps.read();
    //Serial.print(ch);

    // simple parser, start with $
    if(ch == '$')
    {
      cnt = 0;
      csv = 0;
      fix = 0;
    }
    else
    {
      dat[cnt++] = ch;
      
      if(ch == ',')
      {
        dat[--cnt] = 0;
        cnt = 0;
        csv++;

        if(csv == 1)
        {
          res = strcmp(dat,"GPGGA");
          if(res == 0)
            fix = 1;
        }

        // Assume N, E
        if(fix == 1)
        {
          if(csv == 2)
            strcpy(tim, dat);
          else if(csv == 3)
            strcpy(lat, dat);
          else if(csv == 5)
            strcpy(lng, dat);
          else if(csv == 6)
          {
            Serial.print("Tim: ");
            Serial.println(tim);
            Serial.print("Lat: ");
            Serial.println(lat);
            Serial.print("Lon: ");
            Serial.println(lng);
            fix = 0;
          }
        }
      }
    }
  }
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Всмысле откуда 0 берется? Из NMEA $GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,*17 видите там после "N," Потом как преобразуете из строки в число он пропадет, ну если эстетика не позволяет можете сразу его убирать в строке )

З.Ы. Не ленитесь смотреть "сырой" вывод данных после получения их из любого источника. И для отладки элементарно использовать serial.println() чтобы посмотреть состояние всех промежуточных переменных.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

спасибо, чтото я это не обратил внимания, думал и широта и долгота по 2 знака имеют....

а по оптимизации чтото можно еще сделать для уменьшения расхода памяти?

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

спасибо, чтото я это не обратил внимания, думал и широта и долгота по 2 знака имеют....

а по оптимизации чтото можно еще сделать для уменьшения расхода памяти?

Вспомните географию -  широта от 0 до 90, а долгота от 0 до 180 - поэтому в широте 2 знака, а в долготе 3

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да это вспомнил давно

вопрос по оптимизации остается открытым.... пока только уменьшил массивы чар да изменил пару переменных на инт - но это всего несколько байт.... 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

и еще 1 момент с разбором числа

есть char[12] содержит 

: 094527.692  //время
: 5432.3288   //дол.
: 03618.1661 //шир.
: 001.1         //скорость
: 013.3        //направление
: 160218    // дата
 
преобразую с числа
 
         if(csv == 2)      { strcpy(tmpchar, data); tim=atol(tmpchar);}
          else if(csv == 4) { strcpy(tmpchar, data); lat=atof(tmpchar)/100; }
          else if(csv == 6) { strcpy(tmpchar, data); lng=atof(tmpchar)/100; }
          else if(csv == 8) { strcpy(tmpchar, data); spd=atoi(tmpchar); }
          else if(csv == 9) { strcpy(tmpchar, data); crs=atoi(tmpchar); }
          else if(csv == 10){ strcpy(tmpchar, data); dat=atol(tmpchar); }
и получаю
Tim: 94527
Lat: 54.323287
Lon: 36.181659
spd: 1
crs: 21
dat: 3233430
 
но почему 2 последние строки коверкает не могу понять....
а также почему при конвертации в floaf  идет изменение долей....

просто погрешность такая в координатах дает погрешность на земле порядка 10 метров..... + погрешность самого приемник +-10м - итого 20 метров расходжений както многовато