Hallo,
ich möchte gerne aus einigen Menüpunkten einen Auswählen, und zwar so,
dass man mit den Cursor (links, rechts, obern, unten) einen Menüpunkt
auswählt und mit Enter bestätigt.
Vielleicht mit den Escape- Esquenzen. Ich hba schon ziemlich viel
darüber gelesen aber ich hab sowas nicht gefunden.
Hat da jemand eine Ahnung?
vielen Dank für Eure Antworten.
lg
Hannes
Was hast du denn gelesen, wenn du es nicht gefunden hast???
Wie soll das ganze denn überhaupt aufgebaut werden? Ein PC-Programm? Mit
nem µC?
Soll es auf nem LCD zu sehen sein?
Oder die Punkte auf einer Platte geschrieben und davor leuchten LEDs bei
der Auswahl?
Wenn µC, was für einer sollte es sein?
Und überhaput...
ich möchte einfach ein Menue miu dem µC auf den Hyperterminal schreiben
und dann einen Menüpunkt auswählen. Der jeweils angewählte Menüpunkt
soll grau hinterlegt sein.
Wenn ich ENTER drücke, soll dieser Strin über das HT an den µC gesendet
werden.
1. ist mir das graue hinterlegen der Menüpunkte unklar und zweitens, wie
kann ich dem Hyperterminal sagen, dass der String erst nach dem drücken
der ENTER- Taste über die serielle Schnittstelle geschickt werden soll.
Das Hyperterminal schickt ja die eingegenenen Daten sofort an die
serielle Schnittstelle.
Vielen Dank für Eure Bemühungen.
lg
Hannes
also per hyperterminal selbst geht das nicht.
hyperterminal ist NUR ein terminalprogramm welches RS232 Daten anzeigt
(und dabei per ESC-Sequenzen bestimmte Features wie
Cursor-Position,Farbe,Schriftattribute und andere nette Features zur
verfügung stellt).
Das Menü selbst (Funktionalität und Ausgabe), sowie die Reaktion
(Steuerung) auf die Cursor-tasten (die Hyperterminal dann selbst als
ESC-Sequenz sendet) müssen im uC implementiert sein. Das
Terminalprogramm fungiert dann letztendlich als "großes farbiges
Text-Display" (wenn man es so formulieren will).
Allerdings gibt es bei den Terminals unterschiedliche Modi (wovon der
VT100-Modus wahrscheinlich der gängiste Modus ist, lässt sich
einstellen).
Die einzelnen Modi unterscheiden sich dann durch Funktionalität und
ESC-Sequenzen.
Das was du bräuchtest wäre eine Script-Sprache mit der du ein solches
Terminal selber bauen kannst (weil ein normales Terminal ja keine
Menü-Punkte kennt ..), oder eben eine Hochsprache wie Delphi/C++ mit der
du sowas realisieren kannst.
Gruß
Rene
Dazu braucht er keine Scriptsprache und es muss auch mit einem normalen
Terminal gehen. Schliesslich können das diverse Switches und Router mit
serieller Schnittstelle auch und Mailboxsysteme (früher in den
Tiernetzen ;-) konnten das schon.
Einfachste vorstellbare Version ist, dass der µC ständig eine neue Seite
schickt. Nach jedem Tastendruck wird also das Menü im µC neu generiert
und rüberschickt. Das bedeutet halt, dass man jedesmal ein paar tausend
Byte übertragen muss. Da sollte nicht gerade mit 1200 Baud gearbeitet
werden ;-)
>Einfachste vorstellbare Version ist, dass der µC ständig eine neue Seite>schickt
Das wird auch die einzige Möglichkeit sein, sofern HT nicht sowas
ähnlihces wie HTML unterstützt.
schon richtig, aber ich hab es so verstanden das das hyperterminal das
menü SELBST erledigen soll, und das kann hyperterminal (oder ein
x-beliebiges anderes terminal) eben nicht, weil nicht dafür gedacht.
die switche und router die per terminal konfiguriert werden können
müssen dann solch ein menü selbst "machen" (wie du schon richtig
meintest selbst den inhalt aufbereiten, an ht senden und auf eingaben
reagieren).
hab mich mit script-sprache vielleicht etwas blöd ausgedrückt. hätte
sagen sollen : "wenn ein terminal von sich aus vordefinierte menütexte
darstellen soll und auf cursor-eingaben reagieren soll, muß man ein
solches terminal selbst schreiben, egal ob in delphi/c++ oder
irgendeiner anderen hochsprache (script-sprachen mit eingeschlossen).
nur wäre es dann eben kein richtiges terminal mehr, da ein terminal NUR
rs232 daten darstellt und dabei einige features bietet (farbige
darstellung, cursor-funktionen usw ...)"
aber abgesehen davon, man muß nicht jedesmal die komplette seite senden,
es reichen einige wenige befehle wenn man sich die ESC-Sequenzen von
VT100 genauer anguckt (zeilen teilweise löschen, cursor-positionieren).
hab vor ein paar jahren mal sowas mit nem 8051 gemacht. auch eine
menüsteuerung mittels VT100 (aber ohne farbe). je nachdem wie man die
daten organisiert und das menü aufbaut kommt man mit recht wenig traffic
aus (1200 baud ist wahrlich etwas wenig, aber ab 9600 wirds gut
bedienbar, wenns nur um die auswahl von menüpunkten geht)
Thomas, kannst du das noch genauer schreiben, wie du das meinst. Wie
soll ich das hinterlegen eines Menüpunktes machen bzw wie ist das
aufgebaut - das Menü. Brauch ich das was spezielles bzw. wie realisier
ich das.
Vielen Dank.
lg
Hannes
Stell dir HT als deine Ausgabefläche vor.
Sie wie ein LCD. Mehr ist das nicht!
Du kannst den Cursor rumjagen und kannst Schriftattribute
umstellen.
Dazu muss aber der µC auch die entsprechenden Kommandos
schicken. Diese Kommandos sind diese ominösen Escape-Sequenzen.
Sagen wir mal, du möchtest folgendes Menü aufbauen
1) Edit
2) Copy
3) Paste
(Ich verwende im folgenden die VT100-Sequenzen)
Dazu teilst du dem HT mit dass es erst mal den Bildschirm
löschen soll. Du schickst ihm also die Sequenz für 'Clear-Screen'
(Für printf musst du natürlich deine UART Übertragungsfunktion
einsetzen)
printf( "/x1b[2J" );
Jetzt ist der Bildschirm leer und der Cursor steht links oben.
Du möchtest, dass dein Menü in Zeile 2 beginnt. Also schickst du
den Cursor dort hin. Aus der VT100 Doku ergibt sich dass die
Escape Sequenz "Cursor Home" genau das macht, wenn man Zeilen
und Spaltennummern angibt:
printf( "\x1b[2;1H" );
Jetzt müsste der Cursor also am Anfang der 2. Zeile stehen. Ich bin
jetzt nicht mehr sicher, ob hier bei 0 oder bei 1 zu zählen begonnen
wird. Kann man aber ausprobieren.
Danach gibst du deine Menüpunkte aus:
printf( "1) Edit\n" );
printf( "2) Copy\n" );
printf( "3) Paste\n" );
Nach diesem Ausgaben steht der Cursor in der 5. Zeile ganz links.
Willst du also den 1. Menüpunkt hervorheben, so muss der
Cursor erst mal 4 Zeilen nach oben gehen, oder was dazu gleich-
bedeutend ist: er muss wieder an den Anfang der 2. Zeile.
Die Escape Sequenz dazu kennst du schon: "Cursor Home"
Also schicken wir den Cursor wieder dort hin:
printf( "\x1b[2;1H" );
Der Cursor steht jetzt wieder am Anfang der Zeile in der "1) Edit"
steht.
Das möchtest du hervorheben. Also stellst du die Schrift um, sodass sich
schwarze Schrift auf hellem Hintergrund ergibt. Ein kurzes Suchen in
der VT-100 Doku ergibt, dass die Sequenz "Set Attribute Mode" dafür
benutzt werden kann. Wir benutzen 'reverse'. Also schicken wir
printf( "\x1b[7m" );
Alles was jetzt ausgegeben wird, wird also invertiert dargestellt.
Dazu geben wir den Text "1) Edit" nachmal aus, der dann folgerichtig
mit heller Schrift auf dunklem Grund ausgegeben wird.
Jetzt warten wir auf eine Benutzereingabe. Nehmen wir mal an die
wurde gemacht und der Benutzer hat 'cursor down gedrückt' und dein
µC hat das auch richtig erkannt. Die Absicht des Benutzers ist
klar, er möchte den 1. Menüpunkt deaktivieren und den 2. Menüpunkt
aktivieren.
Was muss daher geschehen?
Der 1. Menüpunkt muss wieder auf normale Schrift umgeschaltet werden
und dafür muss der 2. Menüpunkt invertiert dargestellt werden.
Um den 1. Menüpunkt normal darzustellen schicken wir
den Cursor an den Anfang dieser Zeile:
printf( "\x1b[2;1H";
schalten die Schrift wieder auf normal
printf( "\x1b[0m";
und geben den Text aus
printf( "1) Edit" );
danach gehts an den Anfang der nächsten Zeile
printf( "\x1b[3;1H" );
schalten dort invertiert ein
printf( "\x1b7m" );
und geben den Text aus der invertiert dargestellt werden soll
printf( "2) Copy" );
Wenn jetzt alles glatt gegangen ist, dann ist der 1. Menüpunkt
wieder normal und dafür wurde der 2. Menüpunkt hervorgehoben.
Und so gehts weiter. Du wartest auf eine Benutzereingabe und
reagierst entsprechend. Das kann heissen, dass du den Cursor durch
die Gegend jagst und Texte durch überschreiben (mglw. mit anderen
Textattributen) erneuerst. Hat der Benutzer 'Return' gedrückt, dann
wirst du den momentan aktiven Menüpunkt übernehmen und irgendeine
Aktion auslösen und als Folge davon zb. den Bildschirm löschen oder
ein anderes Menü aufbauen.
Das Prinzip ist aber immer dasselbe: Dein µC jagt im Hyperterminal
den Cursor durch die Gegend und macht gezielte Ausgaben, sodass sich
für deinen Benutzer ein Menü ergibt.
Hallo TheMason,
Könntest du mir da Tipps geben wie ich das mache. Scheint ja ein
bisschen schwieriger zu sein. Oder kannst du mir dein Programm irgendwie
zukommen lassen. Ich steh momentan voll an.
Vielen Dank.
lg
Hannes
also das programm selbst habe ich nicht mehr da (ist mir bei einem
hdd-crash zerbröselt ...)
aber ich kann dir folgende vorgehensweise empfehlen (änlich dem von karl
heinz im posting oben drüber) :
baue dir funktionen die folgendes machen
- bildchirm löschen (1 esc sequenz)
- zeile ab cursor-position löschen (1 esc sequenz)
- zeile bis cursor-position löschen (1 esc sequenz)
- farbe setzen (1-2 esc sequenzen)
- cursor-positionieren (1-2 esc sequenzen)
- text ausgeben
ablauf
- initialisierung/update
1. lösche den bildschirm
2. setze 1. cursorposition
3. gebe farbe aus (schwarz wenn nicht selektiert, grau wenn selektiert)
4. gebe text aus
5. wiederhole für anzahl der menüpunkte die schritte 2-4
- empfang von daten per uart (nach möglichkeit int. gesteuert)
1. speichere dir alles in einem buffer
- hauptporgramm-verarbeitung
1. lese zeichen aus dem buffer
2. = esc ? , dann lese noch ein zeichen aus dem buffer
3. wenn es eine cursor taste ist setze variable die dir den selektierten
menüpunkt (als zahl) hält
4. mache ein update (abschnitt initialisierung)
5. war das erste gelesene zeichen ein enter, springe in die
entsprechende funktion
das ist jetzt nur ein grober ablauf, wie man ein solches menü
realisieren kann.
ich vermute mal du machst das ganze in c. da hat man dann noch einiges
an möglichkeiten (vor allem wenn du die datenstrukturen (stichwort :
texte, funktionen die aufgerufen werden) richtig aufsetzt) den code
klein schnell universell und vor allem flexibel zu gestalten.
> aber abgesehen davon, man muß nicht jedesmal die komplette seite senden,
Er sagte ja auch, daß das die einfachste vorstellbare Möglichkeit
ist. Und da gebe ich ihm schon recht. Gerade einen Neuling bringt
das an den Rande des Wahnsinns, wenn der Cursor wieder mal nicht
dort ist, wo ihn das Programm annimmt :-)
ok ...
ist vielleicht ein bissl viel auf einmal wenn man noch nicht viel damit
gemacht hat. für den ersten test wäre es sicherlich einfacher alles neu
zu senden.
aber dann sollte man sich auch schnell an die optimierung machen (dann
erkennt man welches potzential in der vt100 darstellung liegt) und man
kann freudig größere menüs darstellen ohne das das ganze zeitraubend
wird, und die eigentliche steuerung/darstellung kaum mehr rechenzeit
frisst ...
full ack
Am Besten ist sowieso mal ein bischen spielen.
Was weis ich: Die aktuelle Uhrzeit an immer
der gleichen Stelle ausgeben. Dann vielleicht
nur die Minuten invertiert ausgeben. Dann das
Ganze in Grosschrift.
Irgendsowas in der Richtung. Dann hat man den
Dreh schnell raus und kann sich seinem eigentlichen
Problem widmen.
Und ganz wichtig: Hilfsfunktionen basteln!
Aber das hast du ja schon angesprochen. Ich
seh nur immer wieder, wie gerade Neulinge an
der von ihnen selbst geschaffenen Komplexität
ersticken. Funktionen für Cursor positioniern,
Schirm löschen, etc. sind schnell gemacht und
mindern das Problem etwas.
ebent ...
geht nix über strukturiertheit und das problem in möglichst viele kleine
teilprobleme zurecht-crunchen und dann die teilprobleme schnell und
sauber implementieren.
aber das ist gerade für anfänger mehr eine geduldsfrage (man will ja was
sehen :-))
kenne das problem ja auch ... mal eben schnell was machen damit man was
sieht, dann sieht man was mehr, dann noch mehr und dann sieht man gar
nix mehr weil der code so wuselig wird und man selber nicht mehr
durchblickt und am schluß muß man den weg eh neu gehen :-)))
aber so lernt man ... :-)
Danke für deine ausführliche Erklärung, Hilft mir sehr,
Mein Problem ist noch, dass ich auf einem µC arbeite, der alles zyklisch
wiederholt,
ich kann also nicht das Menü ausgeben und dann darauf warten, dass etwas
über die serielle schnittstelle hereinkommt, ich muss etwas
hinausschreiben, dann mit einem trigger ausschalten, dann warten, bis
was reinkommt, dann wieder einschalten und dann das machen.
Es ist a bissl komüpliziert, aber es wird schon gehen.
Vielen Dank nochmals.
lg
Hannes