Forum: Mikrocontroller und Digitale Elektronik extern FILE uart_out ?


von Karl-Heinz M. (schnapsglas)


Lesenswert?

Guten Tag,

nach dem Beispiel aus dem gcc-avr-Tutorial habe ich printf() testweise 
sowohl auf Uart als auch ins Eeprom umgeleitet (Geizkragen 
printf-debugging).

Allerdings klappt es nur, wenn
1
FILE uart_out = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );
2
stdout = &uart_out;

in main.c steht.

Ich hätte die Zeilen aber lieber in der Initialisierung vom Uart bzw. 
Eeprom, damit ich zur Laufzeit komfortabel wechseln kann. Es 
funktioniert aber nicht, d. h. printf funktioniert nur aus uart.c heraus 
und nicht aus main. uart.h ist in main unkludiert.
Versteh ich das richtig, dass stdout ein vordefinierter globaler Zeiger 
ist?
Was mach ich falsch?

AVR m1284p

Aus  uart.c:
1
#include <stdio.h>
2
uart_init()
3
{
4
FILE uart_out = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );
5
stdout = &uart_out;
6
printf("Uart Init");
7
}
8
9
int uart_putchar(char c, FILE *uart_out)
10
{
11
    tx_Puffer[tx_SchreibZeiger] = c;
12
    tx_SchreibZeiger++;
13
    tx_ByteZaehler++;
14
    UCSR0B |= (1 << UDRIE0);     //Starte uebertragung, falls sie noch nicht laeuift
15
}
Aus uart.h:
1
int uart_putchar(char c, FILE *uart_out);

von Stefan E. (sternst)


Lesenswert?

Karl-Heinz Meyer schrieb:
> Was mach ich falsch?

Du verwendest eine FILE Variable, die nach dem Ende von uart_init() gar 
nicht mehr existiert. Mach sie static-local (oder global).

: Bearbeitet durch User
von Karl-Heinz M. (schnapsglas)


Lesenswert?

Danke,mit
1
static FILE uart_out = FDEV_SETU...
 funktioniert es.

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.