1 char ist immer genau ein Zeichen lang. Da es ein char und kein String
(char[]) ist, ist es auch sinnlos, die Adresse davon zu nehmen und
strlen() darauf loszulassen.
Ein Nachtrag, da fällt mir ein das prinf() ggf. zu lange dauert,
um das in den Uart zu schreiben. Würde die fehlenden Zeichen erklären.
Aber was könnte noch alles in einem UART Byte stecken?
Kann man vielleicht alle möglichen \n und \r filtern?
Weil data ein char ist und kein String. Du lässt aber Funktionen, die
für Strings gedacht sind, auf dieses char los. Da kann nur Mist
rauskommen, aus dem sich keine Schlüsse ziehen lassen.
Strings sind nullterminierte char-Arrays, also Folgen von 0 oder
mehreren chars, abgeschlossen durch ein char, das den Wert 0 (\0) hat.
Auf der anderen Seite ist außer in einem Einzelfall ein einzelnes char
nie ein String. Der Einzallfall ist dann gegeben, wenn das char den
Wert 0 (\0) hat. Dann ist es auch ein gültiger String der Länge 0.
Ein (fast beliebiges) C-Buch oder ein grundlegender Text dazu sollten
weiterhelfen.
Hi
>Strings sind nullterminierte char-Arrays, also Folgen von 0 oder>mehreren chars, abgeschlossen durch ein char, das den Wert 0 (\0) hat.
Und ein NMAE-String wird mit CR/LF abgeschlossen.
MfG Spess
Klaus schrieb:> Ich mache mich mal mit chars schlau.
Viel Erfolg. Grundlagen sind manchmal trocken, aber man macht sich nur
unnötige Arbeit, wenn man sie nicht hat.
@Klaus
Baue Dir ein Buffer-System auf.
Rx von GPS löst interrupt aus und schreibt die Zeichen in ein RX-Buffer
Dein Main-Task holt diese Zeichen vom Buffer wieder ab und wertet irgend
was aus.
Dadurch kann die Software nichts verlieren, auch wenn der Main-Task mal
länger in einer Schleife warten sollt. Garantiert wird der RX-Interrupt
mit GPS aufgerufen und zwischengespeichert.
Noch besser ist es, wenn man die Routinen so programmiert, dass es
niemals ein Warten im Code gibt. (xputc wartet solange bis der TX-Buffer
der Debug-Ausgabe frei ist!)
Also: wirf den xputc weg und mache ein Buffer-System, das die Zeichen
des Debug-Buffers auch Asynchron, per Interrupt aus gibt.
Ich habe in meinen Programmen locker 5000-15000 Main-Loop durchläufe je
Sekunde (bei 8MHz Clock!). Diese Zahl beobachte ich immer. Wenn sie bei
einer Programmänderung drastisch runter geht, dann hab ich irgendwo ein
"Klemmer", "Wait" oder einfach eine komplexe Bearbeitung rein gemacht
und ich weiß ich muß den Code optimieren.
Hi
>Rx von GPS löst interrupt aus und schreibt die Zeichen in ein RX-Buffer>Dein Main-Task holt diese Zeichen vom Buffer wieder ab und wertet irgend>was aus.
Wozu? Ein NMEA-String beginnt immer mit '$'. Diese Erkennung kann man
locker im Interrupt machen. Danach wird alles bis CR/LF in einen Puffer
geschrieben. Fertig.
MfG Spess
Hallo,
zu peinlich "$" und '$' macht ja wirklich einen Unterschied :)
Hatte eigentlich vor alles on-the-fly zu machen.
Breitengrad, Längengrad, Höhe, usw. alles interessante hochrechnen,
nach dem Muster:
1
Result=0;
2
Result=10*Result+Buffer[0]=10*0+5=5
3
Result=10*Result+Buffer[1]=10*5+1=51
4
Result=10*Result+Buffer[2]=10*51+0=510
5
//....
da mein ggc compiler atoi() nicht akzeptiert.
Ich werds einfach mal versuchen. STM32 ist flott und das Wichtige
unterbricht den Interrupt auch (in der NVIC weit hinten). xputc(data)
ist nur zum Debuggen.
Vielen Dank & Viele Grüße
Klaus
DerTom schrieb:> Wieso akzeptiert dein gcc atoi() nicht?
WEil er den Unterschied zwischen einem einzelnen Zeichen und einem
String immer noch nicht kapiert hat. Von einem layered Softwareaufbau,
bei dem sich höhere Funktionen auf den Service von tiefer liegenden
Softwareschichten stützen reden wir erst mal gar nicht.