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); } }
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.
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
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.
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[]).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.