Ich habe ein kleines Problem mit dem Auswerten von Strings. ich bekomme
von einen Dimmermodul die Aktuelle Dimmwerte sowie die Kanalnummer und
das Endezeichen(13) für jeden Kanal ein anderes Endezeichen,zuerstmal
nur ein Kanal zum Testen.
Der String der ankommt sieht wie folgt aus: 0124 ;Kanal,Dimmwert.
Auf dem LCD Bekomm ich nur Angezeigt, RX0 BUFFER INHALT und wirre
Zahlen.
Baudrate stimmt alles.
Wenn ich mir nun Vom Dimmermodul die Werte über Hterm Anzeige passt
alles.
Worin liegt nun mein Fehler.
Ich nutze die UART-Lib von Peter Fleury.
mfg
Armin schrieb:> i = 0;> do> {> by=RX0Buffer[i];> uart_putc( 17 ); //Zeilen Position auf LCD> uart_putc( 0 );> uart_putc( 0 );> uart_putc( 20 );> uart_putc( 0 );> itoa( by, s, 10 ); // 10 fuer radix -> Dezimalsystem> uart_puts( s );>> }> while ((RX0Buffer[i] != '\0') );
Da du i hier nirgends inkrementierst, gibst du nur in einer
Endlosschleife immer wieder den ersten Wert aus.
Ja, du bist auf dem Holzweg. Die do-while-Schleife inkrementiert die
Variable i nicht.
Schreibe einfach im Schleifenfuß i++ statt i, dann sollte es gehen.
smoerre schrieb:> Armin schrieb:>> '13'>> Das ergibt keinen Sinn.> Entweder> 13> oder> 'x0D'
Das naheliegendes wäre eigentlich '\r'.
Armin schrieb:> aber durch die do while schleife wird doch solange gelesen bis das ende> im String erkannt wird oder bin ich da auf dem Holzweg.
Das stimmt im Prinzip schon. Da aber i 0 ist und das auch für immer und
ewig bleibt und du in RX0Buffer[i] nach dem Ende schaust, suchst du
immer nur im ersten Zeichen des Strings nach dem Ende.
> while( ( c = uart_getc() ) != '13' && i < BufferLen - 1 )> RX0Buffer[ i++ ] = c;> Ich nutze die UART-Lib von Peter Fleury.
Da ist schon mal der erste Fehler.
Das uart_getc() aus der Fleury Lib ist ein nicht wartendes getc(). D.h.
es kommt auch dann zurück, wenn kein Zeichen vorliegt oder empfangen
wurde.
Studier doch einfach mal das Beispiel, welches Peter mitliefert um zu
sehen, wie man den Returncode von uart_getc() richtig auswertet.
Deswegen hat Peter es nämlich geschrieben.
Ich hab mir das Beispiel von Peter nochmal angesehen,und sogut we ich
das kann umgesetzt.
Nun habe ich aber Probleme mit der Ausgabe vom RX0Buffer ich erhalte
nun immer 2551610,Angezeigt werden sollte 01 24,weil die Werte ja so vom
Dimmermodul kommen.
wo mache ich nur den Fehler.
viellecht kann mir von eúch einer nochmal kurz helfen
mfg
Armin schrieb:> while( ( c = uart_getc() ) != '0x0D' && i < BufferLen - 1 )
'0x0D' ist immer noch falsch. Schreib doch einfach '\r'.
Armin schrieb:> do
Wo ist denn das i=0 vor der Schleife geblieben? Ohne das fängst du nicht
am Anfang zu lesen an, sondern nach dem letzen in den Puffer
geschriebenen Zeichen. Da kommt natürlich nur Mist an.
> {> i++;
Warum inkrementierst du i am Anfang der Schleife? So überliest du ja das
erste Zeichen.
> by=RX0Buffer[i];> itoa( by, s, 10 ); // 10 fuer radix -> Dezimalsystem> uart_puts( s );> }> while ((RX0Buffer[i] != '\0') );> i=0;>> }
Übrigens: Eine vernünftige Einrückung würde den Code um einiges lesbarer
machen.
> by=RX0Buffer[i];> itoa( by, s, 10 ); // 10 fuer radix -> Dezimalsystem> uart_puts( s );
Du wandelst den ASCII-Wert eines jeden Zeichens in einen String um.
Warum?
Willst Du nicht einfach die ASCII-Zeichen direkt senden?
Armin schrieb:> Ja weil ich die Werte Dezimal ausgen muss.
Was kommt denn da nun wirklich an? Ein String oder Binärwerte, die du
erst in Strings wandeln mußt? Bei dener Ausgabe 523255 fällt auf, daß 52
einer '4', 32 einem Leerzeichen und 55 einer '7' entsprechen würde.
Armin schrieb:> die werte die vom Dimmermdul kommen sind ASCII Werte
Dann solltest du sie auf der Empfänger nicht als Binärwerte
interpretieren und nochmal nach ASCII konvertieren. Gib sie einfach so
aus wie sie sind.
ist doch immer noch Unsinn.
Du musst JEDES uart_getc() darauf abfragen, ob überhaupt ein Zeichen
angekommen ist, nicht nur das erste.
Schleife {
c = uart_getc();
war es ein gültiges Zeichen?
Ja: war es kein \r und ist noch Platz im Buffer?
Ja: Speichere es im Buffer
Nein: Brich aus der Schleife aus
}
Da gibt es genau eine Schleife und innerhalb der Schleife wird ein
Zeichen geholt, sofern eines da ist und abgespeichert. Du musst die
Dinge schon logisch richtig ineinander schachteln und nicht einfach nur
ein bischen Code den du schon hast durch die Gegend schieben.
Das hat er ausnahmsweise richtig
unsigned int c;
Scheinbar hat er das Original-Beispiel zumindest angesehen. uart_getc
returniert einen uint16_t, wobei die oberen 8 Bit kodieren, ob etwas im
Puffer war, ob es Fehler gab, etc.
Wertet man aber nicht alle Bits aus, dann wäre es eventuell nicht
verkehrt die oberen 8 Bits wegzucasten, ehe man zb auf \r vergleicht.