{"id":239,"date":"2019-04-14T20:47:05","date_gmt":"2019-04-14T18:47:05","guid":{"rendered":"http:\/\/technical-publishing.de\/?page_id=239"},"modified":"2025-06-06T21:58:09","modified_gmt":"2025-06-06T19:58:09","slug":"kontrollbefehle","status":"publish","type":"page","link":"https:\/\/technical-publishing.de\/?page_id=239","title":{"rendered":"Kontrollbefehle"},"content":{"rendered":"<hr>\n<p>Aus allen Programmiersprachen kennen wir Befehle f\u00fcr bedingte Abl\u00e4ufe oder auch Schleifen. Auch der Nextion bietet einige wenige davon. Allerdings m\u00fcssen Sie dabei 2 Dinge beachten:<\/p>\n<ul>\n<li>In der Originaldokumentation wird nicht erw\u00e4hnt, dass diese Befehle nur intern im Nextion einsetzbar sind und nicht als Kommandos \u00fcber die serielle Schnittstelle aufgerufen werden k\u00f6nnen. Das w\u00fcrde wohl auch nicht sehr viel Sinn machen, aber das Fehlen des Hinweises kann doch verwirren, weil die Befehle praktisch gleichberechtigt im Instruction Set aufgef\u00fchrt sind. Falls es aber doch aus irgendeinem Grund erforderlich sein sollte, ein Programm \u00fcber einen Befehl der seriellen Schnittstelle ausl\u00f6sen zu m\u00fcssen, geht das mit einem Trick. Dazu erzeugen Sie einen Button, setzen die Sichtbarkeit auf &#8222;nicht sichtbar&#8220; und ordnen seinem Press- oder Release-Event ein Programm zu. \u00dcber die serielle Schnittstelle k\u00f6nnen Sie dann das entsprechende Event ausl\u00f6sen und somit quasi durch die Hintert\u00fcr das Programm aufrufen.<\/li>\n<li>Auch wenn die Syntax zun\u00e4chst an ein C-Programm erinnert, ist sie damit nicht identisch. So fehlen die Semikolon am Ende einer jeden Anweisung und die Formatierung muss strikt eingehalten werden, z. B. darf die komplette Funktion nicht in einer Zeile untergebracht werden und die geschweiften Klammern m\u00fcssen immer allein und am Anfang in einer Zeile stehen. Geben Sie also die Beispiele immer exakt genauso ein, wie unten angegeben.<\/li>\n<\/ul>\n<hr>\n<h3 id=\"if\">if<\/h3>\n<p><code>if (bedingung)<br \/>\n{<br \/>\nanweisung<br \/>\n}<\/code><\/p>\n<p>Mit einer if-Anweisung k\u00f6nnen Bedingungen abgefragt werden und dann gezielt auf diese Bedingung reagiert werden.<\/p>\n<div class=\"beispiel\">Beispiel:Sie haben einen Button und wollen jedes Mal, wenn diese Schaltfl\u00e4che 3 Mal angeklickt wurde, eine Meldung \u00fcber die serielle Schnittstelle ausgeben. Dazu haben Sie eine interne Variable &#8222;buttonClicked&#8220; angelegt, die Sie beim Start des Programm mit &#8222;1&#8220; initialisieren und bei jedem Press-Event um eins erh\u00f6hen. Der Code f\u00fcr das &#8222;Press-Event&#8220; des Buttons w\u00e4re dann:<\/p>\n<p><code>if (buttonClicked.val==3)<br \/>\n{<br \/>\nprint \"3 Mal geklickt\"<br \/>\n}<br \/>\nbuttonClicked.val++<\/code>Das funktioniert, allerdings nur einmal. Danach w\u00fcrde der Wert von buttonClicked.val weiter hochgez\u00e4hlt und die 3 w\u00fcrde in der Folge nicht mehr erreicht. Wir m\u00fcssen also die Z\u00e4hlvariable gezielt zur\u00fccksetzen. Dazu nutzen wir den else-Zweig der Bedingungabfrage, mit dem eine Logik in der Form:<\/p>\n<p>Wenn Fall a eintritt, dann tue dies, andernfalls (else) tue etwas anderes.<\/p>\n<p><code>if (buttonClicked.val==3)<br \/>\n{<br \/>\nprint \"3 Mal geklickt\"<br \/>\nbuttonClicked.val=1<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\nbuttonClicked.val++<br \/>\n}<\/code>Jetzt funktioniert es so, wie wir es wollten.<\/p>\n<\/div>\n<p>Sie k\u00f6nnen die folgenden Vergleichsoperatoren nutzen:<\/p>\n<ul>\n<li><b>==<\/b> gleich<\/li>\n<li><b>!=<\/b> ungleich<\/li>\n<li><b>&lt;=<\/b> kleiner oder gleich<\/li>\n<li><b>&gt;=<\/b> gr\u00f6\u00dfer oder gleich<\/li>\n<li><b>&gt;<\/b> gr\u00f6\u00dfer<\/li>\n<li><b>&lt;<\/b> kleiner<\/li>\n<\/ul>\n<div class=\"hinweis\">Hinweis: In der Originaldokumentation finden sich die folgenden Fehler:&nbsp;<\/p>\n<ul>\n<li>Bei einigen Beispielen im K\u00f6rper der if-Anweisung wird als Zuweisung anstelle von <code>b0.txt=\"3\"<\/code> f\u00e4lschlicherweise ein Vergleich <code>b0.txt==\"3\"<\/code>durchgef\u00fchrt.<\/li>\n<li>Die Schl\u00fcsselwort <code>else<\/code> wird direkt hinter die geschweifte Klammer gestellt: <code>} else<\/code>. Das f\u00fchrt zu einem Compilerfehler, weil die Klammer und else in getrennten Zeilen stehen m\u00fcssen.<\/li>\n<\/ul>\n<\/div>\n<hr>\n<h3 id=\"while\">while<\/h3>\n<p><code>while (bedingung)<br \/>\n{<br \/>\nanweisung<br \/>\n}<\/code><\/p>\n<p>Die while-Anweisung geh\u00f6rt zur Gruppe der Schleifenbefehle. So lange eine bestimmte Bedingungen erf\u00fcllt ist (d. h. das Ergebnis ungleich 0 ist) wird der Anweisungsblock in den geschweiften Klammern ausgef\u00fchrt.<\/p>\n<div class=\"hinweis\">Wichtig:Bei einer while-Schleife muss es einen Mechanismus geben, um die Bedingungen f\u00fcr die Abfrage zu \u00e4ndern, ansonsten w\u00fcrde die Schleife entweder nie oder immer (Endlosschleife) durchlaufen. Im Bereich der Embedded-Programmierung treten hier h\u00e4ufig Interrupts in Erscheinung. Softwareseitig lassen sich auch Events als Interrupts betrachten, weil sie asynchron abgearbeitet werden. Man k\u00f6nnte also auf die Idee kommen, ein Touch-Press-Event f\u00fcr die \u00c4nderung der Bedingung zu nutzen. Doch hier macht uns Nextion leider einen Strich durch die Rechnung, denn w\u00e4hrend sich das Programm in einer while-Schleife befindet, werden die Events nicht abgefragt. Die Bedingung l\u00e4sst sich auch dadurch nicht \u00e4ndern, dass die abgefragte Variable \u00fcber die serielle Schnittstelle manipuliert wird. Zwar werden die Kommandos empfangen, aber erst dann ausgef\u00fchrt, wenn die while-Schleife komplett abgearbeitet wurde. Der 3. Ansatz w\u00e4re, die while-Schleife durch ein timer-event zu beenden, doch auch das wird w\u00e4hrend der while-Schleife nicht durchgereicht.<\/p>\n<p>In den Beispielen auf der Itead-Homepage werden deshalb lediglich Z\u00e4hlschleifen genannt, die eine sichere Beendigung garantieren. Allerdings ist dazu nicht wirklich eine while-Schleife notwendig, denn das ist die eigentliche Dom\u00e4ne einer for-Schleife. Au\u00dferdem ist die folgende Problematik zu beachten:<\/p>\n<p><code>while (n0.val&lt;100)<br \/>\n{<br \/>\nn0.val++<br \/>\n}<\/code><br \/>\n&nbsp;Setzen wir voraus, dass n0.val zun\u00e4chst mit einem Wert von 0 initialisiert wurde. In diesem Fall wird der Number-Komponente n0 zun\u00e4chst die 0 zugewiesen, beim 2. Durchlauf die 1 und so weiter. Allerdings wird dieser Ablauf f\u00fcr uns nicht sichtbar, denn wie oben beschrieben wird die Komponente erst dann aktualisiert, wenn die while-Schleife komplett durchlaufen wurde. Wir k\u00f6nnen dieses Problem allerdings umgehen, in dem wir den Screen explizit mit dem &#8222;doevents&#8220; Befehl aktualisieren. Lediglich die betroffene Komponente mittels &#8222;ref n0&#8220; zu aktualisieren, funktioniert nicht :<\/p>\n<p><code>while(n0.val&lt;100)<br \/>\n{<br \/>\nn0.val++<br \/>\ndoevents<br \/>\n}<\/code><\/div>\n<hr>\n<h3 id=\"for\">for<\/h3>\n<p><code>for(start;bedingung;operation)<br \/>\n{<br \/>\nanweisungen<br \/>\n}<\/code><\/p>\n<p>Die for-Schleife wird dazu verwendet, eine bestimmte Anweisung bzw. einen bestimmten Anweisungsblock mehrmals zu durchlaufen. Dazu wird in der Regel eine Z\u00e4hlvariable verwendet, die in &#8222;start&#8220; initialisiert und mit &#8222;operation&#8220; bearbeitet (meist hochgez\u00e4hlt) wird. So lange die Bedingung in der Mitte erf\u00fcllt ist, werden die Anweisungen in der for-Schleife ausgef\u00fchrt.<\/p>\n<div class=\"beispiel\">Beispiel:<br \/>\n<code>for(var.val=0;var.val&lt;10;var.val++)<br \/>\n{<br \/>\nn0.val++<br \/>\n}<\/code>Zu Beginn der for-Schleife wird der Wert der Variablen &#8222;var&#8220; auf 0 gesetzt und bei jeder Schleife um 1 erh\u00f6ht, so lange bis die Variable den Wert 10 hat. Im Anweisungsblock wird auch n0.val bei jedem Durchlauf erh\u00f6ht und hat am Ende des 1. Aufrufs der for-Schleife den Wert 10 (wenn n0.val vor Beginn der for-Schleife den Wert 0 hatte). Wird jetzt die for-Schleife ein 2. Mal aufgerufen, startet var.val wieder mit 0 und die Schleife wird 10-mal ausgef\u00fchrt. n0.val wird jetzt von 10 auf 20 hochgez\u00e4hlt.<\/p>\n<\/div>\n<p>Die for-Schleife unterscheidet sich von der while-Schleife im Nextion lediglich dadurch, dass die Initalisierung und die Bearbeitung der Schleifenvariable direkt im Kopf der for-Schleife vorgenommen wird. Aber auch bei der for-Schleife gilt das Gleiche wie bei der while-Schleife. Die Komponenten werden w\u00e4hrend der Ausf\u00fchrung nicht automatisch aktualisiert. Sie m\u00fcssen also wieder den &#8222;doevents&#8220;-Befehl einsetzen, wenn Sie eine Aktualisierung w\u00fcnschen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aus allen Programmiersprachen kennen wir Befehle f\u00fcr bedingte Abl\u00e4ufe oder auch Schleifen. Auch der Nextion bietet einige wenige davon. Allerdings m\u00fcssen Sie dabei 2 Dinge beachten: In der Originaldokumentation wird nicht erw\u00e4hnt, dass diese Befehle nur intern im Nextion einsetzbar sind und nicht als Kommandos \u00fcber die serielle Schnittstelle aufgerufen werden k\u00f6nnen. Das w\u00fcrde wohl&hellip;&nbsp;<a href=\"https:\/\/technical-publishing.de\/?page_id=239\" rel=\"bookmark\">Weiterlesen &raquo;<span class=\"screen-reader-text\">Kontrollbefehle<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":113,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":70,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-239","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=239"}],"version-history":[{"count":1,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/239\/revisions"}],"predecessor-version":[{"id":240,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/239\/revisions\/240"}],"up":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/113"}],"wp:attachment":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}