mikrocontroller.net

Forum: Compiler & IDEs Teil eines String kopieren GPS Datensatz


Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

habe ein merkwürdiges problem.
gnns.kurs und gnns.speed gehen da kommen die richtigen werte.

bei gnns.sat kommt 36 als ergebniss.

die kommaaray daten sind richtig er soll den GGA Datensatz bei 45 mit 
einer stelle (da <10 SAT aktiv) in temp kopieren.

kommaaray[6]=44   position vom 6. komma
kommaaray[7]=46   position vom 7. komma

da temp ein string ist wandle ich ihn mit atoi um.

aber es geht nur bei gnns.satellite nicht.

Danke


typedef struct
{
uint8_t timeh;
uint8_t timem;
uint8_t times;
uint8_t speed;
uint8_t speed_old;
uint8_t satellite;
uint8_t sat_fix;
uint16_t kurs;
uint16_t kurs_old;
}gpsdata;



ISR(SIG_UART_RECV)
{
  rbuffer=UDR;



    switch (rbuffer)
      {
        case 36:
          buffercount=0;
          start=1;
        break;

        case '*':
        break;

        case 13:
        ende=1;
        break;
        default:
        ende=0;
      }

  if (start==1)
  {

    ringbuffer[buffercount]=rbuffer;
    ringbuffer[buffercount+1]='\0';
    buffercount++;
  }



  if(ende==1)
  {
    UCSRB&=~ (1<<RXCIE);

    if(memcmp("$GPGGA",ringbuffer,6)==0)
    {
      komma=0;

      for(i=0;i<buffercount-1;i++)
      {
        if(ringbuffer[i]==',')
        {
          kommaaray[komma]=i;
          komma++;
        }
      }

      pos1=kommaaray[6]+1;
      memcpy(temp,ringbuffer+pos1,(kommaaray[7]-kommaaray[6])-1);
      gnns.satellite=atoi(temp);
    }



    if(memcmp("$GPRMC",ringbuffer,6)==0)
    {



    }

    if(memcmp("$GPGSV",ringbuffer,6)==0)
    {


    }

    if(memcmp("$GPGSA",ringbuffer,6)==0)
    {


    }

    if(memcmp("$GPVTG",ringbuffer,6)==0)
    {
      komma=0;

      for(i=0;i<buffercount;i++)
      {
        if(ringbuffer[i]==',')
        {
          kommaaray[komma]=i;
          komma++;
        }
      }

      temp[0]="\0";
      memcpy(temp,ringbuffer+kommaaray[6]+1,kommaaray[7]-kommaaray[6]-1);
      gnns.speed=(int)atoi(temp);
      temp[0]="\0";
      memcpy(temp,ringbuffer+kommaaray[0]+1,kommaaray[1]-kommaaray[0]-1);
      gnns.kurs=atoi(temp);
    }





    ende=0;
    start=0;
    UCSRB|=(1<<RXCIE);

  }
}

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht für mich so aus, als ob du nicht sicherstellst, daß dein temp 
nullterminiert ist. Daher liest atoi zusätzlich zu dem einen Zeichen 
noch weitere, die noch von vorher drin stehen.

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ja es lag tatsächlich an der terminierung nach dem xten Zeichen in 
diesem Fall Temp[1]='\0';

aber warum

ich mache doch vorher ein temp[0]='\0';

wie leere ich so einen string

schleife 0 bis dimension ende mit '\0'????

oder gehts effektiver???

ich habe es so gelöst

temp[kommaaray[7]-kommaaray[6]-1]="\0";

Vielen Dank

Gruß

Andy

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:
> Hallo
>
> Ja es lag tatsächlich an der terminierung nach dem xten Zeichen in
> diesem Fall Temp[1]='\0';
>
> aber warum
>
> ich mache doch vorher ein temp[0]='\0';

Sprich: Du schreibst ein '\0' ins erste Element von temp. Sobald du da 
also was neues reinschreibst, überschreibst du das '\0', und es ist weg. 
Oder dachtest du, das schiebt sich irgendwie von selbst weiter?

> schleife 0 bis dimension ende mit '\0'????
>
> oder gehts effektiver???

Du weißt ja, wieviel du kopierst, also weißt du auch, nach dem 
wievielten Zeichen ein '\0' kommen muß.

> ich habe es so gelöst
>
> temp[kommaaray[7]-kommaaray[6]-1]="\0";

Ja, genau so.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Herrmann schrieb:
> temp[kommaaray[7]-kommaaray[6]-1]="\0";

Aber wenn schon, dann so:
temp[kommaaray[7]-kommaaray[6]-1]='\0';

Zumindest falls temp ein Feld von char ist (irgendwie sehe
ich keine Definition für temp[]).

Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst aufpassen.
"\0" ist etwas anderes als '\0'.

Das eine ist ein Stringliteral, das andere ist ein Zeichen.

Da sollten dann Compiler-Warnungen kommen. Auch die soll man beachten.

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


unsigned char temp[10];


Ja ist richtig es muß ='\0' heißen.

Habe es korrigiert.

Jetzt geht es.

Vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.