Wie baue ich einen Union String in eine if Funktion?

Hallo,

ich würde gern einen Union String in einer if Abfrage weiter verarbeiten.

in meinem Code nutze ich den Union String für die Eingabe an einem Nextion Touch Display.

Zu meiner Idee:
Ich gebe des Wert 29 im Nextion ein. Und möchte einfach nur sagen:

Wenn der Wert 29(im Union Format) <= x dann schreibe im Seriellen Monitor "Alles in Ordnung"
Als Code:
int x = 30;
if(String(value.valLong)<= x){
Serial.println("Alles in Ordnung");
}

nur klappt das leider nicht. Kann mir jemand helfen?

Hier mein Code

#include <SoftwareSerial.h>
SoftwareSerial nextion (12, 13);
String ende = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String b1 = "";

union {
  char charByte[4];
  long valLong;
} value;

void setup() {
  Serial.begin(9600);
  nextion.begin(9600);

}

void loop() {

  if (nextion.available()) {
    b1 += char(nextion.read());
    if (b1.length() > 4)b1 = "";
    if (b1.length() == 4) {

      value.charByte[0] = char (b1[0]);
      value.charByte[1] = char (b1[1]);
      value.charByte[2] = char (b1[2]);
      value.charByte[3] = char (b1[3]);
      Serial.println(String(value.valLong));
      nextion.print("Ausgabe.val=" + String(value.valLong));
      nextion.write (0xff);
      nextion.write (0xff);
      nextion.write (0xff);

      b1 = "";

    }
  }
  /* if (b1.endsWith(ende)) {
     Serial.println(b1);
     b1 = "";
    }*/
  delay (1);
}

Warum nutzt Du nicht nextion.print(longzahl)?

Die Mischung aus String und char-Array ist grässlich. Das wird Dir auf die Füße fallen.

Gruß Tommy

Weil ich es nur auf diese weise schaffe eine Zahl vom Nextion an den Arduino zu senden.

Ausgabe.val ist in meinem Fall die Adresse eines Zahlenfeldes auf dem Nextion. Zum Kontrollieren welche Zahl geschrieben wurde.

Das sendet zum Nextion.

Was denn nun? von oder zum Nextion?

Gruß Tommy

hier Sende ich eine Zahl vom Nextion zum Arduino.(b1 ist der Sendenbutton vom Nextion)

Hier übergebe ich die die Gesendete Zahl an den Seriellen Monitor.

Da im ich im finalen Projekt keinen Seriellen Monitor mehr habe, ich aber die vom Nextion Gesendete Zahl sehen möchte, gebe ich sie damit auf ein extra Zahlenfeld auf den Nextion zurück.

Dann schau Dir doch mal diese Funktion an:

// nach Whandall 05.09.2019 forum.arduino.cc
// https://forum.arduino.cc/t/nextion-component-id-trennen/609217/19
const byte bufferSize = 15;
uint8_t buffer[bufferSize];

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600); 
}

bool readNex(Stream &s) {
  static uint8_t bIndex = 0;
  bool allesDa = false;
  if (s.available()) {
    uint8_t inChar = s.read();
    buffer[bIndex++] = inChar;
		// 0x71 bei diesen Paketen können drei 0xFF Bestandteil des Pakets sein,
    // also ergibt es nur Sinn auf die Delimiter hinter dem Wert zu testen
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      allesDa = true;
    } else {
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) bIndex = 0; // Index zurücksetzen 
  return allesDa;
}

void loop() {

unsigned long varVomNextion =0;
bool fertig = readNex(Serial2);
  if (fertig && buffer[0] == 0x71) { // Buffer[0] enthält das Kennbyte, nach dem die Auswertung erfolgen muss - hier numerische Daten
    varVomNextion = buffer[1]+buffer[2]*256+buffer[3]*65536+buffer[4]*16777216;
	  Serial.println(varVomNextion);
	}
}

Außerdem ist Serial.println(String(value.valLong)); Unsinn.
Es genügt Serial.println(value.valLong);

Die laufenden String-Umwandlungen fragmentieren Deinen RAM und irgendwann stürzt Dein MC ab.

Gruß Tommy

Ok ich hätte vorab sagen sollen das mein Code den ich da geschrieben habe sicher 1 Woche Recherche benötigt hat. Was darauf schließen lässt das ich nicht fit in C bin.

Deshalb verstehe ich nahezu nichts was in deinem Code steht Tommy. :disappointed_relieved:

Am Rande:
Du verwendest C++ und nicht C!
Vielleicht liegt da ja ein Teil deiner Sorgen.......

Das Problem kannst Du aber nicht uns anlasten. Lerne die Grundlagen der Sprache C++, die Du benutzen willst an einfachen Beispielen und gehe später zu komplexeren Themen.
Das Nextion scheint derzeitg Deinen Wissensstand etwas zu überfordern. Daran sind schon Leute mit mehr Programmiererfahrung daran verzweifelt. Das ist kein Stoff für absolute Anfänger, die nur Codeschnipsel zusammen kopieren, ohne deren Inhalt zu verstehen.

Du versuchst derzeit einen Marathon zu laufen, obwohl Du noch nicht mal krabbeln kannst. Sorry für die evtl. harten Worte, aber so sehe ich das.

Gruß Tommy

Ich habe Angst das es wieder in einer Antwort von jemandem endet "Wenn du keine Ahnung hast lass es einfach oder fang mit dem Blink LED Sketch an" :cold_sweat:

Das wäre durchaus sinnvoll, erst mal die Basics zu lernen.

Gruß Tommy

Ich denke das ich schon verstehe was in meinem Sketch steht.(kann mich aber sicherlich täuschen"

Meine Interpretation meines Sketches ist: Da der Nextion einen ASKII Code über die Serielle Schnittstelle sendet und dieser Quasi über die Union Funktion "lesbar" gemacht wird. Der Rest ist ja dann nur noch Serial.println.

Und zu jeder Funktion die in dem Sketch stehe habe ich mich auch belesen. Außer Union da habe ich nicht so richtig was gefunden.

Das ist schon falsch. Hast Du Dir mal die Doku zum Nextion angeschaut?
Oder das Tutorial von Boecker?

Gruß Tommy

Das habe ich tatsächlich gemacht. Aber Scheinbar nicht richtig verstanden.

Du glaubst nicht, was man mit Hilfe einer oder mehrer blinkender LEDs alles lernen kann :rofl:

Aber möglicherweise machst Du ja auch nur einen meiner Anfangsfehler, denn ich dachte, nur der Inhalt der Arduino-Referenz würde auf einem Arduino laufen. Aber nein, es ist grundsätzlich der Sprachumfang von C++, für mich eine Überraschung. Es gibt wegen der nur acht Bits Einschränkungen, aber viel funktioniert.

Beispielsweise auch sscanf, das ich in Deinem Fall nützlich finde, getestet mit einem UNO:

void setup() {
  Serial.begin(9600);
  Serial.println("\nStart");
  char buf[10] = {"XX"};
  long valLong = 0;
  for (long v = 25; v < 33; v++)
  {
    snprintf(buf, sizeof(buf), "%li", v);
    Serial.print("buf: "); Serial.print(buf);
    sscanf (buf, "%li", &valLong);
    Serial.print("\tvalLong: "); Serial.print(valLong);
    if (valLong <= 30)
    {
      Serial.print("\tAlles in Ordnung");
    }
    Serial.println();
  }
}

void loop() {}

Ausgabe:

Start
buf: 25	valLong: 25	Alles in Ordnung
buf: 26	valLong: 26	Alles in Ordnung
buf: 27	valLong: 27	Alles in Ordnung
buf: 28	valLong: 28	Alles in Ordnung
buf: 29	valLong: 29	Alles in Ordnung
buf: 30	valLong: 30	Alles in Ordnung
buf: 31	valLong: 31
buf: 32	valLong: 32

Natürlich kannst Du im Nachschlagewerk Deiner Wahl nachlesen, ich finde cplusplus.com schön knackig.

Inzwischewn haben hier so viele geschrieben, daß sich mein Hinweis möglicherweise wiederholt, na sei's drum.

Nach eigener Aussage, zumindest habe ich dich so verstanden, bist du weder fit in C noch in C++.
Das finde ich nicht dramatisch, denn das kann man/du ändern!

Das mit "Wenn du keine Ahnung hast lass es einfach" wirst du von mir nicht hören, solange ich einen Hauch von Willen spüren kann.

"oder fang mit dem Blink LED Sketch an"
Das könnte schon eher von mir sein.

So wie es auch quasi aussichtslos ist, ohne jede Fahrpraxis ein Formel1 Rennen gewinnen zu wollen.
Ich weiß das!

Zwischen den beiden Zuständen liegt viel harte Arbeit.

Union ist keine Funktion, sondern ein Keyword der Sprache C++.

Schön dass du union gefunden hast.....
Aber ich habe keine/wenig Ahnung was du damit erreichen willst.

Mir scheint du machst ein "Type punning" über Union.
Das kann ganz derbe ins Auge gehen, wenn man nicht exakt weiß, was man da tut.
Klarer:
Wer kapiert hat, wie das geht, lässt es lieber sein.

Dann ist ey doch gut, wenn du da noch etwas übst.
Nimm z.B. den Code von Tommy und teste damit. Da wirst du sicher schnell verstehen, wie das funktioniert, oder hier nachfragen.

Gegenfrage:
Was für einen Controller verwendest du ?

Ich verwende einen Arduino Mega 2560.

in der Doku steht doch sogar bei Punkt 2 alle Befehle und Parameter sind in ASCII

Warum verwendest du dann nicht eine der zusätzlich vorhandenen Hardwareseriellen Schnittstelle ?
Da brauchst du SoftwareSerial nicht.

Und bei der Verwendung eines ESP8266 könntest du dir den Inhalt auch per WLAN anzeigen lassen. Das nur als Beispiel.