Serielle Schnittstelle Nextion-Controllino

Hallo Leute,

ich schreibe gerade meine Bachelorarbeit und habe eine Verständnisfrage.
Ich verschicke Werte vom Controller an ein Nextion Display über die Serielle Schnittstelle.
Das schaut im Code z.B. so aus:

            Serial2.print("n3.val=" + String(rotationsgeschwindigkeitn17x));  //Nema 17 X
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);

Funktioniert alles perfekt. Meine Frage, die mich mein Prof bestimmt auch fragen wird:
Wofür wird 3x das Serial2.write(0xff) benötigt? Ich habe es einfach nach der Syntax programmiert,
weiß aber nicht warum es ohne nicht funktioniert. Danke euch!

es ist spezifisch für das Nextion-Protokoll und markiert das Ende einer Bestellung

https://nextion.tech/instruction-set/

All instructions over serial: are terminated with three bytes of 0xFF 0xFF 0xFF

String class zu vermeiden wäre besser...

            Serial2.print(F("n3.val="));
            Serial2.print(rotationsgeschwindigkeitn17x);  //Nema 17 X
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);

Danke dir zum einen für den Tipp mit dem String.

Hat das eine tieferliegende Bedeutung? Ich hab was von einem "least significant byte" gelesen, mein Programmierhorizont ist aber nicht auf dem Level.

Andere Frage zusätzlich:

Wenn das das "Ende meiner Bestellung" markiert, kann ich dann auch sowas machen?:

Serial2.print(F("n3.val="));
            Serial2.print(rotationsgeschwindigkeitn17x);  //Nema 17 X
Serial2.print(F("n4.val="));
            Serial2.print(rotationsbeschleunigungn17x);   //Nema 17 X
Serial2.print(F("n5.val="));
            Serial2.print(rotationsgeschwindigkeitn17y));  //Nema 17 y
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);

Oder geht das nur so, wie ich es jetzt gemacht hab?

            Serial2.print(F("n3.val="));
            Serial2.print(rotationsgeschwindigkeitn17x);  //Nema 17 X
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.print(F("n4.val="));
            Serial2.print(rotationsbeschleunigungn17x);   //Nema 17 X
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.print(F("n5.val="));
            Serial2.print(rotationsgeschwindigkeitn17y));  //Nema 17 y
            Serial2.write(0xff);
            Serial2.write(0xff);
            Serial2.write(0xff);

Danke für die Hilfe

Die Verwendung von String hat unnötige Auswirkungen auf den Speicher. Also, wenn Sie es vermeiden können, tun Sie es!

In Bezug auf die andere Frage: Wenn Sie mehrere Befehle verketten möchten, müssen Sie in der Nextion-Dokumentation nachsehen, was das Befehlstrennzeichen ist. (Ich verwende Nextion nicht, da sie macOS nicht unterstützen, daher habe ich die API nie im Detail untersucht.)

(Ich würde denken, dass sie die Befehlsaggregation nicht unterstützen und Sie jedes Mal die drei 0xFF senden müssen)

Sie haben mir schon weitergeholfen. Vielen Dank!
Das mit dem String wäre nicht gut angekommen.

Das mit dem String ist in deinem Fall auch nicht nötig, da das Feld "Val" im Nextion nur Werte, also Zahlen aufnimmt. Und das nur als Ganzzahl.
Lies dir doch mal die Dokumentation zum Nextion durch, da steht alles genau drin.

Und ja, du musst jede Anweisungszeile mit 3 x 0xff abschließen.

Edit:
Suche mal hier im Forum nach "Tipps zum Nextion", da gibt es schon viele Infos.

Danke für deine Antwort Hotsystem.

Ja ich hab mir die Nextion Doku schon oft durchgelesen. Ich weiß schon, dass ich die 0xff machen muss, darum geht es mir ja auch nicht. Ich wollte eher genau verstehen, was dieser Ausdruck macht, warum es genau 3 mal geschrieben werden muss und warum es nicht 2xee heißen darf. Es ist ja kein Zauberspruch, das sollte ja schon einen Sinn ergeben.

Also falls das jemand genau weiß...

Warum das genau 3 x 0xff sein muss, musst du wohl den Hersteller befragen. Der hat das so festgelegt. Deshalb darfst du nicht einfach was anderes schreiben. So ist das nun mal mit den Anweisungen der Hersteller. Du kannst natürlich innerhalb deines Sketches auch andere Anweisungen dafür definieren, wenn es sein muss. Dass musst du dann in deinem Sketch genau festlegen.

Hallo
die Nexionfirmware interpretiert 3 mal 0xff als "textende".

Wenn Sie einen seriellen Befehls-Parser schreiben müssen, erleichtert ein Endmarker die Arbeit. Sie hören sich an, was von der seriellen Leitung kommt, und "buffern" es, bis Sie diese Endmarkierung erhalten, und können dann einen ganzen Befehl analysieren.
Die Firma Nextion entschied, dass 3 aufeinanderfolgende 0xFF das Ende eines wohlgeformten Befehls markieren würden. Das ist Nextion Entscheidung, damit muss man leben. :slight_smile:

Ich habe mal eine Library dafür geschrieben, die ich ganz nützlich finde.

1 Like

Okay. Danke euch damit hat sich das erledigt.

Ich hab noch ne weitere Frage, die sich jetzt nicht mehr auf die Eingangsfrage bezieht. Ich will jetzt kein neuen Thread aufmachen.

Weiß einer, wie man ein Arduino Programm schön plotten kann? Ich muss des in meine Bachelorarbeit anhängen und wenn ich das mit "Print to PDF" mache, schaut das einfach total kacke aus.

HTML oder ein anderes Format aus einem Online-C++-Online-C++-Syntax-Highlighter exportieren

Wenn Sie Google Docs verwenden, gibt es Tools.

Schaut mal rein

Ich verwende dazu Notepad+.