Menu Steuerung mit Rücksprung

Gast #4105681
Lesenswert?
• ▲
▼
Hy zusammen,

sehe den Wald vorlauter Bäumen nicht, also ich will mit einem Atmega 
Ports schalten. Das ganze funktioniert auch alles wie ich es möchte. Nur 
ein Punkt macht mir Kopfschmerzen.
Per UART lesen ich ein Zeichen, das wird gespeichert im eeprom(Klappt) 
und später geladen (bzw. eine Funktion). Das "Menu" kommt und wartet 
max. 5 Sekunden und Lädt die Einstellung (aus eeprom). Wenn man aber ein 
Zeichen eingibt zb. 'a' wird das Menu früher verlassen oder man kann 
eine andere Einstellung laden. Bis hier hin Klappt auch alles, nur ich 
will ein schutz einbauen der unbekannte Zeichen meldet durch ein neu 
start des Menus und einer kleinen Meldung anzeigt.
ich habe das ganz erst mal so stehen:
1
//start: 
2
state = 5000;
3
while((buff_comp != 1) && (state--))_delay_ms(1);
4
buff_comp = 0;
5
if(buf[0] == 'a')send(text7);
6
else if(buf[0] == '1'){eeprom_write_byte(2,1);}
7
else if(buf[0] == '2'){eeprom_write_byte(2,2);}
8
else if(buf[0] == '3'){eeprom_write_byte(2,3);}
9
else if(buf[0] == '4'){eeprom_write_byte(2,4);}
10
else if(buf[0] == '5'){eeprom_write_byte(2,5);}
11
else if(buf[0] == '6'){eeprom_write_byte(2,6);}
12
else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0] != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] != 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
13

14
send_(text7);

Als erstes dachte ich, ich mache das mit dem goto aber wenn der spring 
zwar zum anfang zurück aber das mach er auch wenn die zeit abgelaufen 
ist. Das ist nicht der Sinn den er machen soll.

Danke für eure Ratschläge und Tipps

mfg Rudi
#4105705
Lesenswert?
• ▲
▼
Davon ab, dass goto von den meisten Programmierern eher nicht so gerne 
gesehen wird (Stichwort: Spaghetticode) und dass sich mir der Sinn nicht 
erschließt, wieso du den Wert in den eeprom schreibst um ihn später in 
einer anderen Funktion wieder auszulesen (reichen keine normalen 
Variablen dafür? EEPROM ist langsam und hat eine begrenzte Anzahl an 
Schreibzugriffen).

Dein letztes else if:
1
else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0] != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] != 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
kann man auch so schreiben:
1
else if(buf[0] != 'E'){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}
Wäre buf[0]== '4', wäre er bereits oben in das else if gegangen. Da er 
nicht dort rein ging und statt dessen die weiteren else ifs testet, 
weißt du, dass buf[0] != '4' sein muss wenn er unten ankommt.

So, und im Timeout-Fall ist buf[0] != 'E' und damit geht er dort rein. 
Denk mal, da musst du den Timeout gesondert abfangen. ZB oben direkt als 
erstes if ein if(state==0).
(Firma: Vescomp) #4105721
Lesenswert?
• ▲
▼
Rudi schrieb:
> if(buf[0] == 'a')send(text7);
> else if(buf[0] == '1'){eeprom_write_byte(2,1);}
> else if(buf[0] == '2'){eeprom_write_byte(2,2);}
> else if(buf[0] == '3'){eeprom_write_byte(2,3);}
> else if(buf[0] == '4'){eeprom_write_byte(2,4);}
> else if(buf[0] == '5'){eeprom_write_byte(2,5);}
> else if(buf[0] == '6'){eeprom_write_byte(2,6);}
> else if((buf[0] != '6') && (buf[0] != '5') && (buf[0] != '4') && (buf[0]
> != '3') && (buf[0] != '2') && (buf[0] != '1') && (buf[0] !=
> 'E')){send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto
> start;*/}
>
1
if(buf[0] == 'a')send(text7);
2
else if((buf[0] >= '1') && (buf[0] <= '6')))
3
   {eeprom_write_byte(2, buf[0]-0x30);}
4
else if(buf[0] == 'E'){/* Timeout */}
5
else
6
 {send("Unbekannter Befehl abfrage startet neu\r\n"); /*goto start;*/}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.