Forum: Mikrocontroller und Digitale Elektronik Uart & printf


von L. R. (keyboard)


Lesenswert?

hei,

PIC32MX795F512L  C32 Compiler

Der µC hat gesamt 6 UART

Wenn ich eine Anweisung mit printf absende, woher weis dann der µC 
welcher UART gemeint ist?

schönen Abend

wünsche ein frohes Weihnachtsfest und ein gutes neues Jahr

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Das weiß er nicht. Und daher darfst du jetzt in das Compiler-Handbuch 
sehen, um herauszufinden wie man beim C32 einstellt wohin 
Standard-Output (printf) geht oder wie man andere *printf()-Varianten 
mit einem UART verbindet.

: Bearbeitet durch User
von L. R. (keyboard)


Lesenswert?

hei,

Habe heute weiter gesucht, wie man bei diesem µC den printf Befehl dem 
UART 3 zuordnet.
Derzeitig kommt alles am UART 2 an.

Ich habe davon keine Ahnung.

schönen Abend

von думлихер троль (Gast)


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.

von Μαtthias W. (matthias) Benutzerseite


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

von L. R. (keyboard)


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

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von L. R. (keyboard)


Lesenswert?

hei,

passt, wackelt und hat Luft.

Es funktioniert so wie ich möchte.

Vielen Dank.

schönen Tag

wünsche allen ein frohes Weihnachtsfest und ein gutes neues Jahr

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.