Uart & printf

Gast #3937281
Lesenswert?

printf ist sowieso ganz falsch. Diese alleskoennende Funktion ist viel 
zu klotzig auf einem Controller. Dann ist printf blockierend, das ist 
ebenso ganz falsch. Man schreibt die Applikation immer nicht 
blockierend.
Persönliche Seite #3937392
Lesenswert?

думлихер троль schrieb:
> printf ist sowieso ganz falsch. Diese alleskoennende Funktion ist viel
> zu klotzig auf einem Controller. Dann ist printf blockierend, das ist
> ebenso ganz falsch. Man schreibt die Applikation immer nicht
> blockierend.

Auf einem Controller mit 512k Flash geht ein printf im Rauschen unter.

Und was heißt blockierend? printf wird die auszugebenden Zeichen irgend 
einer Art von IO-Schicht übergeben. Diese kann durchaus gepuffert sein 
so das printf zurückkehrt noch bevor auch nur ein Zeichen die serielle 
Schnittstelle (oder ein Display, oder was auch immer) erreicht hat.

Matthias
OP #3937547
Lesenswert?

hei,

Den größten Teil mit  " printf " habe ich bereits umgeschrieben.
Möchte auch in Zukunft mich nach Möglichkeit von dieser Anweisung fern 
halten.
Möchte auf einfache weise, den UART X zu wählen.

Die Cursor Position habe ich immer so gemacht.
1
printf("\033[%u;%uH", zeile, spalte );

Dieses ist meine jetzige Version.
Leider ist hier in der Zeile die Koordinaten fest vorgegeben.
Ich möchte hier flexibel sein.
1
*buf = "\033[25;30H\0";  // Zeichen Position
2
Uart3_WriteString(*buf);

vielen Dank für jede Info/Hilfe

schönen Tag
#3937554
Lesenswert?

L. R. schrieb:
> hei,
>
> Den größten Teil mit  " printf " habe ich bereits umgeschrieben.
> Möchte auch in Zukunft mich nach Möglichkeit von dieser Anweisung fern
> halten.
> Möchte auf einfache weise, den UART X zu wählen.

Ganz ehrlich.
Die einfachste Variante ist es, auf printf zu verzichten und statt 
dessen über sprintf zu gehen.
Um das Schreiben von UART Funktionen kommst du sowieso nicht rum. Egal 
für welche UART.

Und ob du
1
  printf("\033[%u;%uH", zeile, spalte );
schreibst, oder ob du
1
  char buffer[20];
2
  sprintf(buffer, "\033[%u;%uH", zeile, spalte );
3
  uart1_puts( buffer );
schreibst, ist im Grunde Jacke wie Hose. Denn wie gesagt, die uart 
Funktionen, die eine bestimmte UART intialisiern bzw. 1 Zeichen auf der 
UART ausgibt, bzw. darauf dann aufbauend eine Funktion die einen String 
ausgibt (die uart1_puts) die wirst du sowieso schreiben müssen, wenn du 
sie vom System nicht schon fertig zur Verfügung gekriegt hast.
Der einzige Unterschied ist, dass du in dem einen Fall die printf 
benutzt und im anderen Fall du dir mit sprintf die Ausgabe in einen 
String schreiben lässt(*) und du dann diesen String ausgibst. Aber 
abgesehen davon kann sprintf genau dasselbe wie printf. Nur mit dem 
Unterschied, dass du mit dem String, den dir sprintf generiert dann 
machen kannst, was du willst. Sei es in einer Datenbank speichern, oder 
auf einem LCD ausgeben, oder eine Laufschrift auf einer LED-Matrix 
machen oder auch auf einer der zur Verfügung stehenden UARTs ausgeben. 
Und wenn es sein muss, kann man das auch auf allen genannten Geräten 
gleichzeitig tun.

Auf einem PC mit seinen komplexen I/O Strukturen würde ich dir nicht 
dazu raten. Aber auf einem µC mit seinen vergleichsweise einfachen I/O 
Strukturen ist das wesentlich einfacher, als zu ergründen, wie sich die 
Macher der Lib das vorgestellt haben, dem printf unten rum die 
Funktionalität unterzujubeln, auf bestimmten Geräten eine Ausgabe zu 
machen.

(*) Das enstprechende Array muss natürlich gross genug dimensioniert 
sein, damit der String auch hineinpasst.

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