Forum: Mikrocontroller und Digitale Elektronik Problem beim lesen von Daten mit einem Arduino Uno


von Taurus (Gast)


Lesenswert?

Guten Tag Foren-Gemeinde,

ich versuche gerade mit einem Arduino Uno die Daten eines GPS-Empfängers 
via TTL auszulesen - was grundsätzlich auch funktioniert.

Ich hab Zugriff auf den Empfänger, kann ihn konfigurieren und er liefert 
mir auch Daten.

Nun zu meinem Problem, dazu erstmal ein kleiner Datenauszug aus dem 
Monitor:
B5,62,2,10,B0,0,6,68,90,18,C9,6,7,0,
0,0,0,0,0,0,0,0,5D,3,B4,9F,B6,C5,74,41,DC,65,A0,45,1F,4,1E,3,
37,BC,4A,D8,ED,CA,9E,41,E3,49,41,8C,49,70,77,41,92,57,8C,C4,18,7,21,0,
0,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,
FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,
FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,
FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,
FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,

...in der ersten Zeile steht "B0,0" für die Byte-Länge der auf "B0,0" 
folgenden Nachricht (192 Bytes).
Leider fehlen, wie ihr oben im Beispiel seht, gut 50% der Daten 
("FF,FF,FF,...") und mir fehlt total der Ansatz wo ich mit der Suche 
anfangen soll...

Hier mein (nicht komplett vollständiger) Code:
1
void get_gps_data()//Abruf der GPS-Daten 
2
{ 
3
int counter24bits=16;
4
int gps_length_flag=0;
5
int data_counter=0;
6
while(gps_length_flag==0)
7
{ data_counter++;
8
if(data_counter==500)
9
{gps_length_flag=1;}
10
  byteGPS[0]=Serial.read();
11
  Serial.print(byteGPS[0],HEX);
12
  if(byteGPS[0]==0xB5)
13
  { Serial.println("");
14
    Serial.print(byteGPS[0],HEX);Serial.print(",");
15
    byteGPS[1]=Serial.read();
16
    if(byteGPS[1]==0x62)
17
    { Serial.print(byteGPS[1],HEX);Serial.print(",");
18
      byteGPS[2]=Serial.read();
19
      if(byteGPS[2]==0x02)
20
      {Serial.print(byteGPS[2],HEX);Serial.print(",");
21
        byteGPS[3]=Serial.read();
22
       if(byteGPS[3]==0x10)
23
       {
24
         Serial.print(byteGPS[3],HEX);Serial.print(",");
25
         msg_length[0]=Serial.read();
26
         msg_length[1]=Serial.read();
27
         Serial.print(msg_length[0],HEX);Serial.print(",");
28
         Serial.print(msg_length[1],HEX);Serial.print(",");
29
         for(int i1=0;i1<msg_length[0];i1++)
30
         { byteGPS[4]=Serial.read();
31
           if(byteGPS[4]!='kkkkkk')
32
           {counter24bits++;
33
           Serial.print(byteGPS[4],HEX);Serial.print(",");
34
           if(counter24bits==24)
35
         {Serial.println("");
36
       counter24bits=0;}}}
37
         gps_length_flag=1;
38
       }}}}}
39
}

Bin für jede Idee dankbar!!!

Taurus

von holger (Gast)


Lesenswert?

>    byteGPS[1]=Serial.read();
>    if(byteGPS[1]==0x62)
>    { Serial.print(byteGPS[1],HEX);Serial.print(",");

Du liest ein Byte. Dann sendest du drei Byte.
Wenn das mit der gleichen Baudrate passiert
gehen dir während du sendest schon mal zwei Byte beim
empfangen verloren wenn du darauf wartest das die
drei Bytes gesendet wurden. Das GPS wartet nicht darauf
bis du mit deinem Senden fertig bist. Das bläst dir munter
den Empfangspuffer weiter voll bis er überläuft.

von Taurus (Gast)


Lesenswert?

Ich wußte das das Problem simpler Natur sein würde... macht auf 
jedenfall Sinn.
Werd mich morgen dran machen und das Lesen der Daten von der Ausgabe 
trennen und dann Bericht erstatten.. Danke schonmal!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.