mikrocontroller.net

Forum: Compiler & IDEs Was genau macht fdevopen()?


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!!

Ich habe hier im Forum schon ein paar Dinge dazu gelesen, aber mir ist 
immer noch nicht ganz klar, wozu man fdevopen() verwendet.

Ich habe z.B. folgenden Code:
extern  void  USART_Init ()
{
  ...
  fdevopen(USART_TxChar, 0);
  USART_TxString("USART OK\n\r");
}

static  int  USART_TxChar (
    char   data,         /*FPI ein Charakter              */
    FILE   *dummy)        
{
  /*FA Wait for empty transmit buffer */
  while ( !( UCSR1A & (1<<UDRE1)) );
  /*FA Put data into buffer, sends the data */
  UDR1 = data;
  return 0;
}

extern  void  USART_TxString (
    char   *string)      /*FPI String                */    
{
    /*FA so lange *string != '\0' also ungleich dem "String-Endezeichen" */
  while (*string)
    {   
        USART_TxChar(*string, 0);
        string++;    
    }
}

Was macht denn jetzt dieses fdevopen()? Brauche ich das überhaupt?

Danke für Eure Antworten
Gruss
Patrick

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das fdevopen "verheiratet" hier die Standardausgabe mit der seriellen 
Schnittstelle. Z.B. der Output von printf landet in der 
Standardausgabe, wird hier dann also über die serielle Schnittstelle 
verschickt.

http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fdevopen() verknüpft eine von dir gelieferte, primitive Zeichen-Ein- 
oder Ausgabe-Funktion mit den Ein- oder Ausgabestreams der C-Library.

Mit einer solchen Verknüpfung gehen dann z.B. Schreiboperationen mit 
printf, die von der C-Library aus ja auf den Ausgabestream STDOUT gehen, 
durch deine Funktion durch, im obigen Fall also durch die serielle 
Schnittstelle UART.

Du brauchst das nicht. Es kann aber nützlich sein, das zu benutzen, wenn 
du z.B. die komfortablen Formatiermöglichkeiten eines printf magst und 
dein (ein fremdes) Programm mit gängigen C-Funktionen schreiben willst, 
statt überall eigene Funktionen zu benutzen.

Wenn du z.B. printf benutzen willst, um auf ein LCD was auszugeben, 
kannst du mit fdevopen an einer Stelle eine entsprechende 
LCD-Ausgabefunktion einbinden und brauchst nicht überall wo eine Ausgabe 
gemacht wird UART auf LCD umzuschreiben.

Mehr Infos hier:
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar! Danke für die schnelle und verständliche Hilfe!

Ob ich dann also nachher
USART_TxString('test');
oder
printf('test');
schreibe spielt dann keine Rolle mehr.

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ...spielt dann keine Rolle mehr.

Im Prinzip ja, denn der Compiler wird in beiden Fällen eine 
Fehlermeldung ausgeben.

Denn    'test' ist kein Zeiger/Pointer.

(Sorry, konnte ich mir nicht verkneifen ;-)

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.