Forum: Compiler & IDEs Problem mit ASCII umwandlung


von Tilo (Gast)


Lesenswert?

Schönen guten Abend,

ich habe ein kleines Problem.
Wir müssen für ein Studienprojekt ein Sensornetzwerk mit ATMEGA128RFA 
aufbauen.
Ich nutze AVR Sudio 4.0.

So nun zum Problem.

Ich empfange serielle Daten über die UART.
Das funktioniert auch alles gut.
Das einzige Problem das ich habe ist das ich, wenn ich mir die Daten aus 
meinem "Input-FIFO" hole dort nur die Integer Werte für den 
entsprechenden ASCII vorfinde. Diesen möchrte ich aber gerne als 
"richtigen" Text aus einem Display ausgeben.

Nun meine Frage: gibt es eine Funktion die mir das einfach umwandelt 
oder muss ich das per Hand machen?

MfG Tilo

von Cyblord -. (cyblord)


Lesenswert?

Richtiger Text? Und wie willst du dem Display sagen dass es nun den 
Buchstaben "A" ausgegeben soll? Natürlich indem du ihm den ASCII Code 
für A durchgibst. Wie auch sonst? Und den hast du ja. Also redest du von 
einem nicht existenten Problem.

gruß cyblord

von Peter II (Gast)


Lesenswert?

Tilo schrieb:
> enn ich mir die Daten aus
> meinem "Input-FIFO" hole dort nur die Integer Werte für den
> entsprechenden ASCII vorfinde.

das glaube ich nicht. Es ist beides das gleiche. Es ist nur entscheident 
wie du es darstellt.

'0' = 48 = 0x30 = 060 = b00110000

von Tilo (Gast)


Lesenswert?

ich glaube ich steh auf dem Schlauch.

Also:

Das ist die funktion die mir das ganze auf das Display schiebt

void displayPrintChar(char zeichen)
{
  displayPrintNibble(zeichen>>4);
  _delay_us(10);
  displayPrintNibble(zeichen & 0x0F);
  return;
}

von meiner UART bekomme ich aber nur einen Iteger Wert. Das das das im 
Grunde das selbe ist mir klar.
Das mein bis vor kurzem genutzte atoi() nicht geht ist mir auch klar 
geworden.
Aber wie kann ich die z.B. 48d == 30h in eine ASCII "0" wandeln da ich 
ja einen char habe?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vielleicht will er aber gerade eben für die empfangenen 0x30 dann den
String "30" ausgeben.

Da du genügend Flash zur Verfügung hast ;-), nimm einfach sprintf().
Das ist zwar ein Koloss, aber der Vorteil ist, dass die Funktion
in jedem C-Buch erklärt ist und dass du auch außerhalb der nicht so
einfach zu debuggenden Controller-Welt damit experimentieren kannst.

Vergiss nicht, ausreichend viel Platz für den sich ergebenden String
im RAM anzulegen, in den hinein dann das sprintf() sein Ergebnis
legen kann.

edit: so völlig klar ist mir aber auch nicht, was wirklich bezweckt
wird.

: Wiederhergestellt durch Moderator
von nolo (Gast)


Lesenswert?

schau mal, ob dein prozessor BCD kennt (binary coded decimals)
damit lässt sich evtl. was anfangen
ansonsten deinen integer wiederholt durch 10 teilen und dann zu dem 
jeweiligen rest + 48 oder so dazuzählen, damit bekommst du dann ein 
asciizeichen mit der hintersten ziffer... das wiederholt angewandt 
ergibt dann nen string, allerdings rückwärts

ist 48 nicht der ascci code für 0 ?? schon solang nicht mehr angeguggt 
so ne tabelle..

von Tilo (Gast)


Lesenswert?

Mein Problem hat sich gerade gelöst.
habe einfach zuviel daran rumgebastelt,bis ich aus einer 48 die mir eine 
"0" geben sollte eine "48" gemacht habe. So geht das natürlich nicht ;-P

einfach mal grosszügig die entfernen- taste walten lassen hat geholfen.

Aber trotzdem danke für die Hilfe.
Die Printf Funktion waere leider nicht gegangen das der Ram später noch 
genutzt werden soll,und ich nicht weiss ob er dann noch gross genug 
waere.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Tilo schrieb:
> Die Printf Funktion waere leider nicht gegangen das der Ram später noch
> genutzt werden soll,und ich nicht weiss ob er dann noch gross genug
> waere.

Du bist ja lustig. ;-)  Du hast RAM-mäßig den größten ATmega in
der Hand, Generationen von Leuten haben vor dir schon mit sprintf()
gearbeitet, die hatten alle viel kleinere Controller. ;-)

printf() braucht in erster Linie Platz im Flash, klar, ein wenig RAM
auf dem Stack, aber ansonsten braucht sprintf nur so viel RAM, wie
dein kompletter String lang werden soll.  Wenn du einen Überlauf
befürchten musst, kannst du auf snprintf zurückgreifen.

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.