www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Infomationen zu fdevopen


Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian Zietz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angenommen, Du verwendest avr-gcc mit avr-libc (z.B. aus dem
WinAVR-Paket): Reicht
http://www.nongnu.org/avr-libc/user-manual/group__...
nicht?
Zusammenfassung: Du suchst fprintf, dem kann man den Verweis auf einen
mit fdevopen geöffneteten Stream übergeben.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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...

Autor: Christian Zietz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt hab' ichs auch...
Sorry, war ein Mißverständnis meinerseits!

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Heinzi:
"Du brauchst nichts initialisieren" und "Du legst die FILE* an".
Ist das nicht ein Widerspruch? oder was meinst du mir "die FILE
anlegen"?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

mit FILE *foo; initialiserst du nichts. Du deklarierst nur.

Matthias

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :-)

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, genauer lesen wäre angebracht :-)
hab nun, glaube ich, alles verstanden. für die schnelle und
ausführliche hilfe herzlichen dank.

gruß julius

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.