printf zweimal

OP #2600789
Hallo

es geht um einen Atmega324PA.
Dieser hat 2 Uarts.
Wie kann ich nun für jeden Uart eine eigene printf Funktion erstellen.

Bisher habe ich nur einen Uart gebraucht, da habe ich es folgendermaßen 
gemacht:

  fdevopen (uart_putc, 0);



Viele Grüße
Richi
#2600833
Hallo Richi,

verwende kein printf.

Chan hat da einige schöne Libs im Netz:

* http://elm-chan.org/fsw/strf/xprintf.html

Ich verwende dann 2 mal diese Lib:

"Embedded printf module for AVR"
* http://elm-chan.org/docs/avrlib/xitoa.zip

Weitere Anregungen findest Du hier:

Beitrag "Re: [S] "selfmade" sprintf()- Funktion:)"

und hier etwas von PeDa:

"Formatierte Zahlenausgabe in C"
* Beitrag "Formatierte Zahlenausgabe in C"
#2601553
Es gibt 2 Ansätze.

1.
Du benutzt sprintf und schreibst auf einen Puffer, den Du der UART0 oder 
UART1 übergibst.

2.
Du definierst eine Variable, die zwischen UART0 und 1 umschaltet.
1
uint8_t uselect = 0;
2

3
void putchar( char c )
4
{
5
  switch( uselect ){
6
    case 0: putchar0( c ); break;
7
    case 1: putchar1( c ); break;
8
  }
9
}

Die einzelnen UART-Funktionen (init_uart0, putchar0, getchar0 usw.) mußt 
Du für beide UARTs bereitstellen.


Peter
#2601622
Peter Dannegger schrieb:
> Es gibt 2 Ansätze.
>
> 1.
> Du benutzt sprintf und schreibst auf einen Puffer, den Du der UART0 oder
> UART1 übergibst.
>
> 2.
> Du definierst eine Variable, die zwischen UART0 und 1 umschaltet.

3.
Du benutzt fprintf.
1
FILE *uart0 = fdevopen (uart0_putc, 0);
2
FILE *uart1 = fdevopen (uart1_putc, 0);
3

4
fprintf (uart0, "Hallo Null!");
5
fprintf (uart1, "Hallo Eins!");
OP #2607153
Hallo

erstmal danke für eure Hilfe.
Ich habe jetzt meinen ganzen Code mit den elm-chan-Bibliotheken 
ausgestattet. Dann habe ich folgendes gemacht:

#define uart0_printf( xfprintf(uart0_putc,

nun kommt aber die Fehlermeldung

Fehler  1  "(" may not appear in macro parameter list

wie kann ich diesen Fehler beheben?
#2607181
Am besten keine Klammer in eine Makro-Parameterliste schreiben ;-)

Die Frage ist, was diese Klammer
1
#define uart0_printf( xfprintf(uart0_putc,
2
                    ^

da sucht. Sie öffnet die Parameterliste von uart0_printf, also gehört 
alles, was dahinter bis zur schließenden Klammer (die bei dir fehlt) 
kommt, sind Paramter.
OP #2607273
Danke Rolf. Genau das habe ich gesucht, man lernt nie aus.

Jetzt hätte ich noch eine konkrete Frage zu der verwendeten Bibliothek.
Diese fordert von der putc-Funktion als Übergabeparameter ein 
unsigned-char. Bisher habe ich und ich will dass es auch so bleibt immer 
ein char übergeben. Muss ich eine extra Funktion erstellen oder kann man 
da einen einfachen Trick (cast, ich weiß nur nicht wo) anwenden?

Gruß
Richi
OP #2608946
Ich habe mir jetzt eine extra Funktion für unsigned-chars erstellt.

@Rolf:

Mir ist dazu noch eine Frage eingefallen.
Ich mache fogendes:
#define abc(__s, ...) abcde(__s, _VA_ARGS_)

Wenn _VA_ARGS_ leer ist, also keine zusätzlichen Parameter mit 
übergeben werden, kommt eine Fehlermeldung, weil auf das Komma die 
Klammer folgt.

Wie kann ich das umgehen.

Meine Idee, ein extra Define funktioniert auch nicht:
#define abc(__s) abcde(__s)

Gruß
Richi
Gast #2609339
Richard W. schrieb:
> Mir ist dazu noch eine Frage eingefallen.
> Ich mache fogendes:
> #define abc(__s, ...) abcde(__s, _VA_ARGS_)
>
> Wenn _VA_ARGS_ leer ist, also keine zusätzlichen Parameter mit
> übergeben werden, kommt eine Fehlermeldung, weil auf das Komma die
> Klammer folgt.
>
> Wie kann ich das umgehen.

Der GCC kann alles, man muss nur die Doku lesen:

>Second, the `##' token paste operator has a special meaning when placed
>between a comma and a variable argument. If you write

>     #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)

>and the variable argument is left out when the eprintf macro is used, then
>the comma before the `##' will be deleted. This does not happen if you
>pass an empty argument, nor does it happen if the token preceding `##' is
>anything other than a comma.
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.