Forum: Mikrocontroller und Digitale Elektronik ITOA etc. auf STm32


von Wolfram L. (amazon)


Lesenswert?

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 ?

von Sven P. (Gast)


Lesenswert?

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.

von Wolfram L. (amazon)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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 :-)

von Ingo (Gast)


Lesenswert?

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 :)

von Wolfram L. (amazon)


Lesenswert?

Ingo schrieb:
> www ne schöne itoa Funktion

Und wo im WWW genau ? für den ARM STM32 (s.o.)

von Roland H. (batchman)


Lesenswert?

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?

von Adib (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

Na ob der Codewahnsinn da nun platzsparender ist...

von Bernd N (Gast)


Lesenswert?

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.

von Bernd N (Gast)


Lesenswert?

>> Na ob der Codewahnsinn da nun platzsparender ist...

So langsam wird mir klar warum jeder nen ARM braucht :-) er hat ja 
wenigstens nachgedacht.

von Benny (Gast)


Lesenswert?

Interessant wäre für idch vielleicht auch iprintf(). Da ist die 
Gleitkommaumwandlung nicht mit inbegriffen....

Gruß Benny

von ITOA (Gast)


Lesenswert?


von W.S. (Gast)


Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

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

von Marius S. (lupin) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

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