парсер жпс
- Войдите на сайт для отправки комментариев
Пт, 16/02/2018 - 00:14
тк у меня всё еще ничег оне влезает в нану, то начал урезать лишнее - это ЖПС парсер
/*
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 спереди вылезает....
и может специ подскажете как можно еще ужать и оптимизировать код?
не тот скетч, изменить 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; } } } } } }Всмысле откуда 0 берется? Из NMEA $GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,*17 видите там после "N," Потом как преобразуете из строки в число он пропадет, ну если эстетика не позволяет можете сразу его убирать в строке )
З.Ы. Не ленитесь смотреть "сырой" вывод данных после получения их из любого источника. И для отладки элементарно использовать serial.println() чтобы посмотреть состояние всех промежуточных переменных.
спасибо, чтото я это не обратил внимания, думал и широта и долгота по 2 знака имеют....
а по оптимизации чтото можно еще сделать для уменьшения расхода памяти?
спасибо, чтото я это не обратил внимания, думал и широта и долгота по 2 знака имеют....
а по оптимизации чтото можно еще сделать для уменьшения расхода памяти?
Вспомните географию - широта от 0 до 90, а долгота от 0 до 180 - поэтому в широте 2 знака, а в долготе 3
да это вспомнил давно
вопрос по оптимизации остается открытым.... пока только уменьшил массивы чар да изменил пару переменных на инт - но это всего несколько байт....
и еще 1 момент с разбором числа
есть char[12] содержит
просто погрешность такая в координатах дает погрешность на земле порядка 10 метров..... + погрешность самого приемник +-10м - итого 20 метров расходжений както многовато