Einsteigerfragen

Seit knapp 2 Wochen beschäfftige ich mich mit dem Arduino Duemilanove und frage mich warum ich nicht schon früher mit dem programmieren angefangen habe.

hab mir auch das Buch Arduino "Physical Computing für Bastler, Designer & Geeks" besorgt ... muss leider aber sagen das das Buch eine Menge Fehler aufweisst und für Einsteiger wie mich ... bei manchen Fehlern zur Weissglut führte ^^ aber das beiseite ...

Ich probiere nun Seit Tagen den NMEA String von meinem UBLOX-GPS 4T auseinanderzunehmen was mir auch im einzelnen gelingt.

Der GPRMC String reicht für die meisten Aussagen ja aus ... aber ich hätte gern nach Anzahl der erfassten Sateliten sowie momentane Genauigkeit dafür benötige ich aber noch GPGGA
Also die Auswertung des einzelnen Strings bekomme ich schon hin ... aber immer nur von einem.

Was ich nicht schaffe ist Ihm zu sagen suche gleichzeitig nach "$GPRMC" und "$GPGGA" und schicke mir diese beiden Strings

Entweder entwickle ich immer solch eine logik das er mir garnix mehr ausspuckt weil er kein true mehr bekommt, oder er mir wild alles mögliche des NMEA Strings ausgibt.
Was ich halt nur schaffe ist die Suche nach einem von beiden, dies war mir natürlich nur möglich durch die vielen teils guten tutorials.

mir fällt es sogar schwer die Frage richtig zu formulieren weil ich nicht wirklich sagen kann warum er mich nicht versteht^^

vllt hier mal der momentane Programmstand:(der ist inzwischen ganzschön durcheinandergewürfelt durch die ständigen änderungen

#include <NewSoftSerial.h>
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char HauptZeile[100] ="";
char HauptString[7] ="$GPRMC",NebenString[7]="$GPGGA";
int Hzaehl = 0;
int Hgut = 0;
int Hschlecht = 0;
int Hwerte[13];
//int byteGPGGA=-1;
//char NebenZeile[100] ="";
//char NebenString[7]="$GPGGA";
//int Nzaehl = 0;
//int Ngut = 0;
//int Nschlecht = 0;
//int HNerte[13];

void setup()
{
pinMode(ledPin,OUTPUT);
Serial.begin(38400);
Serial.println("Warte auf Signal");
delay(1000);
gpsSerial.begin(9600);
Serial.println("intialisiere GPS-Port");
delay(1000);
Serial.println("Warte auf GPS-Signal");
Serial.println("--------------------");

for (int i=0;i<100;i++)
{
HauptZeile*=' ';*

  • }[/color]*
    // for (int j=0;j<100;j++)
    // {
    // NebenZeile[j]=' ';
    // }
    }
    void loop()
    {
  • digitalWrite(ledPin, HIGH);*
  • byteGP=gpsSerial.read();*
  • if (byteGP == -1)*
  • {*
  • delay(100);*
  • }*
  • else*
  • {*
  • HauptZeile[Hschlecht]=byteGP;*
  • Hschlecht++;*
  • if (byteGP==13)*
  • {*
  • digitalWrite(ledPin,LOW);*
  • Hzaehl=0;*
  • Hgut=0;*
  • for (int i=1;i<7;i++)*
  • {*
    _ if(HauptZeile*==(HauptString[i-1]))//&&(NebenString[i-1]));_
    _
    {_
    _
    Hgut++;_
    _
    }_
    _
    }_
    _
    if(Hgut==6)_
    _
    {[/color]_
    _
    //for(int i=0;i<70;i++)_
    _
    //{_
    _ // if(HauptZeile==',')
    // {
    // Hwerte[Hzaehl]=i;
    // Hzaehl++;
    // }
    // if(HauptZeile[i++]=='')

    * // {
    // Hwerte[12]=i;
    // Hzaehl++;
    // }
    //}
    Serial.println(HauptZeile);
    //Serial.println(NebenZeile);
    //Serial.println("");
    //for(int i=0;i<12;i++)
    //{
    // switch(i)
    // {
    // case 0 :Serial.print("Zeit = ");//break;
    // }
    //for (int k=Hwerte;k<(Hwerte[i+1]-1);k++)
    //{
    // Serial.print(HauptZeile[k+1]);
    //}
    //}
    }
    Hschlecht=0;
    for (int i=0;i<100;i++)
    {
    HauptZeile=' ';
    }
    }
    }
    }[/color]*_

Wie wärs denn z.B. mit so nem Ansatz:

 for (int i=1;i<7;i++)
     {
       if(HauptZeile[i]==(HauptString[i-1]));
       {
         Hgut++;
       }
       if(HauptZeile[i]==(NebenString[i-1]));
       {
         Ngut++;
       }
     }
     if(Hgut==6)
     {...}
     if(Ngut==6)
     {...}
...

Ersteinmal DANKE schön für Deine rasche Antwort ...

Nicht Wundern bin grad im Raum daher die NMEAdaten...
aber wieder das problem er spuckt mit mehr als nur den GPRMC und GPGGA

$GPGSA,A,1,,,,$GPRMC,,V,,,,,,,,,,N*53
$GPRMC

$GPVTG,,,,,,,,,N*30
$GPRMC

$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPRMC

$GPGSA,A99.99*30
$GPRMC

$GPGSV,1,1,*48
$GPRMC

$GPRMC,,V,,,,,,,,,,N*53
$GPRMC

$GPRMC,,V,,,,,,,,,,N*53
$GPRMC

$GPVTG,,,,,,,,,N*30
$GPRMC

$GPGGA,,,,,,0,00,,*48
$GPRMC

$GPGSA,A,1,,,,,,,,$GPRMC,,V,,,,,,,,,,N*53
$GPRMC

#include <NewSoftSerial.h>
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char HauptZeile[100] ="";
char HauptString[7] ="$GPRMC",NebenString[7]="$GPGGA";
int Hzaehl = 0;
int Hgut = 0;
int Hschlecht = 0;
int Hwerte[13];
//int byteGPGGA=-1;
//char NebenZeile[100] ="";
//char NebenString[7]="$GPGGA";
//int Nzaehl = 0;
int Ngut = 0;
//int Nschlecht = 0;
//int HNerte[13];

void setup()
{
pinMode(ledPin,OUTPUT);
Serial.begin(38400);
Serial.println("Warte auf Signal");
delay(1000);
gpsSerial.begin(9600);
Serial.println("intialisiere GPS-Port");
delay(1000);
Serial.println("Warte auf GPS-Signal");
Serial.println("--------------------");

for (int i=0;i<100;i++)
{
HauptZeile*=' ';*

  • }*
  • // for (int j=0;j<100;j++)*
  • //{*
  • // NebenZeile[j]=' ';*
  • //}*
    }
    void loop()
    {
  • digitalWrite(ledPin, HIGH);*
  • byteGP=gpsSerial.read();*
  • if (byteGP == -1)*
  • {*
  • delay(100);*
  • }*
  • else*
  • {*
  • HauptZeile[Hschlecht]=byteGP;*
  • Hschlecht++;*
  • if (byteGP==13)*
  • {*
  • digitalWrite(ledPin,LOW);*
  • Hzaehl=0;*
  • Hgut=0;*
  • Ngut=0;*
  • for (int i=1;i<7;i++)*
  • {*
    _ if(HauptZeile*==(HauptString[i-1]))_
    _
    {_
    _
    Hgut++;_
    _
    }_
    _ if(HauptZeile==(NebenString[i-1]));
    {
    Ngut++;
    }
    }
    if(Hgut==6)
    {
    //for(int i=0;i<70;i++)
    //{
    // if(HauptZeile==',')
    // {
    // Hwerte[Hzaehl]=i;
    // Hzaehl++;
    // }
    // if(HauptZeile[i++]=='')

    * // {
    // Hwerte[12]=i;
    // Hzaehl++;
    // }
    //}
    Serial.println(HauptZeile);
    //Serial.println(NebenZeile);
    //Serial.println("");
    //for(int i=0;i<12;i++)
    //{
    // switch(i)
    // {
    // case 0 :Serial.print("Zeit = ");//break;
    // }
    //for (int k=Hwerte;k<(Hwerte[i+1]-1);k++)
    //{
    // Serial.print(HauptZeile[k+1]);
    //}
    //}
    }
    if(Ngut==6)
    {
    Serial.println(HauptZeile);
    }*_

* Hschlecht=0; *
* for (int i=0;i<100;i++)*
* { *
_ HauptZeile*=' ';
}
}
}
}[/quote]*

PS: welchen button benötigt man um so ein scrollfenster in den eigenen Post einzuführen Quote war ja falsch_

welchen button benötigt man um so ein scrollfenster in den eigenen Post einzuführen Quote war ja falsch

Der Button "Insert Code" mit #

Öhm, also ich seh jetzt auch den ersten Blick auch nicht, woran das liegt... :-?

Wie wäre es denn generell mit etwas in der Richtung:

loop() {
  while (gpsSerial.available()) {
    hauptZeile[hschlecht] = gpsSerial.read();
    if (hauptZeile[hschlecht++] == '\n') {
      hauptZeile[hschlecht-1] = '\0'; // Ende einer Zeile -> Ende des Strings
      if (hauptZeile[0] == '

Das wäre relativ klein und kompakt, und Du bräuchtest das Array nicht immer aufräumen...

PS: Ist jetzt nur "schnell hingeschmiert", habs nicht getestet. Kann sein, dass noch der ein oder andere Fehler drin ist. :wink:

(Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...) && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'G' && hauptZeile[4] == 'G' && hauptZeile[5] == 'A') {
       Serial.println(hauptZeile); // GPGGA...
     }
     if (hauptZeile[0] == '


Das wäre relativ klein und kompakt, und Du bräuchtest das Array nicht immer aufräumen...

PS: Ist jetzt nur "schnell hingeschmiert", habs nicht getestet. Kann sein, dass noch der ein oder andere Fehler drin ist. ;)

(Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...) && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'R' && hauptZeile[4] == 'M' && hauptZeile[5] == 'C') {
        Serial.println(hauptZeile); // GPRMC...
      }
      hschlecht = 0; // Den Positionszeiger wieder auf den Anfang des Arrays setzen
    }
  }
}

Das wäre relativ klein und kompakt, und Du bräuchtest das Array nicht immer aufräumen...

PS: Ist jetzt nur "schnell hingeschmiert", habs nicht getestet. Kann sein, dass noch der ein oder andere Fehler drin ist. :wink:

(Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)

Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)

Danke für den Tip werd ich mir merken! Darf das doch unter Anfängerfehlerv verbuchen^^ hoffe ich

Und Besonderen Dank für dein Code der hat sofort funktioniert, mir fällt da ne Last im Kopf ab jetzt bin ich endlich wieder ansprechbar^^

Warte auf Signal
intialisiere GPS-Port
Warte auf GPS-Signal

$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48

$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48

$GPRMC,,V,,,,,,,,,,N*53

$GPGGA,,,,,,0,00,99.99,,,,,,*48

PS: und der ist auch noch ziemlich kurz bündig und übersichtlich

Echt klasse danke!!

Kein Problem, gern geschehen. :slight_smile:

Btw. benennt man Variablen in der Regel mit Kleinbuchstaben am Anfang, um sie von Klassen zu unterscheiden...)

Genaugenommen ist es so, daß man oft verschiedene Arten von Entitäten per Namenskonvention auszeichnet. Die "richtige" Namenskonvention hingegen ist oft Anlaß für Glaubenskriege. Genauso wie die "richtige" Einrückung :wink:

Eine "richtige" Konvention hat außerdem häufig schon eine gewisse Länge, also z.B. so C++ Programming Style Guidelines.
C++ Coding Standard ist auch nicht schlecht. Davon abgesehen empfehle ich "Code Complete" :slight_smile:

Gruß, Udo

Hallo nachdem ich nun etwas weiter rumgespielt habe bin ich auf ein Problem gestossen was ich mir noch nicht wirklich erklären kann.

Jenachdem wann ich nach start des Programmes anfange das Signal zu messen "stürzt" das Board meiner Meinung nach ab und macht das gleiche wie beim Reset sprich es fängt von vorn an.

PS: Zum einen glaube ich das das was mit der Anzahl der Zeichen zu tun hat, solange ich Indoor messe läuft das Progrämmchen reibungslos, sobald ich aber GPS habe ... wird igendwas wahrscheinlich überflutet und resetet ... besser kann ich es nicht umschreiben.

//AF,RM,Joghurt
#include <NewSoftSerial.h> 
NewSoftSerial gpsSerial(2, 3); //wobei RX 2 TX 3
int ledPin = 13;

int byteGP=-1;
char hauptZeile[100] ="";
//char HauptString[7] ="$GPRMC";
//char NebenString[7]="$GPGGA";
int hzaehl = 0;
int hgut = 0;
int hschlecht = 0;
int hwerte[13];
int i=6;
int j;
int z=0;

void setup()
{
  pinMode(ledPin,OUTPUT);
  Serial.begin(38400);
  Serial.println("Warte auf Signal");
  delay(1000);
  gpsSerial.begin(9600);
  Serial.println("intialisiere GPS-Port");
  delay(1000);
  Serial.println("Warte auf GPS-Signal");
  Serial.println("--------------------");
  
  for (int i=0;i<100;i++)
  {
    hauptZeile[i]=' ';
  }
}

void loop() {
  while (gpsSerial.available()) {
    hauptZeile[hschlecht] = gpsSerial.read();
    if (hauptZeile[hschlecht++] == '\n') {
      hauptZeile[hschlecht-1] = '\0'; // Ende einer Zeile -> Ende des Strings
      if (hauptZeile[0] == '

Vllt kann das mir mal einer erklären^^ anhand des Programmes
&& hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'R' && hauptZeile[4] == 'M' && hauptZeile[5] == 'C') {
       Serial.println(hauptZeile);// GPRMC..
           i=6;
           z=0;
           while((hauptZeile[i]==',')&&(hauptZeile[i]!='\0'))
           {
             switch(z){
              case 0 :Serial.print("Zeit(UTC)                   = ");break;
              case 1 :if (gpsSerial.read() == 'A')  // Wenn Signal aktiv schreibe "Signal aktiv
                      {
                        Serial.print("Signal aktiv                = ");;break;
                      }
                      else
                      {
                        Serial.print("ungueltiges Signal          = ");};break;
              case 2 :Serial.print("Breitengrad                 = ");break;
              case 3 :Serial.print("Ausrichtung (N=Nord/S=Sued) = ");break;
              case 4 :Serial.print("Laengengrad                 = ");break;
              case 5 :Serial.print("Ausrichtung (E=Ost/W=West)  = ");break;
              case 6 :Serial.print("Geschwindigkeit (Knoten)    = ");break;
              case 7 :Serial.print("Bewegungsrichtung (Grad)    = ");break;
              case 8 :Serial.print("Datum(UTC)                  = ");break;
              case 9 :Serial.print("Missweisung                 = ");break;
              case 10 :Serial.print("Ausrichtung (E=Ost/W=West)  = ");break;
              case 11 :Serial.print("Mode                        = ");
                      delay(100);break;
              //case 12 :Serial.print("Checksum                    = ");
              //         Serial.println("----------------------------");
              //         delay(100);break;
             }

while((hauptZeile[i+1]!=',')&&(hauptZeile[i+1]!='\0'))
             {
               j=i+1;
               Serial.print(hauptZeile[j]);
               i++;              
             }
             Serial.println();
             z++;
             i++;
           }
     }
     if (hauptZeile[0] == '


Vllt kann das mir mal einer erklären^^ anhand des Programmes
 && hauptZeile[1] == 'G' && hauptZeile[2] == 'P' && hauptZeile[3] == 'G' && hauptZeile[4] == 'G' && hauptZeile[5] == 'A') {
        Serial.println(hauptZeile); // GPGGA...
            i=6;
            z=0;
            while((hauptZeile[i]==',')&&(hauptZeile[i]!='\0'))
            {
              switch(z){
               case 0 :Serial.print("Zeit(UTC)                       = ");break;
               case 1 :Serial.print("Breitengrad                     = ");break;
               case 2 :Serial.print("Ausrichtung (N=Nord/S=Sued)     = ");break;
               case 3 :Serial.print("Laengengrad                     = ");break;
               case 4 :Serial.print("Ausrichtung (E=Ost/W=West)      = ");break;
               case 5 :Serial.print("Qualitaet der Messung           = ");break;
                      // Serial.println("0 = ungueltig;1 = GPS; 2 = DGPS; 6 = gschaetzt nur NMEA-0183 2.3");
               case 6 :Serial.print("Anzahl der erfassten Satelliten = ");break;
               case 7 :Serial.print("Genauigkeit in Prozent          = ");break;
               case 8 :Serial.print("Hoehe ueber Meer                = ");break;
               case 9 :Serial.print("Einheit                         = ");break;
               case 10 :Serial.print("Hoehe ueber Ellipsoid           = ");break;
               case 11 :Serial.print("Einheit                         = ");break;
              }

              
              while((hauptZeile[i+1]!=',')&&(hauptZeile[i+1]!='\0'))
              {
                j=i+1;
                Serial.print(hauptZeile[j]);
                i++;               
              }
              Serial.println();
              z++;
              i++;
            }
       }
       
      hschlecht = 0; // Den Positionszeiger wieder auf den Anfang des Arrays setzen
      
    }
  }
}

Vllt kann das mir mal einer erklären^^ anhand des Programmes

Also auf den ersten Blick würde ich schätzen, dass Du in den ersten while-Schleifen das i nicht hochzählst und er daher nicht mehr da raus kommt...? Soll das wirklich ne while sein und nicht mehr ne if?