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

Gast #1499340
Lesenswert?

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

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

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

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

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

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

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