Forum: Mikrocontroller und Digitale Elektronik printf und scanf bei µCs?


von Michael S. (rbs_phoenix)


Lesenswert?

Hallo zusammen. Ich hab da mal eine Verständnissfrage.

Ich lerne in der FH im Moment C für den PC und da haben wir auch schon 
printf und scanf benutzt. Das Programm startet, das Consolen-Fenster 
geht auf und mit printf kann man einen String anzeigen lassen und bei 
scanf "wartet" das Programm, bis der Benutzer etwas eingegeben hat und 
mit Enter bestätigt.

Jetzt stell ich mir die Frage, wie das bei µC's funktionieren soll. Dort 
hat man ja weder eine Konsole, noch eine Tastertur oder Bildschirm. Klar 
kann man ein LCD und ein Tastenfeld anschließen, aber woher weiß der 
C-Compiler, wo das (eventuell vorhandene) Display hängt, welcher (wenn 
überhaupt) Treiber verbaut ist und allgemein, was er mit den Parametern 
machen soll?

Sprich: Wie kann/soll ich mir das vorstellen?

Danke schonmal im Vorraus

von Gerhard (Gast)


Lesenswert?

Hallo

wie wärs mit UART/RS232 ?

Das printf/scanf ist ja ein Funktion der Bibliothek. Nicht jeder 
Compiler bietet diese Funktionen an. Das muss/wird dann wohl in der 
Beschreibung dokumentiert sein, "wo er das hinschickt".

Gruß
Gerhard

von Timmo H. (masterfx)


Lesenswert?

Naja bei µC hat man aber einen UART, über die die printf-Ausgaben an ein 
Terminal (z.B. PC) gesendet werden können.
Im Quellcode kann man dem Compiler mitteilen, welche Funktion für die 
Standardausgabe zuständig ist. Dafür muss man vorher nur den UART 
initialisieren und eine Funktion schreiben die ein Zeichen über den UART 
sendet bzw. empfängt und dies dann über entsprechende direktiven dem 
Compiler mitteilen diese als stdin bzw. stdout zu nutzen

von asfd (Gast)


Lesenswert?

Du kannst stdout z.B. auf die put_char vom uart legen, dann kannst du 
printf mit dem µC verwenden!

Hier steht wies geht:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf

Ist natürlich nicht wirklich effizient ;-)

Gruß

von Volkmar D. (volkmar)


Lesenswert?

Beim AVR GCC ist es so daß den Printf/Scanf-Funktionen eine 
entsprechende Funktion mitgeteilt werden muß über die dann die 
Ein-/Ausgaben erfolgen. Der Programmierer hat es damit selbst in der 
Hand ob das I/O über RS232 oder ein Display/Keyboard oder ... geht.

von irgendwer (Gast)


Lesenswert?

Michael Skropski schrieb:
> Jetzt stell ich mir die Frage, wie das bei µC's funktionieren soll. Dort
> hat man ja weder eine Konsole, noch eine Tastertur oder Bildschirm. Klar
> kann man ein LCD und ein Tastenfeld anschließen, aber woher weiß der
> C-Compiler, wo das (eventuell vorhandene) Display hängt, welcher (wenn
> überhaupt) Treiber verbaut ist und allgemein, was er mit den Parametern
> machen soll?
>
> Sprich: Wie kann/soll ich mir das vorstellen?

Der weiß das alles weil man es einprogrammiert (wie beim PC).
scanf und printf gibts so direkt nicht, weil es keinen standard Ein- und 
Ausgabestream gibt, wobei man die auch einbauen könnte für der UART 
(gibts vermutlich schon irgendwo)

Ich glaub du hast da noch ein sehr großes verständnis Problem.
Was willst du überhaupt machen?

von Michael S. (rbs_phoenix)


Lesenswert?

Timmo H. schrieb:
> Naja bei µC hat man aber einen UART, über die die printf-Ausgaben an ein
> Terminal (z.B. PC) gesendet werden können.
> Im Quellcode kann man dem Compiler mitteilen, welche Funktion für die
> Standardausgabe zuständig ist. Dafür muss man vorher nur den UART
> initialisieren und eine Funktion schreiben die ein Zeichen über den UART
> sendet bzw. empfängt und dies dann über entsprechende direktiven dem
> Compiler mitteilen diese als stdin bzw. stdout zu nutzen

Achso, dann versteh ich das. Wenn der Compiler das unterstützt, muss ich 
ihm quasi sagen, was er mit der Eingabe bzw. Ausgabe machen soll, und 
dann ruft er für jedes Zeichen die stdout auf!? Im printf ist dann 
bestimmt auch noch die Formatierung, wenn ich z.B. eine Float-Zahl 
ausgeben will, dass er die Zahl aus der Variablen benutzt und mit 
sovielen Nachkommastellen ausgibt, wie ich angegeben habe (z.B. %4.2f).


irgendwer schrieb:
> Ich glaub du hast da noch ein sehr großes verständnis Problem.
> Was willst du überhaupt machen?

Ich weiß nich ob das soo groß ist. Ich hab die beiden Funktionen bisher 
halt nur bei der "PC-Programmierung" kennengelernt. Dann hab ich das in 
einem Quellcode für einen AVR gesehen (war eine UART-Anwendung) und hab 
mich gewundert. Deswegen hab ich auch "nur" gefragt, Anwendung kommt 
dann später, wenn ich mein Experimentierboard habe, wo ein Display und 
eine RS-232-Schnittstelle drauf ist.


Dann denke/hoffe ich, hab ich das soweit verstanden.  Wenn ich hier was 
falsches drin stehen habe, wohl doch noch nich :/
Danke aber für die Antworten.

von Oliver (Gast)


Lesenswert?

Michael Skropski schrieb:
> Achso, dann versteh ich das. Wenn der Compiler das unterstützt, muss ich
> ihm quasi sagen, was er mit der Eingabe bzw. Ausgabe machen soll, und
> dann ruft er für jedes Zeichen die stdout auf!?

Der Compiler untersützt gar nichts, der compiliert nur.

Printf/scanf/etc. sind Funktionen einer lib. Beim avr ist das die 
avrlibc, bei ARM's ist die newlib weit verbreitet, und auf dem PC ist 
das einfach die libc.

Diese libs bieten auch Funktionen, um die tatsächliche Zeichenein- und 
ausgabe dort einzubinden. Die eigentliche Ausgabefunktion für ein 
einzelnes Zeichen, die dann ein Zeichen auf die uart oder ein LCD 
ausgibt, musst du selber schreiben, und der lib mit über die passenden 
Funktion bekannt machen. Wie das geht, steht in der jeweiligen 
Dokumentation. Bei einem Aufruf von printf() ruft dann die lib deine 
eigene Ausgabefunktion für jedes Zeichen auf, und die macht dann das 
damimt, was du programmiert hast.

Oliver

von Josef D. (jogedua)


Lesenswert?


von Andreas D. (rackandboneman)


Lesenswert?

Bei den mit SDCC (und wohl auch einigen ähnlichen) mitgelieferten 
Bibliotheken ist putchar()/getchar() einfach nicht implementiert; man 
baut es dann (von Grund auf oder auf Basis anderer 
Bibliotheksfunktionen) selber, evtl auch als Proxy der je nach Inhalt 
einer Variablen unterschiedliche Kanäle anspricht. Eigentlich sehr 
flexibel.
Komplette printf()/scanf()-Implementationen sind aber für kleinere 
Controller schon sehr schwergewichtig (da werden zB long 
int-Hilfsroutinen und Floating-Point-Emulationen mit reingzogen, schnell 
ist man bei mehreren Kilobyte! Und selbst zB sdcc printf_tiny() ist 
riesig im Vergleich zu einer einfachen eigenen puts()-artigen Funktion 
); daher werden oft zig Versionen mit unterschiedlichen Featuresets 
mitgeliefert.

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.