Forum: Compiler & IDEs Teil eines String kopieren GPS Datensatz


von Andreas H. (andy78)


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);

  }
}

von Rolf M. (rmagnus)


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.

von Andreas H. (andy78)


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

von Rolf M. (rmagnus)


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.

von Klaus W. (mfgkw)


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[]).

von DirkB (Gast)


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.

von Andreas H. (andy78)


Lesenswert?

Hallo


unsigned char temp[10];


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

Habe es korrigiert.

Jetzt geht es.

Vielen Dank

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.