• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
dane z serial port
#1
Witam wiem że to pewnie banalne ale chciałem zapytać jak wydobyć konkretną informację z komunikatu NMEA(GPS).
czyli z tego :

  $GPVTG,,T,,M,0.859,N,1.591,K,A*2B
  $GPGGA,123201.20,5107.94277,N,01706.05690,E,1,07,1.31,165.4,M,40.4,M,,*59
  $GPGSA,A,3,16,30,05,09,02,23,07,,,,,,3.41,1.31,3.15*0C
  $GPGSV,3,1,11,02,31,263,26,04,39,083,21,05,28,306,20,06,21,217,10*76
  $GPGSV,3,2,11,07,71,167,16,09,56,083,17,16,18,040,23,23,28,088,19*71
  $GPGSV,3,3,11,26,02,021,,29,03,327,08,30,40,205,17*4C
  $GPGLL,5107.94277,N,01706.05690,E,123201.20,A,A*6E
  $GPRMC,123201.40,A,5107.94266,N,01706.05687,E,0.660,,301119,,,A*7C


chciałbym wydobyć w linijce GPVTG, prędkość, czyli 1.591 i przesłać do innej zmiennej.

w tej chwili prosty kod do odczytu:

#include <SoftwareSerial.h>
SoftwareSerial gpsBoard (2, 3, false);

void setup() {
  Serial.begin(115200);
  gpsBoard.begin(9600);
}

void loop() {
  while (gpsBoard.available()) {

    byte c = gpsBoard.read();                  // Read the GPS data
    Serial.print((char)c);
  }
}


i teraz jak ze zmiennej c wydobyć to co mnie interesuje.

Pozdrawiam Serdecznie
 
Odpowiedź
#2
(30-11-2019, 14:35)tabulek napisał(a): Witam wiem że to pewnie banalne ale chciałem zapytać jak wydobyć konkretną informację z komunikatu NMEA(GPS).
czyli z tego :

  $GPVTG,,T,,M,0.859,N,1.591,K,A*2B
  $GPGGA,123201.20,5107.94277,N,01706.05690,E,1,07,1.31,165.4,M,40.4,M,,*59
  $GPGSA,A,3,16,30,05,09,02,23,07,,,,,,3.41,1.31,3.15*0C
  $GPGSV,3,1,11,02,31,263,26,04,39,083,21,05,28,306,20,06,21,217,10*76
  $GPGSV,3,2,11,07,71,167,16,09,56,083,17,16,18,040,23,23,28,088,19*71
  $GPGSV,3,3,11,26,02,021,,29,03,327,08,30,40,205,17*4C
  $GPGLL,5107.94277,N,01706.05690,E,123201.20,A,A*6E
  $GPRMC,123201.40,A,5107.94266,N,01706.05687,E,0.660,,301119,,,A*7C


chciałbym wydobyć w linijce GPVTG, prędkość, czyli 1.591 i przesłać do innej zmiennej.

w tej chwili prosty kod do odczytu:

#include <SoftwareSerial.h>
SoftwareSerial gpsBoard (2, 3, false);

void setup() {
  Serial.begin(115200);
  gpsBoard.begin(9600);
}

void loop() {
  while (gpsBoard.available()) {

    byte c = gpsBoard.read();                  // Read the GPS data
    Serial.print((char)c);
  }
}


i teraz jak ze zmiennej c wydobyć to co mnie interesuje.

Pozdrawiam Serdecznie

Poszukaj pod "extract text string between two different delimiters" Smile
 
Odpowiedź
#3
Gdybyś chciał na stringach, to można to łatwo zrobić w ten sposób:
Kod:
#include <SoftwareSerial.h>
SoftwareSerial gpsBoard (2, 3, false);
String ReadString;

void setup() {
  Serial.begin(115200);
  gpsBoard.begin(9600);
}

void loop()
 {     
  while (gpsBoard.available()) {
    ReadString = Serial.readString();
   }
    ReadString.trim();                        // usuwamy spacje przed $
    if (ReadString.startsWith("$GPVTG")) {    // jeśli string zaczyna się znakami $GPVTG
        for (int x = 0 ; x < 7; x++){         // usuń wszystko do siódmego przecinka
          int pozycja=ReadString.indexOf(',');
            ReadString.remove(0, pozycja+1);
        }
           char Speed[5];           
            for (int i=0; i < 5; i++){ 
              Speed[i]=ReadString.charAt(i);   // przeczytaj pięć pierwszych znaków        
             }
             Serial.print(Speed);
  }
 }

Speed jest stringiem, ale możesz go łatwo zamienić na ciąg cyfr.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
Te dane wyglądają po prostu na NMEA, więc proponuję wpisać w google "Arduino NMEA parser". Pierwszy lepszy wynik:
https://github.com/stevemarple/MicroNMEA
 
Odpowiedź
#5
No kolega tabulek napisał, że to są dane NMEA.
Zapytał też: " jak ze zmiennej c wydobyć to co mnie interesuje."
Mój kod do "wydobycia" tego ma osiem linii kodu i robi dokładnie to, co autor miał na myśli.
Twój kod ma w sumie 540 linii kodu i robi pierdyliard różnych, niepotrzebnych, dla autowa wątku, rzeczy.
Mój kod:
DATA: 325 bytes
PROGRAM: 5368 bytes

Twój kod:
DATA: 806 bytes
PROGRAM: 9470 bytes
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#6
To nie jest mój kod, ja kiedyś parser NMEA pisałem, ale nie pamiętam ile zajmował pamięci.
Chodziło mi tylko o to żeby nie wymyślać od nowa koła i użyć biblioteki - a to co podlinkowałem to był pierwszy przykład. Ogólnie do NMEA jest sporo gotowców, a nawet jeśli nic nie pasuje to można w bibliotece podpatrzeć rozwiązanie i zrobić własne, jeszcze lepsze.
 
Odpowiedź
#7
Ja też myślałem żeby podlinkować jakąś bibliotekę, ale to jest tak proste zadanie, że szybciej mi się kod napisał niż Google szukał. A dotego wiadomo, że nim prostsze rozwiązanie tym lepiej.

Wysłane z mojego LDN-L21 przy użyciu Tapatalka
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
(30-11-2019, 22:53)Robson Kerman napisał(a): Ja też myślałem żeby podlinkować jakąś bibliotekę, ale to jest tak proste zadanie, że szybciej mi się kod napisał niż Google szukał. A dotego wiadomo, że nim prostsze rozwiązanie tym lepiej.

Wysłane z mojego LDN-L21 przy użyciu Tapatalka
Dziękuję Ci serdecznie, o to mi chodziło, biblioteki znam ale tyle zbędnego kodu tak mozolnie działa że odświeżanie prędkości to tragedia, a chcę mieć szybko i dokładnie Wink
 
Odpowiedź
#9
nic nie wyświetla, nie moge znaleźć co jest nie tak ;d
 
Odpowiedź
#10
W normalnej sytuacji napisał bym: debuguj.
Ale programowanie Arduino nie stwarza normalnych sytuacji, więc najlepszym sposobem jest wypisanie zmiennych na serial w istotnych miejscach programu.
Ale zanim zaczniemy, to powinieneś sprawdzić, czy przepisałeś mój kod dokładnie, bo jeśli tak, to tam jest błąd.

Jest:
Kod:
  while (gpsBoard.available()) {
    ReadString = Serial.readString();
   }

Powinno być:
Kod:
  while (gpsBoard.available()) {
    ReadString = gpsBoard.readString();
   }
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości