Urs
Du hast das gleiche Problem, das wir auch umgangssprachlich
im Deutschen haben:
Zu wissen, wann eine Zahl zu Ende ist.
Wenn ich zu dir sage:
drei ....
dann kannst du so nicht unmittelbar wissen, ob die Zahl
nun zuende ist oder nicht. Ich könnte ja, nach einer
etwas längeren Pause noch hinzufügen
... und zwanzig
D.h. nur dadurch, dass ich "drei" gesagt habe, weist
du nicht automatisch, welche Zahl ich meine. Erst dadurch,
dass ich dir einen Hinweis gebe, dass die Zahl jetzt zuende
ist, bist du in der Lage auf deinen Zettel
3
hinzuschreiben und sicher zu gehen, dass das auch korrekt ist.
Nichts anderes ist es ein einem Computer: Du musst dir
irgendwelche Hilfen einfallen lassen, so dass die Gegenstelle
eindeutig erkennen kann, dass hier eine Zahl endet und möglicherweise
eine neue Zahl beginnt.
Wenn du den Datenstrom 65308 (jeweils als Einzelzeichen) hast,
sind das jetzt die Zahlen 6 5 3 0 8, oder sind das
die Zahlen 65 30 8, oder gar 6530 8, oder 65 308 oder ...
Die übliche Vorgehensweise ist es, sich irgendwelche Sonderzeichen
zu definieren, die diese Aufgabe übernehmen. Das könnte zb. ein
simples ',' oder ein ';' sein. Auch das Sonderzeichen 'Return'
ist sehr beliebt, weil zumindest Command Line Benutzer daran gewöhnt
sind, Eingaben mit einem 'Return' (das ist die Taster mit dem
Haken) abzuschliessen.
Der Zeichenstrom 65;308; ist damit eindeutig in die beiden
Zahlen 65 und 308 zerlegbar.
Aber wie kriegt man die Zahlen? Man hat ja nur die einzelnen
Zeichen!
Das ist aber einfach: Aus den einzelnen Ziffern (also '6', '8', etc)
bekommt man die zugehörige Ziffer indem man den ASCII Code für '0'
abzieht
'6' - '0' -> 6
'8' - '0' -> 8
(aus der UART kriegst du immer nur den ASCII Code heraus. Wenn
du deine Zahl so wie du das gezeigt hast, wegschickst, dann wird
vom PC der Text "65" übertragen, also die ASCII Codes für '6' und
danach der ASCII Code für '5')
Aus den einzelnen Ziffern danach wieder die Zahl zu generieren
ist einfach: Um aus der (bisherigen) Zahl 12 die Zahl 123 zu
machen, werden die 12 mit 10 multipliziert und 3 dazu addiert.
Das geht immer so weiter: Wenn an eine Zahl rechts eine Stelle
'angehängt' werden soll, wird die Zahl einfach mit 10 multipliziert
und die zusätzliche Stelle addiert.
Um also einen eingehenden 'Text', von dem wir wissen, dass es sich
um eine 'Zahl' handelt wieder in eine tatsächliche Zahl zu
überführen, genügt es:
1 | zahl = 0;
|
2 | zeichen = get_next_character_from_uart();
|
3 | while( zeichen != ';' ) { // war es das spezielle Endezeichen ?
|
4 | zahl = 10 * zahl + ( zeichen - '0' );
|
5 | zeichen = get_next_character_from_uart();
|
6 | }
|