www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uart_puts mit Escape Sequenzen


Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Wollte mit Peter Fleurys UART Library einen String ausgeben, den ich so 
wie bei printf behandeln will (Mit Escape Sequenzen)

Kann mir jemand sagen, was an meinem leicht gänderten Code falsch ist?
//Aufruf:
uart_puts("at+cmgs=%i\r\n",smsclen);

//Unterprogramm:
void uart_puts(const char *s,...)
{
    while (*s) 
      uart_putc(*s++);

}/* uart_puts */

mfg

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du es wie printf aufrufen willst, muss die Funktion auch dasselbe 
können wie printf (und das kann sie nicht).

Du könntest prinf benutzen und und aufs uart umlenken. Siehe 
avr-libc-Hilfe zu <stdio.h>.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du versuchst printf-Funktionalität nachzubilden, tust es aber nicht.

Zwar ist Dein uart_puts so deklariert, daß es eine variable 
Argumentenliste übergeben wird, diese aber wertest Du nicht aus, was Du 
aber tun müsstest, wenn Du willst, daß beispielsweise "%i" durch einen 
numerischen Wert ersetzt wird.

Da Du sicherlich nicht printf() neu erfinden möchtest, solltest Du hier 
mit snprintf() in einen Puffer schreiben und diesen dann mit einem 
uart_puts wie Deinem ausgebeverwenden, das Du nur von der Ellipse (den 
drei Punkten) im Prototypen befreien musst.

Möchtest Du sozusagen ein eigenes printf() bauen, das auf die uart 
ausgibt, kannst Du entweder die stdio-Ausgabefunktionen umbiegen (ist im 
Umfeld Deiner C-Library dokumentiert) oder aber ein uart_printf() 
schreiben.

Das muss dann die Funktionen va_start() und va_end() verwenden und 
vsnprintf() aufrufen -- sofern das die von Dir verwendete C-Library 
hergibt.

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man eigentlich 2 printf streams mit fdevopen machen.
Ich brauche diese Streams für einen Atmega64.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde einen alternativen Weg benutzen: Den Ausgabestring mit 
sprintf zusammenbauen und dann über ein selbstgeschriebens, einfaches 
uart0_puts und uart1_puts ausgeben. Damit umschifft man Probleme mit der 
Pufferung und wann umgeschaltet werden kann.

Wenn dennoch fdevopen benutzt werden soll, könnte ich mir vorstellen, 
die eigentliche Arbeitsfunktion uart_putchar zwischen UART0 und UART1 
umschaltbar zu schreiben. die Umschaltung könnte man per Zusatzfunktion, 
als Flag oder z.B. als ersten Parameter im Ausgabestring machen.
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@stefan

danke für den hinweis!
eigentlich genau dass, was ich brauche

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.