Teil eines String kopieren GPS Datensatz

OP #1981305
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);

  }
}
OP #1981475
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
#1981675
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.
Gast #1981699
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.