Hallo, ich möchte die Funktion "printf" für die Ansteuerung eines Displays, sowie der seriellen Schnittstelle nutzen. Bis jetzt ist mir eine Differenzierung zwischen zwei Gräten nicht gelungen. Meine Vermutung ist die, dass es möglich sein müsste mittels "fdevopen" einen weiteren Kanal zu öffnen, den man dann bei printf angibt. Alles was ich brauch ist eine ausfühliche Dokumentation zu "fdevopen" bzw. "printf". Könnt ihr mir da weiterhelfen? Gruß Julius
Angenommen, Du verwendest avr-gcc mit avr-libc (z.B. aus dem WinAVR-Paket): Reicht http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html nicht? Zusammenfassung: Du suchst fprintf, dem kann man den Verweis auf einen mit fdevopen geöffneteten Stream übergeben.
>Zusammenfassung: Du suchst fprintf,
Falsch, er möchte printf verwenden. fdevopen öffnet einen Stream für
printf. Die Routine, die für die Ausgabe auf ein Display/RS232/whatever
zuständig ist, wird fdevopen als Parameter übergeben...
@OldBug: Nein, er möchte fprintf verwenden. fdevopen öffnet einen Stream. Der erste Stream, der zum Schreiben geöffnet wird, wird stdout und stderr und kann mit printf verwendet werden. Weitere Streams, die mit fdevopen geöffnet werden, können fprintf (NICHT printf) als Parameter übergeben werden. So steht es in der Doku.
Hi also entweder er öffnet und schließt den Stream für printf ständig oder aber er öffnet eben zwei Streams und wählt dann per Parameter von fprintf() aus welches Gerät (welcher Stream) den jetzt benutzt werden soll. Das er nach fprintf() sucht und dann eben zweimal fdevopen() aufrufen muss sehe ich als bessere Lösung an als ständig Streams zu öffnen und zu schließen. Matthias
Mal sehen ob ich es richtig verstanden hab: //Asugeabefunktionen int uart_putchar (char c){...}; int lcd_putchar (char c){...}; //Initialisierung der beiden Streams fdevopen (uart_putchar, NULL, 0); fdevopen (lcd_putchar, NULL, 0); //Ausgabe aufs Display und LCD fprintf(uart_putchar,"Hi PC"); fprintf(lcd_putchar,"Hi LCD"); Müsste doch gehen, oder? @Chrisitan: Der Link funktioniert nicht, kannst du da mal nachschauen?
Hi nicht ganz. Du mußt den Rückgabewert von fdevopen() (ein sog. File-Handle) an fprintf() übergeben. Die Forensoftware verunstaltet leider Links mit Unterstrichen. Deshalb hier nochmal die Beschreibung von fdevopen() http://makeashorterlink.com/?R42113B3C Matthias
Gut, abgeändert müsste es demnach so aussehen: //Initialisierung der beiden Streams uart_filehandle = fdevopen (uart_putchar, NULL, 0); lcd_filehandle = fdevopen (lcd_putchar, NULL, 0); //Ausgabe aufs Display und LCD fprintf(uart_filehandle,"Hi PC"); fprintf(lcd_filehandle,"Hi LCD"); Wie nehme ich nun die Initialsierung der beiden filehandle-Variablen vor? ist es wirklich so einfach: FILE *uart_filehandle, *lcd_filehandle;
Hi in meiner Beschreibung hat fdevopen zwar nur zwei Parameter ab so in etwa sollte es funktionieren. Die File-Handles mußt du nicht initialisieren. Das macht fdevopen() ja. Matthias
Du brauchst nichts initialisieren. Du legst die FILE* an und laesst Dir von fdevopen entsprechnde Pointer Werte da rein schreiben. Genau so, wie Du es da oben gemacht hast.
@Heinzi: "Du brauchst nichts initialisieren" und "Du legst die FILE* an". Ist das nicht ein Widerspruch? oder was meinst du mir "die FILE anlegen"?
Hi mit FILE *foo; initialiserst du nichts. Du deklarierst nur. Matthias
Eine Variable definieren int main() { FILE* uart_filehandle; FILE* lcd_filehandle; uart_filehandle = fdevopen (uart_putchar, NULL, 0); /* fertig zur Benutzung */ OK. Wenn Du unbedingt willst, kannst Du auch initialisieren: int main() { FILE* uart_filehandle = NULL; oder int main() { FILE* uart_filehandle = fdevopen (uart_putchar, NULL, 0); spielt aber keinen Walzer :-)
ok, genauer lesen wäre angebracht :-) hab nun, glaube ich, alles verstanden. für die schnelle und ausführliche hilfe herzlichen dank. gruß julius
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.