Forum: Mikrocontroller und Digitale Elektronik Wert einer Variable ausgeben (emWin)


von Andreas P. (andreas_p71)


Lesenswert?

Guten Morgen,
Ich habe ein eigentlich einfaches Problem, aber ich komme einfach nicht 
drauf. Auch Google habe ich schon bemüht, aber nichts gefunden.
Ich benutze das Tool emWin (ursprünglich von Segger) in Verbindung mit 
einem Touch-Display. Soweit sogut, aber ich schaffe es einfach nicht, 
den Wert einer Variable auszugeben. Dazu wird die Funktion
1
TEXT_SetText(hItem, "Test");

verwendet, wobei hItem die Verbindung zum Textelemnt herstellt und der 
zweite Parameter der Text ist. Bei konstanten Texten, die ich direkt im 
Code eintippe (wie im obigen Beispiel) ist es kein Problem, aber wie 
schaffe ich es nun den Wert einer Variable da auszugeben (Typ ist const 
char *).
Z.B. will ich die Sekunden ausgeben - die Variable "second" beinhaltet 
den Wert (z.B. 39). Ich will "39" ausgeben, aber wenn ich die Variable 
gecastet übergebe, kommt irgendwas an das Display.

Ich hoffe, mein Problem ist verständlich geschildert und lösbar!! Vielen 
Dank!

mfg
Andy

von Didi S. (kokisan2000)


Lesenswert?

Hallo Andreas,

ich arbeite zwar nicht mit emWin, aber im aktuellen Manual zu emWin wird 
zwischen Ausgabebefehlen für Text und Zahlen unterschieden. Hier heissen 
die Befehle

void GUI_DispDec(I32 v, U8 Len);
void GUI_DispFloat(float v, char Len);
void GUI_DispBin(U32 v, U8 Len);

Mit der Textausgabe kommst Du nicht weiter, weil die Variable als const 
definiert ist und direkt auf den Speicherinhalt zugegriffen wird, der 
beim Befehl TEXT_SetText(hItem, "Test") zwischen den "" steht. Du wirst 
in Deinem Handbuch nach Befehlen suchen müssen, die für die 
Zahlenausgabe vorgesehen sind.

Darf ich fragen, ob Du emWin privat oder geschäftlich nutzt?

Gruß
kokisan

von Andreas P. (andreas_p71)


Lesenswert?

Hallo,
Danke für die Info... Die GUI_ - Befehle kann ich leider nicht nutzen, 
weil ich mit den Widgets arbeite...
Aber ich habe in der Zwischenzeit eine Lösung gefunden:
1
char time[2]; 
2
3
time[0] = '0' + (uint16)Clock_SystemClock.second/10;
4
time[1] = '0' + (uint16)Clock_SystemClock.second%10;
5
6
TEXT_SetText(hItem, time);

Das funktioniert ganz gut. Ist zwar ein bisschen Tipperei, um die Texte 
vorzubereiten, aber wenns funktioniert.... ;)
Ich benutze das emWin beruflich - ist eigentlich eine ganz nette 
Library...

mfg
Andy

von Karl H. (kbuchegg)


Lesenswert?

Andreas P. schrieb:

> Das funktioniert ganz gut. Ist zwar ein bisschen Tipperei, um die Texte
> vorzubereiten, aber wenns funktioniert.... ;)

Dafür hat der liebe Gott dann Funktionen erfunden, damit man sich den 
immer gleichen Programmablauf in einer Funktion zusammenfassen kann.

Ansonsten
FAQ gleich der erste Eintrag

> Ich benutze das emWin beruflich

Das ist jetzt aber nicht dein Ernst? Du programmierst beruflich und hast 
Schwierigkeiten eine Zahl in einen Text um zuformatieren?

von Andreas P. (andreas_p71)


Lesenswert?

Danke für den Hinweis!

Karl Heinz Buchegger schrieb:
> Das ist jetzt aber nicht dein Ernst? Du programmierst beruflich und hast
> Schwierigkeiten eine Zahl in einen Text um zuformatieren?

Es ist noch kein Meister vom Himmel gefallen, oder?? Ich arbeite das 
erste Mal mit Displays und Ausgaben. Und deshalb gibt es ja Foren, damit 
man einen Schups in die richtige Richtung bekommt, oder...

mfg
Andy

von Karl H. (kbuchegg)


Lesenswert?

Andreas P. schrieb:

> Es ist noch kein Meister vom Himmel gefallen, oder?? Ich arbeite das
> erste Mal mit Displays und Ausgaben. Und deshalb gibt es ja Foren, damit
> man einen Schups in die richtige Richtung bekommt, oder...

Ähm.
Dir ist aber schon klar, dass das C-Programmierung 3.ter oder 4.ter Tag 
(von 30) ist?

von MagIO (Gast)


Lesenswert?

Ich kenne zwar emWin nicht, aber ich kann mir vorstellen, dass diese 
Implementierung potentiell einen Bug enthält.

Üblicherweise haben strings ein ende-Zeichen ( =0 ). Wenn Du time als 
char [2] definierts ist kein Platz mehr für ein stringende. Das heißt es 
hängt davon ab, was im Speicher nach time steht. Wenn es da mit Werten 
<>0 weiter geht, dann wirst Du wieder Müll auf dem Display finden.

char time[3];

time[0] = '0' + (uint16)Clock_SystemClock.second/10;
time[1] = '0' + (uint16)Clock_SystemClock.second%10;
time[2] = 0;

ist das Minimum.

von Andreas P. (andreas_p71)


Lesenswert?

> Ähm.
> Dir ist aber schon klar, dass das C-Programmierung 3.ter oder 4.ter Tag
> (von 30) ist?

Komm, lass es gut sein. Du hast recht und ich meine Ruhe...

@MagIO:
Danke für den Hinweis. Muss ich testen. Aber ich habe jetzt schon ein 
paar Ausgaben implementiert - ohne die 0 am Ende und noch keine Probleme 
gehabt.
Aber wie gesagt, ich bin neu auf dem Gebiet der Display-Programmierung 
und brauche nur ein wenig Starthilfe... :)

Lg
Andy

von Typ (Gast)


Lesenswert?

Vielleicht erspart dir das ein wenig Arbeit:
itoa() wandelt Interger-Zahlen automatisch in einen "String" um. Oder 
die Kanone für den Spatz: sprintf(). ;-)

von MagIO (Gast)


Lesenswert?

Na dann machs doch mal zum Spaß so:
1
char time[2],txt[2]; 
2
3
time[0] = '0' + (uint16)Clock_SystemClock.second/10;
4
time[1] = '0' + (uint16)Clock_SystemClock.second%10;
5
txt[0] = 'X';
6
7
TEXT_SetText(hItem, time);

Vielleicht bringt das den Bug ans Tageslicht. Ansonsten müsste man sich 
das binary, was beim compilieren/linken erzeugt wird mal ansehen. Wie 
gesagt, es ist mehr ne Glückssache ob's geht oder nicht.

Das hat auch nichts mit Display-Programmierung zu tun, so werden in C 
generell Strings gehandhabt.

von Karl H. (kbuchegg)


Lesenswert?

MagIO schrieb:

> Das hat auch nichts mit Display-Programmierung zu tun, so werden in C
> generell Strings gehandhabt.

@Andreas

Exakt.

Eine Kurzfassung findet sich hier.
http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C

Die ausführliche Variante findet sich, auch wenn ich es nicht sagen 
darf, in jedem noch so grindigem C-Buch.
Gibts auch Online
http://openbook.galileocomputing.de/c_von_a_bis_z/

von Andreas P. (andreas_p71)


Lesenswert?

Hallo,
Danke für eure Hinweise. Habt mir sehr geholfen...
Man lernt eben nie aus... :)

Mfg Andy

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.