Forum: Mikrocontroller und Digitale Elektronik ASCII eins zu Decimal eins


von Umbrecht (Gast)


Lesenswert?

Hi,

möchte bei meinem ATmega32 den EPROM per Uart beschreiben.
Dazu sende ich als erstes dass Zeichen per Putty.
Anschließend sende ich die Adresse im ASCII Format. Jetzt muss ich aus 
der ASCII Zahl eine DECIMAL Zahl machen, da ich ja mit der Zahl "1" die 
erste Stelle im EPROM beschreiben möchte und nicht die 49. Das ganze 
würde ich mit einer Switch schleife machen.

Nun habe ich das Problem dass der EPROM bis zu 1024 Byte speichern kann, 
dass heißt ich habe vier Ziffern die ich in einem Array speichere und in 
der Switch Schleife umwandele, jetzt will ich aber nur noch eine 16bit 
variable zurück bekommen also im Endeffekt so:

FLAGC[0] = 0
FLAGC[1] = 5
FLAGC[2] = 7
FLAGC[3] = 0

Aus diesen vier Ziffern soll

FLAGD = 570

enstehen. Wie kann ich das machen? Oder kennt ihr eine Bessere 
Möglichkeit?

mfg
Umbrecht

von Peter II (Gast)


Lesenswert?

Umbrecht schrieb:
> Oder kennt ihr eine Bessere
> Möglichkeit?

ja, atoi

http://www.cplusplus.com/reference/cstdlib/atoi/

von guest (Gast)


Lesenswert?

Hallo,

die Ziffern 0..9 entsprechen den ASCII-Codes 48..57.

Wenn Du also von den Zeichen jeweils 48 abziehst, bekommst Du jede 
Stelle als Dezimal.

In Deinem Fall:
1
uint16_t u16_dez = 0;
2
3
u16_dez = 1000 * (FLAGC[0] - 48) + 
4
          100  * (FLAGC[1] - 48) + 
5
          10   * (FLAGC[2] - 48) + 
6
          1    * (FLAGC[3]-48);

von Umbrecht (Gast)


Lesenswert?

hi,

@guest : funktioniert, danke
@Peter ||: werde ich dann auch mal testen

vielen dank für die schnelle Hilfe - Problem gelöst

mfg
Umbrecht

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Umbrecht schrieb:
> Switch schleife

ist das eine (weiter entwickelte) Sonderform der If-Schleife?

von Eric B. (beric)


Lesenswert?

Umbrecht schrieb:

> da ich ja mit der Zahl "1" die
> erste Stelle im EPROM beschreiben möchte und nicht die 49.

Sicher? Ich würde die erste Stelle im EPROM mit 0 addressieren, nicht 
mit 1.
Ggf musst du dann bei den obigen berechnungen noch 1 addieren oder 
abziehen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Macht es Euch doch nicht immer so kompliziert.
Die Berechnung stimmt und die 48 für das Zeichen der Null auch.
Man kann aber im Code auch die "0" oder die '0' abziehen - der Compiler 
macht daraus eine 48.
Somit ist auch in einigen Wochen der Code noch lesbar, da man sieht, daß 
von dem ASCII-Wert der Zeichenwert der '0' abgezogen wird.

(oder 0x30 als Hex - schön zu sehen ist die letzte Ziffer, ebenfalls 
eine Null - klappt bis zur 0x39 für die '9'. Bis zum A sind es noch 7 
weitere Schritte, für das 'A' einer HEX-Zahl also weitere 7 abziehen und 
aus der 65 oder 0x41 wird eine 10 - damit gehen dann auch 
Hexadezimal-Zahlen)

Damit kannst Du pro Stelle die Ziffer einlesen, umrechnen und 
entsprechend potenziert auf das Ergebnis aufaddieren.

Der Code oben ist korrekt und macht Nichts Anderes, als von mir 
angedacht, nur sieht man in der "48" nicht wirklich direkt eine "0".

MfG

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
Noch kein Account? Hier anmelden.