Go Down

Topic: Nextion Component ID trennen (Read 1 time) previous topic - next topic

Tommy56

#15
Sep 03, 2019, 06:40 pm Last Edit: Sep 03, 2019, 06:42 pm by Tommy56
Ich bekomme ja 65 00 03 01 FF FF FF
0x65 = Kennung für Touchevent
0x00 = Page
0x03 = Component-ID
0x01 = Event (1 = Touch, 0 = Release)
0xFF 0xFF 0xFF = Endekennung

Wenn Du ab 0x65 im Array speicherst, hat die 0x03 den Index 2.

Gruß Tommy

Edit: Returncodes
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Whandall

Code: [Select]
#define nxSerial Serial3

struct TouchEvent {
  byte id; // 0x65
  byte page;
  byte componentId;
  byte event;
  void disp() {
    if (id != 0x65) {
      Serial.println(F("No TouchEvent"));
    } else {
      Serial.print(F("TouchEvent: page "));
      Serial.print(page);
      Serial.print(F(", id "));
      Serial.print(componentId);
      Serial.print(F(", event "));
      Serial.println(event ? F("PRESS") : F("RELEASE"));
    }
  }
};

void processLine(const char* buf) {
  ((TouchEvent*)buf)->disp();
}

typedef void (*lineProcess)(const char* iLine);

class NXSerial {
  protected:
    Stream& serial;
    uint8_t bSize;
    uint8_t bIndex;
    uint8_t* buffer;
    lineProcess handler;
  public:
    NXSerial(Stream& inSer, lineProcess iHandler) : serial(inSer), handler(iHandler) {}
    ~NXSerial() {
      delete [] --buffer;
    }
    void begin(uint8_t maxMessage) {
      bSize = maxMessage;
      buffer = new uint8_t[bSize + 2];  // one uint8_t for the trailing '\0', one for the prefix len uint8_t
      if (buffer == NULL) {
        bSize = 0;
      } else {
        buffer++;
      }
      bIndex = 0;
    }
    void loop() {
      bool doCheck = false;
      while (serial.available()) {  // allows usage of continue/break
        uint8_t inChar = serial.read();
        if (inChar == 0xFF &&
            (bIndex >= (*buffer == 0x71 ? 7 : 2)) &&
            buffer[bIndex - 1] == 0xFF && buffer[bIndex - 2] == 0xFF) {
          buffer[bIndex++] = inChar;
          doCheck = true;
        } else {
          buffer[bIndex++] = inChar;
          doCheck = (bIndex == bSize);
        }
      }
      if (doCheck) {
        buffer[bIndex] = 0;
        buffer[-1] = bIndex;
        (*handler)((const char*)buffer);
        bIndex = 0;
      }
    }
} nextionSerial(nxSerial, processLine);

void setup() {
  Serial.begin(250000);
  nxSerial.begin(19200);
  nextionSerial.begin(64); // buffer size
}

void loop() {
  nextionSerial.loop();
}

Code: [Select]
TouchEvent: page 0, id 6, event RELEASE
TouchEvent: page 0, id 3, event RELEASE
TouchEvent: page 0, id 1, event RELEASE
TouchEvent: page 0, id 9, event RELEASE
TouchEvent: page 0, id 10, event RELEASE
TouchEvent: page 0, id 11, event RELEASE
TouchEvent: page 0, id 12, event RELEASE
TouchEvent: page 0, id 13, event RELEASE
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

#17
Sep 03, 2019, 07:25 pm Last Edit: Sep 03, 2019, 07:35 pm by Whandall
Oder nahezu OOP frei, ohne Library, mit nahezu minimalem Kode.

Code: [Select]
const byte bufferSize = 64;

void setup() {
  Serial.begin(250000);
  Serial3.begin(19200);
}

void loop() {
  static uint8_t bIndex;
  static uint8_t buffer[bufferSize];
  bool allesDa = false;
  if (Serial3.available()) {
    uint8_t inChar = Serial3.read();
    if (inChar == 0xFF &&  (bIndex >= (*buffer == 0x71 ? 7 : 2)) &&
        buffer[bIndex - 1] == 0xFF && buffer[bIndex - 2] == 0xFF) {
      buffer[bIndex++] = inChar;
      allesDa = true;
    } else {
      buffer[bIndex++] = inChar;
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) {
    if (*buffer != 0x65) {
      Serial.println(F("No TouchEvent"));
    } else {
      Serial.print(F("TouchEvent: page "));
      Serial.print(buffer[1]);
      Serial.print(F(", id "));
      Serial.print(buffer[2]);
      Serial.print(F(", event "));
      Serial.println(buffer[3] ? F("PRESS") : F("RELEASE"));
    }
    bIndex = 0;
  }
}

Code: [Select]
TouchEvent: page 0, id 5, event RELEASE
TouchEvent: page 0, id 9, event RELEASE
TouchEvent: page 0, id 2, event RELEASE
TouchEvent: page 0, id 13, event RELEASE
TouchEvent: page 0, id 11, event RELEASE
TouchEvent: page 0, id 10, event RELEASE
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

#18
Sep 03, 2019, 07:42 pm Last Edit: Sep 03, 2019, 07:43 pm by Whandall
Eine Zeile ließ sich noch entfernen.

Code: [Select]
const byte bufferSize = 64;

void setup() {
  Serial.begin(250000);
  Serial3.begin(19200);
}

void loop() {
  static uint8_t bIndex;
  static uint8_t buffer[bufferSize];
  bool allesDa = false;
  if (Serial3.available()) {
    uint8_t inChar = Serial3.read();
    buffer[bIndex++] = inChar;
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      allesDa = true;
    } else {
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) {
    if (*buffer != 0x65) {
      Serial.println(F("No TouchEvent"));
    } else {
      Serial.print(F("TouchEvent: page "));
      Serial.print(buffer[1]);
      Serial.print(F(", id "));
      Serial.print(buffer[2]);
      Serial.print(F(", event "));
      Serial.println(buffer[3] ? F("PRESS") : F("RELEASE"));
    }
    bIndex = 0;
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

SkobyMobil

Hallo Whandall,
ist ja nett, das Du Dir hier so viel Mühe gibst. Bringt mir aber leider nichts.
Dein Sketch läuft genau so gut, wie meiner. Zum einem gibt es nicht alles aus- (65 00 03 01 FF FF FF) das wollte ich ja haben,
zum anderem kommt er ins haspeln, wenn man ein anderes Objekt am Nextion aktiviert.
Zuerst wird nichts gefunden und dann sporadisch die Informationen.

Das ist vielleicht ein Dreck, es kann doch wohl nicht so schwer sein, einige binäre Daten zu lesen. Ich hatte das ja schon raus
bekommen. Nur am selektieren ist es gescheitert. Das muß doch sicher zum laufen bekommen zu sein.
Gruß und Dank
Andreas
die zweite Maus bekommt den Speck...

Whandall

#20
Sep 05, 2019, 08:46 am Last Edit: Sep 05, 2019, 08:54 am by Whandall
Hallo Whandall,
ist ja nett, das Du Dir hier so viel Mühe gibst. Bringt mir aber leider nichts.
Dein Sketch läuft genau so gut, wie meiner. Zum einem gibt es nicht alles aus- (65 00 03 01 FF FF FF) das wollte ich ja haben,
zum anderem kommt er ins haspeln, wenn man ein anderes Objekt am Nextion aktiviert.
Zuerst wird nichts gefunden und dann sporadisch die Informationen.

Das ist vielleicht ein Dreck, es kann doch wohl nicht so schwer sein, einige binäre Daten zu lesen. Ich hatte das ja schon raus
bekommen. Nur am selektieren ist es gescheitert. Das muß doch sicher zum laufen bekommen zu sein.
Gruß und Dank
Andreas
Mein Sketch funktioniert einwandfrei, wenn von dem Nextion nur Nextion formatierte Nachrichten kommen.

print und printh können da dazwischenfunken, das ist Fehler des print und printh, nicht des Parsers.

Wo ist also bitte das HMI das du verwendest und das nicht parsbar sein soll?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

SkobyMobil

Hallo,
"Wo ist also bitte das HMI"
Hier.
Gruß und Dank
Andreas
die zweite Maus bekommt den Speck...

Whandall

#22
Sep 05, 2019, 09:42 am Last Edit: Sep 05, 2019, 10:02 am by Whandall
Touch move von Eingabe

Code: [Select]
print eingabe.val
Benutze kein print und kein printh, die sind vor allem für Anwendungen,
in denen alle Nachrichten per print und printh erzeugt werden.

Na ja, du konntest per print(h) Nachrichten erzeugen die einen eigenen Typ und die drei 0xFFs am Ende haben,
aber einfach mal den Wert einer Variablen in den Stream zu werfen funktioniert nicht.

Code: [Select]
ausgabe.val=eingabe.val

Das erscheint mir auch ungültig (Zahl=Text), müsste man nicht cov(x) benutzen?
Sah nur aus wie ein Text, bei einem Slider ist das natürlich absolut ok und funktioniert ja auch.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

#23
Sep 05, 2019, 10:05 am Last Edit: Sep 05, 2019, 10:38 am by Whandall
Nimm statt deinem print
Code: [Select]
get eingabe.val
das kannst du auf der Arduino Seite prima parsen, aber schau in den Debugger, was das produziert.

Damit du diese Zahlen besser zuordnen kannst,
wäre ein Haken bei Send Component Id bei Touch Press Event sinnvoll.

Dann käme die id-Press, dann (nackte 0x71) Zahlen beim Draggen und nachher ein id-Release.

Etwas das auch diese Zahlen anzeigen kann

Code: [Select]
const byte bufferSize = 64;

void setup() {
  Serial.begin(250000);
  Serial1.begin(115200); //19200);
}

void loop() {
  static uint8_t bIndex;
  static uint8_t buffer[bufferSize];
  bool allesDa = false;
  if (Serial1.available()) {
    uint8_t inChar = Serial1.read();
    buffer[bIndex++] = inChar;
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      allesDa = true;
    } else {
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) {
    if (*buffer == 0x65) {
      Serial.print(F("TouchEvent: page "));
      Serial.print(buffer[1]);
      Serial.print(F(", id "));
      Serial.print(buffer[2]);
      Serial.print(F(", event "));
      Serial.println(buffer[3] ? F("PRESS") : F("RELEASE"));
    } else if (*buffer == 0x71) {
      Serial.print(F("Value: "));
      Serial.println(*((int32_t*)buffer + 1));
    } else {
      Serial.println(F("Unbekannter Typ"));
    }
    bIndex = 0;
  }
}

Jetzt sollte auch

Code: [Select]
(bIndex >= (*buffer == 0x71 ? 8 : 3))
klarer sein, bei diesen Paketen können sogar vier 0xFF Bestandteil des Pakets sein,
also ergibt es nur Sinn auf die Delimiter hinter dem Wert zu testen.

Erkennst du wie simpel das alles ist?

Als Denkaufgabe: warum könnte/sollte die obige 3 eine 4 sein? Was wäre der Unterschied?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

SkobyMobil

Hallo,
das Zeugs treibt mich noch in den Wahnsinn.

Bei B1 gibt NextionSimulator 65 00 03 01 FF FF FF raus. Das wird auch im Terminal so ausgegeben.
Der Arduino gibt aber 65 00 03 01 FF FF FF FF raus.
Da sitzt schon einmal der erste Wurm drinne. Das mit dem Zählen kann man ohne eindeutigen Terminator
vergessen, dafür kommen die Daten nicht sauber genug rüber.

Wenn ich dann darüber nachdenke, das ich später einen Slider lesen will, dann wird mir schlecht.
Vielleicht ist es tatsächlich besser sich die Werte zu holen, als sie bringen zu lassen.
Oder ich nehme ein Number und hänge ein 0D bei Veränderung dran.

Ich muß erst einmal sehen, das das sauber übertragen wird. Ohne wenn und aber.
Den Zustand eines Buttom zu lesen ist ja kein Problem. Aber wenn etwas anderes dazwischen funkt...
Gruß und Spaß
Andreas

P.S.

Als Denkaufgabe: warum könnte/sollte die obige 3 eine 4 sein?

(bIndex >= (*buffer == 0x71 ? 8 : 3))

Bayern 8, Dortmund 3 ?

Ich glaube der Stern ist ein Pointer und zeigt auf 0x71 im Buffer.
Das ist aber auch alles. Ich habe das nie gebraucht, daher keine Ahnung.
die zweite Maus bekommt den Speck...

Whandall

Offensichtlich hast du dir meinen Kode nicht angesehen und/oder versucht zu verstehen
und aus deinen Ausführungen schließe ich, dass du auch nicht wirklich liest was ich schreibe.

Hast du dein HMI in Ordnung gebracht?

Hast du verstanden, was du falsch machst/gemacht hast?

Was heisst es wenn im ersten Byte eines Nextion Datensatzes eine 0x71 steht?

Quote
Der Arduino gibt aber 65 00 03 01 FF FF FF FF raus.
Kann mein Programm nicht ausgeben.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

SkobyMobil

Hallo,
ich habe wirklich keine Lust mich mit Dir zu streiten.
Was wie auf dem HMI läuft/übertragen wird, spielt keine Rolle. Wichtig ist nur, sich dort das Richtige zum auswerten zu
sichern.
Und wie Du Dich erinnern kannst, wollte ich meine Ausgabe als eigenen Wert haben.

"
65
0
3
1
FFFFFFFF
FFFFFFFF
FFFFFFFF
"
Dein Sketch nützt mir also überhaupt nichts. Deine Hilfe ist ja wirklich nett, bringt mir aber so richtig nichts.
Ich werde mich einmal in mein Kämmerlein zurückziehen. Mit Deinen Informationen werde ich das wohl hinbekommen.
Also, vielen Dank dafür.
Gruß und Spaß
Andreas

die zweite Maus bekommt den Speck...

Whandall

Und wie Du Dich erinnern kannst, wollte ich meine Ausgabe als eigenen Wert haben.
Dein Sketch nützt mir also überhaupt nichts.
Wenn du nicht in der Lage bist

aus meinem Beispiel zu entnehmen

- wie man die Zeilen sauber erkennt
- wie man auf die Id eines Touch Events zugreift

aus meinen Ausführungen zu entnehmen

- wie man Werte übertragen kann, ohne print zu benutzen (und das zu ändern)
- dass es sehr wohl eine Rolle spielt, was das HMI noch so außer Touch Events generiert

dann wird ein Zurückziehen - wohin auch immer - nicht das Problem lösen.

Versuchen kannst du es ja.

Bei Problemen bitte Kode und HMI beifügen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

SkobyMobil

Hallo,
Du hast ein dickes Fell, das rechne ich Dir hoch an und bin auch dankbar.
Versuche mir einmal zu erklären, warum man "printX" nicht nutzen sollte.
Und dann, was sollte das machen?

(*buffer == 0x71 ? 8 : 3)

Der Stern ist doch ein Pointer, der in einer Variable auf eine bestimmte Stelle zeigt.
Hier, 0x71 auf eine Ziffer, Zahl- 0x70 sollte Buchstabe/String sein, denke ich mir.

mit dem Fragezeichen kann ich nicht viel anfangen.

Bayern 8, Dortmund 3

Da sollten 8 Stellen gelesenwerden, und 3 werden ausgewertet.
Aber, da kann ich auch 8:5 oder 9:4 schreiben, Dein Sketch liefert immer noch.
Da komme ich nicht mit weiter, weil NullAhnung.
Gruß und Dank
Andreas
die zweite Maus bekommt den Speck...


Go Up