Forum: Mikrocontroller und Digitale Elektronik Mithilfe von printf auf UART0 und UART1 Ausgaben machen (LPC2138)


von Stefan (Gast)


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

von Stephan (Gast)


Lesenswert?

Hi
schau dir mal den C-Befehl 'fprintf' an.
Der könnte dich weiter bringen.

mfg
Stephan

von Stefan (Gast)


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

von bazi (Gast)


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.

von Stefan (Gast)


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!

von bazi (Gast)


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.

von bazi (Gast)


Lesenswert?

Achja, nochwas ein switch/case ist in solchen Fällen oft besser als 
mehrere if-Abfragen, jenachdem wie gut der Compiler optimiert.

von Stephan (Gast)


Lesenswert?

Hi

hier mal ein Beispiel aus dem Netz, ich glaub das trifft eher was du 
suchst.
Stephan

von Stephan (Gast)


Lesenswert?

der Anhang war weg

von Stephan (Gast)


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
}

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.