printf und scanf bei µCs?

OP #2423671
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
Gast #2423687
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
#2423690
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
Gast #2423694
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?
OP #2423725
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.
Gast #2423744
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
#2424370
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.

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