Das Nextion sendet ja zu vielen Aktionen einen Header, wie z.B. 0x65, 0x71, gefolgt von weiteren Bytes und werden dann mit 3x(4x) 0xFF abgeschlossen.
Bisher hatte ich mich geschäut, dies hier auszuwerten, da mir die Kenntnisse und die Fähigkeit fehl(t)en. Kurz und gut, es war mir zu kompliziert, ich fand eine Lösung über String versenden usw.
Die Spezialisten werden schon die Nase rümpfen, weil dieses Thema schon so oft kam, aber ich habe sehr viel Zeit mit Suchen und Lesen zu diesem Thema verbracht.
Aktuell gibt es einen aktuellen Beitrag von mir, die Inhalte des TFT-EEPROMS in den Arduino auszulesen. Die Lösung wäre wahrscheinlich mit dem Befehl 'rept....'. Auch dazu habe ich viel probiert. Das Problem liegt an dem Aufspalten der einzelnen Bytes und die Zuweisung deren Inhalte in die entsprechenden Variablen. Dies ist der Grund, warum ich mich nun doch wieder mit diesem Problem beschäftige. Da das o.g. Thema doch zu speziell ist, habe ich mich zu diesem neuen Beitrag entschieden. Ich hoffe, es kommen keine (bösen) Kommentare zu Crossposting, dies ist nicht meine Absicht.
Nun stöbere ich doch immer wieder im Forum und auf YT, um auf eine für mich verständliche, durchschaubare Lösung zu kommen. Es ist ja fast überall ein Lerneffekt dabei und Danke an alle Forenmitglieder und Problemlöser.
Vor kurzem hatte ich eine für mich brauchbare Lösung gefunden, unter: [ Serial.read bei Nextion Display - #9 by firefist235]
Der Kollege hat ein Muster ausgearbeitet, das mir zusagt und wo ich eine Zukunft für meine weiteren Projekte in dieser Richtung sehe. Ich nahm dies als Basis (es soll ja so gelöst worden sein) und habe noch etwas herum gebastelt, bzw. ergänzt, so dass es zunächst mal lauffähig wirkt.
Wie so viele kopieren sich die Problemlöser diverse Lösungsansätze, Codeschnipsel zusammen und bauen auf diesem dann auf. Ich hoffe es ist keiner böse deswegen.
Das nachfolgende Programm lässt sich kompilieren und es scheint zu arbeiten. Auf dem GUI habe ich momentan zwei Schalter, welche den Haken bei ID aktiv haben, so dass beim Drücken des Buttons die übliche Codesequenz wie z.B. 65 00 0F 01 FF FF FF oder 65 00 10 01 FF FF FF sendet.
Als TFT hängt momentan nur der Simulator von Nextion dran. Der Simulator ist über einen TTL-USB-Wandler mit dem Arduino UNO über SoftSerial verbunden, die Baudraten sind eingestellt.
Fachforen wie Böcker, das Handbuch zum Display usw. sind mir bekannt, der Code ist hoffentlich richtig in den Codetags eingebettet.
Warum bekomme ich hier nur „Müll“ zurück? Habe ich was falsch eingestellt?
Der Serielle Monitor bringt mir zweimal das Zeichen ‚e‘ zurück und das nur ein einziges Mal. Das ‚e‘ entspricht natürlich 0x65 (in Hex) oder 101 (in Dezimal) . Irgendwie ist die Kommunikation gestört, finde aber nicht heraus, wo es fehlt.
Erzeuge ich einen Reset im System (im Setup den Befehl "rest" an das TFT), so klappt das Auslesen nur genau 1x, egal welchen Schalter und wie oft ich diesen drücke.
Mein Ziel wäre es, ein lauffähiges Beispiel zu haben, um weiter ausbauen zu können.
Kann mir hier jemand helfen?
Gruß und Dank, Franz
/*
* Beispiel aus'm Forum unter:
* https://forum.arduino.cc/t/serial-read-bei-nextion-display/656433/9
*
* verbaute Hardware: UNO mit SoftSerial
* Nextion-Simulator
*/
#include <SoftwareSerial.h>
SoftwareSerial Serial2(2, 3); // RX, TX
const char nextionNumChars = 25;
char nextionReceivedChars[nextionNumChars]; // die Antwort ohne Endekennung
boolean nextionNewData = false; // wird true, wenn Antwort komplett ist,
// muss nach Auswerten vonm Aufrufer zurückgesetzt werden
//--------------------------------------------
void setup() {
Serial.begin(9600);
Serial2.begin(115200);
Serial2.print("rest"); // 1x definierter Reset am Nextion
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
delay(100);
}
//--------------------------------------------
void loop()
{
recvFromNextion();
delay(10);
}
//--------------------------------------------
void recvFromNextion()
{
static byte index = 0; // Index for Char Array
char endMarker = 0xFF; // Endmarker
char rc; // incoming char
static bool headerRead = false; // 1 when first char (header) was read
static bool stringComplete; // 1 when incoming string is read until endMarker
static byte maxIndex = 0; // max expected bytes according to header
while (Serial2.available() > 0 && nextionNewData == false)
{
rc = Serial2.read();
if (!headerRead)
{ // When header isn't read yet
nextionReceivedChars[index] = rc; // Write header in char arry index 0
headerRead = true;
}
// maxIndex is set in the next section according to header
if (headerRead) // When header is already read
{
switch (nextionReceivedChars[0])
{
// Header containing 4 Bytes
case 0x00: // Invalid Instruction
case 0x02: // Invalid Component ID
case 0x03: // Invalid Page ID
case 0x04: // Invalid Picture ID
case 0x05: // Invalid Font ID
case 0x06: // Invalid File Operation
case 0x09: // Invalid CRC
case 0x11: // Invalid Baud rate Setting
case 0x12: // Invalid Waveform ID or Channel #
case 0x1A: // Invalid Variable name or attribute
case 0x1B: // Invalid Variable Operation
case 0x1C: // Assignment failed to assign
case 0x1D: // EEPROM Operation failed
case 0x1E: // Invalid Quantity of Parameters
case 0x1F: // IO Operation failed
case 0x20: // Escape Character Invalid
case 0x23: // Variable name too long
case 0x24: // Serial Buffer Overflow
case 0x86: // Auto Entered Sleep Mode
case 0x87: // Auto Wake from Sleep
case 0x88: // Nextion Ready
case 0x89: // Start microSD Upgrade
case 0xFD: // Transparent Data Finished
case 0xFE: // Transparent Data Ready
maxIndex = 2;
break;
// Header containing 5 Bytes
case 0x66: // Current Page Number (from sendme), byte2 = PageNr
maxIndex = 3;
break;
// Header containing 7 Bytes
case 0x65: // Touch Event (from send Component ID), 2=PageNr, 3=ID, 4=event
maxIndex = 5;
break;
// Header containing 8 Bytes
case 0x71: // Numeric Data Enclosed (from get of numeric values)
maxIndex = 6;
break;
// Header containing 9 Bytes
case 0x67: // Touch Coordinate (awake), 2+3=x coord, 4+5=y coord, 6=event
case 0x68: // Touch Coordinate (sleep), 2+3=x coord, 4+5=y coord, 6=event
maxIndex = 7;
break;
// Header containg string
case 0x70:
break;
}// end switch
if ((index <= maxIndex) && (nextionReceivedChars[0] != 0x70)) // Execute only if incoming datagram is not a string
{
nextionReceivedChars[index] = rc;
index++;
} else if (nextionReceivedChars[0] == 0x70 && !stringComplete) { // Execute if incoming datagram is a string
if (rc != endMarker)
{
nextionReceivedChars[index] = rc;
index++;
if (index >= nextionNumChars) // Prevent writing out of array bounds
{
index = nextionNumChars - 1;
}
} else { // if endMarker has been found
nextionReceivedChars[index] = '\0';
stringComplete = true;
}
} else {
Serial.print(" Char 0: ");// If all chars were read or header is unknown
Serial.println(nextionReceivedChars[0]); // ONLY FOR TESTING
Serial.print(" Char 1: ");
Serial.println(nextionReceivedChars[1]); // ONLY FOR TESTING
Serial.print(" Char 2: ");
Serial.println(nextionReceivedChars[2]); // ONLY FOR TESTING
Serial.print(" Char 3: ");
Serial.println(nextionReceivedChars[3]); // ONLY FOR TESTING
Serial.print(" Char 4: ");
Serial.println(nextionReceivedChars[4]); // ONLY FOR TESTING
Serial.print(" Char 5: ");
Serial.println(nextionReceivedChars[5]); // ONLY FOR TESTING
Serial.print(" Char 6: ");
Serial.println(nextionReceivedChars[6]); // ONLY FOR TESTING
Serial.print(" Char 7: ");
Serial.println(nextionReceivedChars[7]); // ONLY FOR TESTING
Serial.print(" Char 8: ");
Serial.println(nextionReceivedChars[8]); // ONLY FOR TESTING
Serial.print(" Char 9: ");
Serial.println(nextionReceivedChars[9]); // ONLY FOR TESTING
//nextionTerminate(); // ONLY FOR TESTING
index = 0;
nextionNewData = true; // is called in loop for further processing, gets FALSE when processing is finished
headerRead = false;
stringComplete = false;
}
}
}
}// end recvFromNextion()