mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

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

mfg
Stephan

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bazi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
senchar (unsigned char ch)
{
   if (UART != 1)
   {
      //sende an UART0
   }
   else
   {
      //sende an UART1
   }
}


Danke für eure Hilfe!

Autor: bazi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
void uart_puts(int uart, char *str) {
   while(*str) {
      putchar(uart, *str);
      str++;
   }
}

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.

Autor: bazi (Gast)
Datum:

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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Anhang war weg

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn kein Anhang möglich halt so:
/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <joerg@FreeBSD.ORG> wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.        Joerg Wunsch
 * ----------------------------------------------------------------------------
 *
 * Stdio demo
 *
 * $Id: stdiodemo.c,v 1.1 2005/12/28 21:38:59 joerg_wunsch Exp $
 */

#include "defines.h"

#include <ctype.h>
#include <stdint.h>
#include <stdio.h>

#include <avr/io.h>
#include <avr/pgmspace.h>

#include <util/delay.h>

#include "lcd.h"
#include "uart.h"

/*
 * Do all the startup-time peripheral initializations.
 */
static void
ioinit(void)
{
  uart_init();
  lcd_init();
}

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

static void
delay_1s(void)
{
  uint8_t i;

  for (i = 0; i < 100; i++)
    _delay_ms(10);
}

int
main(void)
{
  uint8_t i;
  char buf[20], s[20];

  ioinit();

  stdout = stdin = &uart_str;
  stderr = &lcd_str;

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

  for (;;)
    {
      printf_P(PSTR("Enter command: "));
      if (fgets(buf, sizeof buf - 1, stdin) == NULL)
  break;
      if (tolower(buf[0]) == 'q')
  break;

      switch (tolower(buf[0]))
  {
  default:
    printf("Unknown command: %s\n", buf);
    break;

  case 'l':
    if (sscanf(buf, "%*s %s", s) > 0)
      {
        fprintf(&lcd_str, "Got %s\n", s);
        printf("OK\n");
      }
    else
      {
        printf("sscanf() failed\n");
      }
    break;

  case 'u':
    if (sscanf(buf, "%*s %s", s) > 0)
      {
        fprintf(&uart_str, "Got %s\n", s);
        printf("OK\n");
      }
    else
      {
        printf("sscanf() failed\n");
      }
    break;
  }
    }
  fprintf(stderr, "Bye-bye");
  delay_1s();
  for (i = 0; i < 3; i++)
    {
      putc('.', stderr);
      delay_1s();
    }
  fprintf(stderr, "\n ");

  return 0;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.