Hallo, vielleicht kann mir hier jemand helfen. Ich möchte ein schlankes printf bzw. sprintf für eine STM32 Umgebung realisieren. Im wesentlichen um Strings über UART auszugeben. Bisher habe ich (beim AVR (!) )dazu selbstgebaute Funktionen mit itoa oder utola verwendet. Allerdings finde ich keine Referenz zu der itoa function für den STM32. Die scheint es für den STM32 nicht zu geben. Suche ich nur nach den falschen Funktionen ?
Ja und nein. itoa() und ltoa() sind keine Standard-C-Funktionen. Die Umkehrung, also von String zu Zahl, ist aber standardisiert: atoi(). Manche C-Bibliotheken bieten sie aber eben an. Sie sind aber gemeinhin veraltet. Ersatz dafür ist nun die Familie an printf()-Funktionen (printf, sprintf, ...) für die eine Richtung und die scanf-Familie nebst strtol-Familie für die andere Richtung. Also sprintf() nehmen und freuen :-) Der STM hat sicher genug Speicher.
Sven P. schrieb: > Der STM hat sicher genug Speicher. Naja allein die sprintf Funktion(EINE ZEILE) benötigt ca. 22kByte zusätzlich. Von 64k bei einem kleinen STM ist das schon ne Menge.
Bist du da sicher? Eventuell gibt es ja abgespeckte printf-Versionen, wie bei der avr-libc, die dann beispielsweise keine Fließkommazahlen formatieren können. Ansonsten ist doch so eine Umwandlungsroutine für Ganzzahl nach String eine hübsche Fingerübung :-)
Also um einen String ausgegeben braucht es kein printf, wirklich nicht. Es gibt im www ne schöne itoa Funktion, dieFuntioniert auch sauber. Such mal danach. Ansonsten pflichte ich die bei, 22kB sind ganz schön hart, selbst auf nem F4 mit 1MB Flash :)
Wolfram L. schrieb: > Naja allein die sprintf Funktion(EINE ZEILE) benötigt ca. 22kByte > zusätzlich. Von 64k bei einem kleinen STM ist das schon ne Menge. Da stecken unzählige Formatier- und Konvertierungsfunktionen dahinter. Wie dem auch sei, eine Möglichkeit ist http://en.wikibooks.org/wiki/C_Programming/C_Reference/stdlib.h/itoa#K.26R_implementation Noch schöner sind die, die ohne Puffer auskommen und direkt ausgeben ("streamen"). Alternativ gleich in C++ mit operator overloading: Eleganter und sicherer geht's kaum. Nach dem Motto:
1 | uart << i; |
Wolfram L. schrieb: > für den ARM STM32 Das geht für alle. Was soll daran HW-abhängig sein?
Hallo, ich habe auch immer das Problem und habe mir einen Satz von Funktionen zusammengebastelt. Der Aufrufer muss auch immer gleich den Ausgabepuffer bereitstellen. Eine float Konvertierung ist zZ nicht Dabei. Adib.
Deine Frage hat mir ARM wenig zu tun. Schau die mal "Modulo" an und überleg mal, deine Aufgabenstellung ist C Programmierung dritte Woche Grundlagen. number = 123; digit = number % 10 gibt dir die Ziffer 3. Dann Division durch 10 und... ? kommst du selbst drauf.
>> Na ob der Codewahnsinn da nun platzsparender ist... So langsam wird mir klar warum jeder nen ARM braucht :-) er hat ja wenigstens nachgedacht.
Interessant wäre für idch vielleicht auch iprintf(). Da ist die Gleitkommaumwandlung nicht mit inbegriffen.... Gruß Benny
Wolfram L. schrieb: > vielleicht kann mir hier jemand helfen. > Ich möchte ein schlankes printf ein schlankes printf ?? Das möchtest du doch eigentlich garnicht, sondern du brauchst Konvertierungen - nicht wahr? Guck also mal bei der Lernbetty in der Codesammlung. Da sind reichlich Konvertierungen dabei. W.S.
Bernd N schrieb: > Deine Frage hat mir ARM wenig zu tun. Schau die mal "Modulo" an und > überleg mal, deine Aufgabenstellung ist C Programmierung dritte Woche > Grundlagen. Ich kann mir vorher auch einen Analogrechner zusammenlöten, Grundlagen von vor 50 Jahren...;-) Übrigens gieße ich auch meine Autoreifen selbst wenn ich welche brauche... warum soll man da lange suchen -- Kopfschüttel
Warum gebt ihr ihm nicht einfach wonach er sucht (auch wenn er das selber nicht weiss)? Schau mal hier: Beitrag "STM32F4Discovery mit CooCox :: GPIO,SDIO,Timer,SoftTimer,USART,printf" Im Anhang noch die printf-Funktion von ChibiOS. Habe mir daraus selber ein sprintf gebastelt. Die unterstützt auch Floats wenn du willst (musst nur den define setzen). Funktioniert sehr gut. Die kannst (solltest) du genau so umbauen wie aus dem Beitrag in der Code-Sammlung (mit Wrapper-Funktionen für alle printf-Varianten). Wenn du den ganzen ChibiOS kram raus schmeisst (ist ja nicht viel), dann kannst du die auch für alle anderen Projekte benutzen. ChibiOS solltest du dir sowieso vielleicht mal anschauen, ist super einfach zu benutzen... Ansonsten findest du sicherlich haufenweise printf-Funktionen bei Google.
Marius S. schrieb: > Schau mal hier: > Beitrag "STM32F4Discovery mit CooCox :: GPIO,SDIO,Timer,SoftTimer,USART,printf" > > Im Anhang noch die printf-Funktion von ChibiOS. Habe mir daraus selber > ein sprintf gebastelt. Die unterstützt auch Floats wenn du willst (musst > nur den define setzen). Funktioniert sehr gut. @Marius, das ist genau das was ich gesucht hatte. ..Vielen Dank @gast >Beitrag "C-Umwandlungsfunktionen für double/int/long nach String" da steht genau das was ich gesucht hatte. auch mit den Kommentaren von Peter Dannegger...
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.