Mithilfe von printf auf UART0 und UART1 Ausgaben machen (LPC2138)

Gast #1499340
Hallo Zusammen,

Ich möchte mit Hilfe von printf Ausgaben auf beiden seriellen 
Schnittsellen des Mikrocontrollers machen.
Mit einer Schnittstelle habe ich keine Probleme, ich habe einfach die 
Funktion sendchar() für eine Schnittstelle definiert und kann dann mit 
printf Ausgaben auf diese Schnittstelle machen.
Wie kann ich aber mit printf Ausgaben auf beide Schnittstellen machen?
Ich stelle mir das so vor, dass ich mit einem Argument angeben kann auf 
welche Schnittstelle printf schreiben soll.


z.B.: printf(UART0, "Test1");
      printf(UART1, "Test2");


Funktioniert so was, oder wie kann ich das am einfachsten realisieren?


freundliche Grüße,
Stefan
Gast #1499601
Hallo!

Vielen Dank schon mal für deine Antwort, nur komme ich trotzdem nicht 
weiter.
Ich kenne die Fuktion fprintf() um in Dateien zu schreiben.
Aber wie schaffe ich es nun auf die beiden seriellen Schnittstellen zu 
schreiben?

Muss ich mit fopen() zuerst die Schnittstelle öffnen?
Wenn ja, wie? -> fopen("UART0", "w"); ???

Hilf mir bitte ein bißchen auf die Sprünge, ich kann nichts finden, dass 
mir in dieser Sache weiterhilft.


mfg
Stefan
Gast #1499633
Was du willst ist eine Funktion, welche mit sprintf arbeiten. Schau dir 
variable Argumentenlisten an, mache deine printf, das erste Argument 
gibt an welcher UART und die restlichen werden 1:1 an sprintf 
weitergegeben. Der string der dabei entsteht geht dann per uart_puts() 
o.ä. raus. das sind keine 10 Zeilen Code.
Wenn du selbst nich drauf kommst, kann ich dir später auch mal ein paar 
Codeschnipsel geben.
Gast #1499653
Hallo und Danke!

in der Zwischenzeit hatt ich eine Idee...
Ich habs inzwischen so realisiert:

Damit printf Ausgaben auf die Uart macht, muss ich ja eine Funktion 
definieren -> sendchar()!

Jetzt habe ich einfach die sendchar-Funktion erweitert:

bevor ich printf() aufrufe setze ich eine globale Variable UART (Wert = 
0 für UART0, Wert = 1 für UART1)!

und senchar() sieht so aus:
1
senchar (unsigned char ch)
2
{
3
   if (UART != 1)
4
   {
5
      //sende an UART0
6
   }
7
   else
8
   {
9
      //sende an UART1
10
   }
11
}


Danke für eure Hilfe!
Gast #1499674
Aber printf() ist was ganz anderes, das formatiert dir deinen string, 
daher ja das f am Schluss...

So wie du das machst wird das wohl auf eine poplige uart_puts() 
herauslaufen, bei der einfach noch ausgewählt wird, welcher uart...
1
void uart_puts(int uart, char *str) {
2
   while(*str) {
3
      putchar(uart, *str);
4
      str++;
5
   }
6
}

Ich rate dir, lern erstmal die Grundlagen von C und mit einer C-Lib 
umzugehen, bevor du versucht die eine eigene auf Controllern zu bauen 
oder einfach mal ein wenig uC-C-Howtos durchlesen, das wurde das alles 
schon 24 mal durchgekaut.
Gast #1500028
wenn kein Anhang möglich halt so:
1
/*
2
 * ----------------------------------------------------------------------------
3
 * "THE BEER-WARE LICENSE" (Revision 42):
4
 * <joerg@FreeBSD.ORG> wrote this file.  As long as you retain this notice you
5
 * can do whatever you want with this stuff. If we meet some day, and you think
6
 * this stuff is worth it, you can buy me a beer in return.        Joerg Wunsch
7
 * ----------------------------------------------------------------------------
8
 *
9
 * Stdio demo
10
 *
11
 * $Id: stdiodemo.c,v 1.1 2005/12/28 21:38:59 joerg_wunsch Exp $
12
 */
13

14
#include "defines.h"
15

16
#include <ctype.h>
17
#include <stdint.h>
18
#include <stdio.h>
19

20
#include <avr/io.h>
21
#include <avr/pgmspace.h>
22

23
#include <util/delay.h>
24

25
#include "lcd.h"
26
#include "uart.h"
27

28
/*
29
 * Do all the startup-time peripheral initializations.
30
 */
31
static void
32
ioinit(void)
33
{
34
  uart_init();
35
  lcd_init();
36
}
37

38
FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
39
FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
40

41
static void
42
delay_1s(void)
43
{
44
  uint8_t i;
45

46
  for (i = 0; i < 100; i++)
47
    _delay_ms(10);
48
}
49

50
int
51
main(void)
52
{
53
  uint8_t i;
54
  char buf[20], s[20];
55

56
  ioinit();
57

58
  stdout = stdin = &uart_str;
59
  stderr = &lcd_str;
60

61
  fprintf(stderr, "Hello world!\n");
62

63
  for (;;)
64
    {
65
      printf_P(PSTR("Enter command: "));
66
      if (fgets(buf, sizeof buf - 1, stdin) == NULL)
67
  break;
68
      if (tolower(buf[0]) == 'q')
69
  break;
70

71
      switch (tolower(buf[0]))
72
  {
73
  default:
74
    printf("Unknown command: %s\n", buf);
75
    break;
76

77
  case 'l':
78
    if (sscanf(buf, "%*s %s", s) > 0)
79
      {
80
        fprintf(&lcd_str, "Got %s\n", s);
81
        printf("OK\n");
82
      }
83
    else
84
      {
85
        printf("sscanf() failed\n");
86
      }
87
    break;
88

89
  case 'u':
90
    if (sscanf(buf, "%*s %s", s) > 0)
91
      {
92
        fprintf(&uart_str, "Got %s\n", s);
93
        printf("OK\n");
94
      }
95
    else
96
      {
97
        printf("sscanf() failed\n");
98
      }
99
    break;
100
  }
101
    }
102
  fprintf(stderr, "Bye-bye");
103
  delay_1s();
104
  for (i = 0; i < 3; i++)
105
    {
106
      putc('.', stderr);
107
      delay_1s();
108
    }
109
  fprintf(stderr, "\n ");
110

111
  return 0;
112
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.