PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART(Eingabe) empfangen/auswerten



TheDuke
09.09.2011, 15:52
Atmega 162
AVR Studio 5

Hi

mein Problem dreht sich weniger um die UART als um die Eingabeauswertung.
Also ich suche einen schnellen Weg eine Eingabe auszuwerten zb +78,5.
Einen Befehl Stelle für Stelle auszuwerten ist kein Problem, also Eingabe in Buffer schreiben und da die Stellen auszuwerten.
Das ist aber lang und net schön anzuschaun. Das eigentliche Problem ist die zweistellige Zahl mittendrinne. Wenn ich alles in einen Buffer schreibe dann ist die ja auf die Stellen buffer[1] und buffer[2] aufgeteilt.
Es ist nicht unbedingt schwierig die 2 Stellen in eine Variable zu schreiben, aber vielleicht weiß ja jmd von euch wie man die gesamte Eingabe einfacher und kürzer Auswerten kann.
Zwei Zahlen in eine Variable schreiben würde ich so machen

for(i=1; i<=2; i++)
{
buffer2[i]=buffer[i];
}
val=buffer2;


Ok vielleicht versteht man nicht ganz was ich will, also nochma kurz.

Eingabe: +74,5
auswerten(Zeichenzahl, Nachkomma,..)
weiterverarbeiten(in ein Register schreiben, man kann es nicht als ganzes reinschreiben)


Frage is nun nach einem schnellen und einfachen Weg.

Ich habe ein Beispiel angehängt von einer Eingabeaufforderung die ich mal für ein ADC-Projekt geschrieben hatte.

Klebwax
09.09.2011, 19:18
Zuerst solltest du dafür sorgen, daß am Ende deiner Eingabe ein Null-Byte ist, z.b. wenn ein '\r' kommt, ein '\0' in deinen Buffer. Dann kannst du alle gängigen Stringfunktionen darauf anwenden, z.b. atoi (ascii to integer).

MfG Klebwax

TheDuke
12.09.2011, 10:24
hi

also das Beispiel das ich angehängt habe funktioniert so wie es ist. Die Eingabe sieht zB so aus: <3/5> + /r(Eingabe-Endzeichen). Das sind 6 Zeichen und der Buffer is 6 Zeichen groß, also passt es rein. Würde es nicht passen dann würde ja die Fehlermeldung wegen Bufferoverflow kommen. Oh warte ich sehe was du meinst aber ich habe ja die Zeichen einzeln ausgewertet also nicht als ganzen string, also war es nicht nötig das string-Endzeichen zu beachten.
Das ist ja aber eigentlich auch nicht das Problem, sondern fand ich die Auswertung uneffektiv.
Die Funktionen itoa(), atoi() oder ähnliches würden hier nicht funktionieren bzw sehe ich nicht den Sinn darin das umzuwandeln. Was du meinst wäre ja ein String zu einer Zahl, also atoi() und die Beschreibung von atoi() ist "Converts a string representing an integer to an integer." Selbst wenn ich die Eingabe ohne Vorzeichen machen würde dann wäre es immernoch eine Kommazahl also float. Wenn man einen string to float machen will dann kann man atof() nutzen, da wäre Eingabe wie "+70.5" möglich. Aber dadurch habe ich nichts gewonnen da ich ja trotzdem die Eingabe auswerten muss also schaun ob das Vorzeichen + oder - ist, im welchen Bereich die Vorkommazahl liegt(0-127) und ob das Nachkomma 0 oder 5 ist. Also gewinne ich nichts wenn ich den string umwandel bzw wie Werte ich die Einzelteile eines float aus?
Die Frage ist also ob es möglich ist, möglichst einfach das Eingegebene auszuwerten. Bei der Eingabe ist es möglich eine einstellige bis dreistellige Vorkommazahl einzugeben und das ganze in nem string auszuwerten ist umständlich, da es ja nicht sinnvoll wäre den Nutzer vorzuschreiben immer 3 Vorkommastellen einzugeben also zb 003 oder so. Also sollte es egal sein ob es 1 oder 3 Stellen sind und das muss bei der Auswertung beachtet werden. Bei einer Auswertung eines Integer ist es ja egal wieviel Zeichen die Zahl hat aber dafür müsste ich das Eingegebene wieder aufteilen und in Variablen speichern. Mir fällt aber nichts ein wie ich das mache bzw wie stelle ich fest wieviel Vorkommazeichen eingegeben wurden?
Also würde ich gern wissen ob jemand schonmal so eine Auswertung geschrieben hat oder ob jemand eine Idee hat wie man das am Besten umsetzt.

Gruss