Forum: Mikrocontroller und Digitale Elektronik Menüsteuerung über Tastatur


von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe an der RS232 des PC einen Atmega8. Jetzt soll der Atmega ein Menü 
an Hyper Terminal schicken und der User soll per Tastatureingabe 
verschiedene Untermenüs etc. auswählen. Das Menü wird noch aufgebaut, 
aber wenn ich j oder n drücke, tut sich nichts?

Jemand eine Idee?

von Karl H. (kbuchegg)


Lesenswert?

Probier mal zuerst j drücken und dann Return

von Gast (Gast)


Lesenswert?

Nein, bringt leider nichts. Noch jemand eine Idee?

von Rolf Magnus (Gast)


Lesenswert?

Woher weiß dein getchar() eigentlich, daß es die serielle Schnittstelle 
verwenden soll?


PS: Warum gibt's so viele Leute, die ihrem C-Code die Namens-Endung 
'.txt' oder gar '.TXT' geben?

von Karl H. (kbuchegg)


Lesenswert?

Gast schrieb:
> Nein, bringt leider nichts. Noch jemand eine Idee?

Doku nachschauen, wie getchar in deiner Lib implementiert ist.
Normal ist es so, dass das I/O System Zeichen sammelt bis ein Return 
reinkommt.


Die (meiner Meinung nach bessere) Alternative ist es allerdings, auf 
getchar und Konsorten zu pfeifen und die UART direkt anzusprechen. Dann 
hast du alles in der Hand und hast die Probleme erst gar nicht.

von Katherine J. (katherine)


Lesenswert?

Moin Moin,

getchar() sollte gehen - aber wie bereits zuvor erwähnt, bau dir die 
inputroutine besser selbst.
1
        /* receive the character */
2
        k=getchar();
3
puts("\r\nDEBUG OUTPUT 001");
4
        sprintf(buffer, "%d\r\n", k);
5
        puts(buffer);
6
        if (k=='j')
Kannst du den Debug Output sehen?
Ist deine RX-Leitung Hardwareseitig, gestört?
Hast Du bereits jemals was zu deinem Aufbau gesendet und es hat 
funktioniert?

Gruß Katherine

von Gast (Gast)


Lesenswert?

Ist das ATMEL Evaluations Board und benutze CodeVision.
Wenn puts benutze, erhalte ich die Fehlermeldung: incompatible with its 
declaration.
Mit putsf wird zwar kompiliert, jedoch keine Ausgabe.

von Karl H. (kbuchegg)


Lesenswert?

printf funktioniert?

von Gast (Gast)


Lesenswert?

Hab den Fehler gefunden.
Bei Hyper Terminal hab ich die Flusssteuerung von Hardware auf keine 
gestellt. Jetzt gehts.
Besten Dank an alle.

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb im Beitrag #2812209:

> Mit der oben aufgezeigten Menüsteuerung hänge ich dann ja immer in dem
> UP Do_Menu fest, oder sehe ich das falsch. Und wenn ich in ein Untermenü
> wechsle, dann hänge ich in der Do_Menu - Routine des UP's fest, oder?

Ich weiß zwar jetzt nicht worauf du dich beziehst, aber ja, das ist eine 
mögliche Idee.
Jedes Menü ist ein UP und das 'Menü wird verlassen' in dem das UP einen 
Return ausführt. Geht es innerhalb eines Menüs in ein Submenü, dann ist 
das ein Funktionsaufruf der Funktion, die eben genau dieses Menü 
behandelt.

> Denn mir ist es wichtig, das die Menü - Programme universell sind. Das
> heißt für mich auch automatisch mit, das ich das Menü - Programm (was ja
> an sich nichts zeitkritisches ist) einfach in main() mit aufrufen kann.
> Also ich möchte mit der Menüsteuerung nicht den µc tot legen, sondern ab
> und zu noch was andres in main() machen können.

Dann musst du das anders aufziehen. Da funktioniert dann diese Technik 
nicht mehr.

Eine mögliche Technik ist es dann, die Menüs nicht dadurch zu 
schachteln, in dem jedes Menü durch eine Funktion repräsentiert wird, 
sondern eine Datenstruktur hochzuziehen, in der die Menüs und ihre 
Verkettung durch zb Indizes oder Pointer realisiert sind. Dies deshalb, 
damit zu jedem Zeitpunkt eindeutig klar ist, wie eine Operation 'nach 
Oben', 'nach Links' etc. zu realisieren ist bzw. was dabei zu tun ist. 
Die Information in der Datenstruktur verrät es dir. Eventuell sind dabei 
dann allerdings ein paar Hilfsvariablen notwendig (die man aber auch in 
die Datenstruktur packen kann) und in denen man sich zb merkt, welcher 
Menüpunkt aus einem Menü 'den Cursor hat', wenn die Kontrolle aus einem 
Submenü zurückgegeben wird.

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.