Teil eines String kopieren GPS Datensatz

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

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren