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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.