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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.