printf zweimal

#2600833
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren