uart_puts mit Escape Sequenzen

Gast #952623
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?
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 #952630
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.
Persönliche Seite #952968
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__avr__stdio.html

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