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


von Patrick (Gast)


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:
1
extern  void  USART_Init ()
2
{
3
  ...
4
  fdevopen(USART_TxChar, 0);
5
  USART_TxString("USART OK\n\r");
6
}
7
8
static  int  USART_TxChar (
9
    char   data,         /*FPI ein Charakter              */
10
    FILE   *dummy)        
11
{
12
  /*FA Wait for empty transmit buffer */
13
  while ( !( UCSR1A & (1<<UDRE1)) );
14
  /*FA Put data into buffer, sends the data */
15
  UDR1 = data;
16
  return 0;
17
}
18
19
extern  void  USART_TxString (
20
    char   *string)      /*FPI String                */    
21
{
22
    /*FA so lange *string != '\0' also ungleich dem "String-Endezeichen" */
23
  while (*string)
24
    {   
25
        USART_TxChar(*string, 0);
26
        string++;    
27
    }
28
}

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

Danke für Eure Antworten
Gruss
Patrick

von Stefan E. (sternst)


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__avr__stdio.html#gb599ddf60819df4cc993c724a83cb1a4

von Stefan B. (stefan) Benutzerseite


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__avr__stdio.html#gb599ddf60819df4cc993c724a83cb1a4

von Patrick (Gast)


Lesenswert?

Alles klar! Danke für die schnelle und verständliche Hilfe!

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

von Werner B. (werner-b)


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 ;-)

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.