Forum: Mikrocontroller und Digitale Elektronik uart_puts mit Escape Sequenzen


von schurli (Gast)


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

von Uwe .. (uwegw)


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>.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von schurli (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


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

von schurli (Gast)


Lesenswert?

@stefan

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

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.