Problem mit ASCII umwandlung

Gast #2397592
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
Gast #2397596
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
Gast #2397605
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?
Moderator Persönliche Seite #2397607
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.
Gast #2397608
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..
Gast #2397644
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.
Moderator Persönliche Seite #2397780
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren