uart_puts mit Escape Sequenzen

Gast #952623
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?
1
//Aufruf:
2
uart_puts("at+cmgs=%i\r\n",smsclen);
3

4
//Unterprogramm:
5
void uart_puts(const char *s,...)
6
{
7
    while (*s) 
8
      uart_putc(*s++);
9

10
}/* uart_puts */

mfg
Persönliche Seite
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.
Persönliche Seite
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__avr__stdio.html

Antwort schreiben

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