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