Zwischen 2 USART Schnittstellen umschalten

Gast #2355498
Lesenswert?

Hi,

ich habe einen XMega128A3 (eigentlich egal) und möchte an beide USART 
Schnittstellen nutzen um Daten an zei Geräte zu schicken (LCD und PC).

Ich habe beide Schnittstellen initialisiert und sie funktionieren auch. 
Jetzt ist nur die Frage wie ich die printf Routine in die beiden USARTs 
umleiten kann.

Ich habe folgende Funktionen:
1
  int uart_putchar_PC (char c, FILE *stream)
2
{
3
  if (c == '\n')
4
    uart_putchar_PC('\r',stream);          
5
  loop_until_bit_is_set(USARTE1.STATUS, USART_DREIF_bp);
6
  USARTE1.DATA = c;                  
7
  return 0;
8
}
9

10

11
//  ****************************************************************************
12

13
  int uart_putchar_LCD (char c, FILE *stream)
14
{
15
  //Ausgabe des Zeichens
16
  USARTE0.DATA = c;                    
17
  loop_until_bit_is_set(USARTE0.STATUS, USART_DREIF_bp);
18
  return 0;
19
}

Dann habe ich mir gedacht die Ausgabe über:
1
void select_UART (uint8_t channel)
2
{
3
  if (channel == PC)  {fdevopen (uart_putchar_PC, NULL);}
4
  if (channel == LCD) {fdevopen (uart_putchar_LCD, NULL);}
5
}

zu selektieren. Das klappt aber leider nicht, offensichtlich
kann ich eine einmal gewählte Ausgabe nicht überschreiben.

Kann mir jemand helfen?



Gruß
Knut
Gast #2355525
Lesenswert?

Hallo,

danke erstmal. Somit könnte ich mit
1
static FILE lcd = FDEV_SETUP_STREAM(uart_putchar_LCD,NULL,_FDEF_SETUP_WRITE);
2
static FILE pc = FDEV_SETUP_STREAM(uart_putchar_PC,NULL,_FDEF_SETUP_WRITE);
und dann über:
1
 stdout = &"lcd oder pc";
wählen?

Ich habe gerade den Beitrag Beitrag "Infomationen zu fdevopen"
gefunden der sich genau damit beschäftigt.

Welche Lösung ist die elegantere bzw. gibt es irgendwo Probleme?


Gruß
Knut
Gast #2355551
Lesenswert?

Hmmm.. klappt nicht, wenn ich fdev_setup_stream GROSS schreibe erkennt 
er es nicht, wenn ich es als klein Schreibe fehlt im ein Argument, er 
will 4 statt 3.
1
  static FILE lcd = fdev_setup_stream(uart_putchar_LCD,NULL,_FDEF_SETUP_WRITE);
2
  static FILE pc = fdev_setup_stream(uart_putchar_PC,NULL,_FDEF_SETUP_WRITE);
3

4
if (channel == PC)  {stdout = &pc;}
5
if (channel == LCD) {stdout = &lcd;}

Wieso?


Knut
Gast #2355559
Lesenswert?

Der Komiler erkennt es auch nicht wenn ich es klein schreibe.
Inlcuded habe ich die
1
#include <avr/interrupt.h>
2
#include <stdio.h>
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#include <stdint.h>

Knut
Gast #2355568
Lesenswert?

Ok, obigen Fehler gefunden:
1
  static FILE lcd = fdev_setup_stream(FILE,uart_putchar_LCD, NULL, _FDEV_SETUP_WRITE);
 aber nun habe ich einen Neuen:#
error: expected expression before 'do'

Wo wird da noch ein "do" aufgerufen?


Knut
#2355646
Lesenswert?

> if (channel == PC)  {stdout = &pc;}
> if (channel == LCD) {stdout = &lcd;}

Das würde ich nicht so machen.

Um printf mitzuteilen, auf welchen Stream die Ausgabe erfolgen soll, 
gibt es fprintf.

So gesehen ist ein printf nichts anderes als ein

   printf( .... )   <==>  fprintf( stdout, ..... )

Das kannst du aber genausogut

   fprintf( pc, ".....

oder

   fprintf( lcd, "....

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