Nextion --> Arduino Text senden, Funktion aufrufen

Hallo,
das (dumme) Nextion treibt mich noch an den Rand des Wahnsinn…

Es läßt nicht zu, das Steuerzeichen gesendet werden sollen.

Ich habe hier einen Sketch. Im seriellen Monitor gebe ich ein:
LED AUS
bestätige das mit Enter, und die LED schaltet sich aus.
Hier werden einfach 2 Strings verglichen und wenn wahr- wird die Anweisung
ausgeführt.

char einZeichen = 0;
String zeichenInput = "";
String zeichenLEDan = "LED AN";
String zeichenLEDaus = "LED AUS";

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  digitalWrite(13, HIGH);
}

void loop()
{
 if (Serial.available() > 0)
 {
einZeichen = Serial.read();
Serial.print(einZeichen);

if (einZeichen == '\n')
{
  if(zeichenInput.equals(zeichenLEDan))
  {
    digitalWrite(13, HIGH);
  }

 if(zeichenInput.equals(zeichenLEDaus))
  {
    digitalWrite(13, LOW);
  }
zeichenInput = "";
}
else
{
  zeichenInput += einZeichen;
}
}
}

Sende ich mit dem Nextion print "LED AUS" dann rührt sich nichts!
Das liegt wohl daran, das der Arduino kein Ende des String erkennen kann.
Wenn ich mit dem Nextion print "LED AUS" senden, erscheint im seriellen
Monitor- LED AUS.

Nun könnte man ja Zeichen zählen (hier 7), aber was mache ich wenn es 9 sind?
Ich glaube das ist ein wenig umständlich.
Wie könnte ich dem Arduino denn hier sagen, das nichts mehr kommt?
Gruß und Dank
Andreas

Am Ende einer Übertragung werden normalerweise 3 mal 0xFF erwartet. Also:

Serial.print("LED AN");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);

Dann will das intelligente Nextion natürlich auch noch wissen, in welches Textfeld es das schreiben soll und welche LED willst Du auf dem Nextion anschalten?

Gruß Tommy

Hallo,
die Arie mit dem Textfeld habe ich hinter mir...

Am Nextion habe ich einen Button, wenn der gedrückt wird, dann-

print "LED AUS"

dieses LED AUS kommt beim Arduino an.
print sendet String, nicht mehr- und nicht weniger

es gibt noch get

Am Nextion habe ich einen Button, wenn der gedrückt wird, dann-
get "LED AUS"

sendet 0x70 LED AUS 0xff 0xff 0xff

da kann ich- nichts mit aufstellen

Also, das Nextion sendet eine String an den Arduino, der soll den Inhalt erkennen, und etwas machen.

Bis jetzt kann ich den String darstellen und die Zeichen zählen.

Ich bekomme mit "Serial.println(serialBuffer);" schon LED AUS geliefert und die Länge 6

Ich weiß nur noch nicht, wie ich daraus einen String zum vergleichen bastel.
Gruß und Dank
Andreas
Gruß und Dank
Andreas

Hallo,

mit deinem Code Schnipsel kann ich nichts anfangen. Mir scheint die serielle Handhabung ist noch nicht geläufig. Dabei hat das Serenifly in letzter Zeit sehr oft das Thema abgehandelt wie man einliest und auswertet.

Hallo,
die serielle Handhabung ist mir schon geläufig- nur nicht das was raus kommt…
Den Sketch:

const int SERIAL_BUFFER_SIZE = 9;
char serialBuffer[SERIAL_BUFFER_SIZE];
int zlA = 0;

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

void loop()

{


  if (readSerial(Serial) == true)

 if (zlA == 1)
 {
   delay(5000); // wenn verarbeitung fertig, warte
   zlA = 0;
}
}

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
      Serial.println(index);
      serialBuffer[index] = '\0';
      index = 0;
  // ***********************************************************Ausgabe serieller Monitor**************   
      
           Serial.println(serialBuffer);
           
       
      return true;
    }
  }
  return false;
}

von Serenifly nutze ich schon für Ziffern, aber noch nicht für Strings.
Gruß und Spaß
Andreas

Ich weiß nur noch nicht, wie ich daraus einen String zum vergleichen bastel.

Du hast schon einen String! Halt einen C String. Und kein String Objekt. Den kann man mit ganz einfach strcmp() (string compare) vergleichen:

if (strcmp(serialBuffer, "LED AN") == 0)
{
}

Oder um etwas RAM zu sparen:

if (strcmp_P(serialBuffer, PSTR("LED AN")) == 0)
{
}

Sollte auch gehen wenn man den Vergleichs-String global mit PROGMEM deklariert

Das ist alles

Hallo,
mit Deinem Sketch bin ich auch zu einem Ergebnis gekommen, funktioniert auf dem Arduino…

String zeichenLEDaus = "LED AUS";
String inputString = ""; 
const int SERIAL_BUFFER_SIZE = 9;
char serialBuffer[SERIAL_BUFFER_SIZE];
int zlA = 0;

void setup()
{
   pinMode(13, OUTPUT);
  Serial.begin(9600);
  digitalWrite(13, HIGH);
  }

void loop()

{
 

  if (readSerial(Serial) == true)
 

 if (zlA == 1)
 {
   delay(5000); // wenn verarbeitung fertig, warte
   zlA = 0;
}
}

bool readSerial(Stream& stream)
{
  
 
  
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
      
    char inChar = (char)c;
    // add it to the inputString:
    inputString += inChar;
      
      
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
  // ***********************************************************Ausgabe serieller Monitor**************   
      Serial.print("Ausgabe :");
           Serial.println(serialBuffer);
           Serial.println(inputString);
           
       if(inputString.equals(zeichenLEDaus))
  {
    digitalWrite(13, LOW);
  }    
           
           
           
    inputString = "";
      return true;
    }
  }
  return false;
}

Der Code von Dir ist aber wohl etwas eleganter :kissing:
Mal sehen, was dieses Nextion jetzt mit dem Arduino macht.

“Halt einen C String. Und kein String Objekt”

Ich glaube da kommt Licht ins dunkle…
Ich habe einen C String gehabt, und habe versucht den mit einer String Objekt Funktion zu verarbeiten,
ohne- vorher ein String Objekt draus zu machen??
Gruß und Dank
Andreas

Auch hier gilt: trenne das Einlesen von der Verarbeitung. Es hat seinen Grund weshalb das Einlesen in einer Funktion steht die meldet wann sie fertig ist

Zu dem String Objekt Quatsch sage ich jetzt mal nichts

Hallo,
ich habe den Quatsch mal gestrichen.
Funktioniert aber auch nicht richtig- ich komme da aber hinter.
Gruß und Dank
Andreas

Gibt es hier was neues bezüglich Text senden?

Ich bekomme es nämlich nicht hin. Mir werden im Textfeld nur merkwürdige Zahlen angezeigt, wenn ich Text sende.

Hallo,
das hier ist- Nextion sendet Text an Arduino

das hier

Arduino sendet Text an Nextion. Funktioniert einwandfrei.
Gruß und Spaß
Andreas

Sorry, hab das wohl irgendwie übersehen. Danke!

Hallo,
die “Serielle” macht mich noch fertig…
Jetzt habe ich es hinbekommen “Text” zu vergleichen und auszuwerten-
nun zickt “if (Serial2.available() > 0)”

Wenn ich den Sketch starte, dann ruht der See.

Empfange ich über Serial2. “innen Klima” dann wird das verglichen und auch
verarbeitet. Alles gut.

Danach aber liefert die Serial2. aber immer “-1”

ausgegeben bekomme ich das mit “Serial.print(Serial2.read());”

-1 ist doch kleiner als 0? Also dürfte "“if (Serial2.available() > 0)”
nicht ausgeführt werden.

Wo sitzt denn da schon wieder so ein mistiger Wurm drin?

Gruß und Dank
Andreas

ich habe

blah, blah,



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

void loop()
{

  if (Serial2.available() > 0) 
  {

    if (readSerial(Serial2) == true);
    {
      NexSer();
    }

  }  
}

//loop ende

bool readSerial(Stream& stream)
{

  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;    
      return true;
    }
  }
  return false;
}


void NexSer()

{

  if (strcmp(serialBuffer, "innen Klima") == 0)
  {
    zlHYT = 0;
    LoopHYT();
    NextionTempIN();
  }

}

available wird durch schon in der Funktion abgefragt:

while (stream.available())

Wieso willst du das nochmal machen?

Hallo,
also das "if (readSerial(Serial2) == true);"
ist doch immer wahr? Die Serial2. liefert -1.

also wird doch immer "bool readSerial(Stream& stream)" aufgerufen?

Diese Schleife wollte ich verhindern mit:

  if (Serial2.available() > 0) // nur wenn dem so ist, mache...
  {
    
if (readSerial(Serial2) == true);// hier weiter- und dann
{
  NexSer();// führe das aus...
}

 }

das läuft dann hier auf

void NexSer()//...und das funktioniert auch
{

 if (strcmp(serialBuffer, "innen Klima") == 0)
{
NextionTempIN();// dann das ausführen und raus
}

}

dann liefert Serial.2 -1

also dürfte "if (Serial2.available() > 0)" nicht erfüllt sein.

Vergesse ich da etwas zu setzen oder abzufragen?

"Wieso willst du das nochmal machen?"
while (stream.available())

mit der Frage kann ich nichts anfangen.

Gruß und Spaß
Andreas

Hallo,
Trick 17 mit Selbstüberlistung- läuft??!

Aber das kann es doch nicht sein?

 if (strcmp(serialBuffer, "innen Klima") == 0)
{
NextionTempIN();
Serial2.end();
delay (50);
Serial2.begin(9600);
}

Gruß und Spaß
Andreas

*staubwische

Hast du dazu Neuigkeiten?

Ich hänge ebenfalls an dem Problem fest:

{
  leseUhrzeit();
    while (Serial1.available() > 0)    // falls Daten reinkommen
    {
     if(index < 3) // eins grösser als das Array
      {
          inChar = Serial1.read(); // Zeichen einlesen
          inData[index] = inChar; // und speichern
          index++; // ne Stelle weiter rücken
          inData[index] = '\0'; // Null beendet Eingabe
          befehlErhalten=1;
          
      }   
       Serial.println("Da ist was");
       //while(Serial.read() >= 0);
    }
   
  werteSerielleBefehleAus(); 
}

Das funktioniert- einige Male.
Danach jedoch nicht mehr. Die Meldung “da ist was” wird weiterhin ausgegeben aber es wird nichts verwertbares mehr gefunden.
Momentan werte ich drei Befehle aus, und es wird auch zu keiner Zeit irgendwas anderes vom Nextion zum Arduino geschickt:

void werteSerielleBefehleAus()
{
  
    if (strcmp(inData,"uhr")==0)              // eine neue Seite mit Uhr-Anzeige wurde aktiviert
    {
      if(befehlErhalten==1) // neuer Befehl eingetroffen
      {
      refreshUhr();
      Serial.println(inData);
      befehlErhalten=0;
      }
    }
   if(strcmp(inData,"24h")==0)                // Uhr wurde auf 24-Stunden-Anzeige gestellt
    {
      if(befehlErhalten==1) // neuer Befehl eingetroffen
      {
        stunden24Flag=1;
        refreshUhr();
        Serial.println(inData);
        befehlErhalten=0;
      }
    }
  if(strcmp(inData,"12h")==0)                 // Uhr wurde auf 12-Stunden-Anzeige umgestellt
    {
      if(befehlErhalten==1) // neuer Befehl eingetroffen
      {
        stunden24Flag=1;
        refreshUhr();
        Serial.println(inData);
        befehlErhalten=0;
      }
    }    
}

Nach mehrmaligem Senden eines der drei Befehle ist Schluss, dann erscheint nur noch die Debug-Ausgabe: “da ist was”, aber nicht mehr die Auswertung.
Kann es sein, dass man den Puffer irgendwie wieder löschen muss?
Deine “Lösung” deutet ja darauf hin ?

Hallo,
das hat bei mir funktioniert

const int SERIAL_BUFFER_SIZE = 17;// zu empfangener maximaler Text + 1
char serialBuffer[SERIAL_BUFFER_SIZE];
int zlA = 0;

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

void loop()

{

if (Serial2.available() > 0) 
  {
 if (readSerial(Serial2) == true);
  }
 if (zlA == 1)
 {
   delay(5000); // wenn verarbeitung fertig, warte
   zlA = 0;
}
}

bool readSerial(Stream& stream)
{

  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
    //  Serial.println(index);
      serialBuffer[index] = '\0';
      index = 0;
  // ***********************************************************Ausgabe serieller Monitor**************   
     
           Serial.println(serialBuffer);
           
if (strcmp(serialBuffer, "Das ist ein Test") == 0)
{
  Serial.println("richtig empfangen");
}
           
           
      //wenn falsch empfangen
      return true;
      
    }
    //wenn richtig empfangen
  }
 //wenn nichts empfangen
  return false;
  
}

Serenifly und HotSystems haben sich das ausgedacht…
Gruß und Spaß
Andreas

@Rabenauge
Wenn ich Deine Code-Happen so ansehe, zählst Du index hoch, wenn was empfangen wurde und index<3 ist.
Ich sehe aber Nirgens, daß index auch Mal wieder kleiner wird - somit erscheint es mir sinnig, daß Du nur drei Ausgaben bekommst (index=0, index=1, index=2, danach ist index=3, Deine Befehle werden nicht mehr zusammen gebaut und index wird auch nicht mehr verändert).

MfG

Dochdoch, das funktioniert.
Ich hab es inzwischen gelöst.
Ab und zu werden mit meiner (zuegegebenermassen bestimmt nicht optimalen Methode) "ungültige" Zeichen empfangen.
Also schlichtweg welche, mit denen das Programm nichts anfangen kann, weil es keine Zuordnung gibt.
Da das Nextion ausser den drei bekannten Kommandos nichts senden kann, liegt das wohl an meinem zusammengestümperten Code. Möglicherweise werden, während der Arduino andere Dinge tut (z.B. nachgucken, wie spät es ist) irgendwelche Zeichen auch mal verpasst.
Das ergibt aber automatisch nen Hänger, und zwar so lange, bis mal wieder ein gültiger Code kommt.
Das hab ich schlichtweg mit ner kleinen Fehlerbehandlung aufgefangen, im Sinne von "wenn du das Kommando nicht verstehst, ignorier es einfach".
Trotzdem werd ich das so lassen, weil es nun sehr einfach erweiterbar ist.
Zum einen kann ich nahezu beliebig viele Kommandos senden (naja, nur so viele wie es Ascii-Zeichen³ gibt, und es wäre auch nich viel Arbeit, die Codes länger als dreistellig zu machen), zum anderen kann ich zumindest so ungefähr nachvollziehen, was der jetztige Code tut.

Ich werds auch noch brauchen....das Teilziel, eine Uhr wahlweise per Touchscreen auf 12-oder 24-Stunden-Anzeige umzustellen, ist erreicht.
Nur der Anfang dessen, was ich mit dem Ding vor habe....

Und ja, postmaster-ino du hast recht: Index wird nie kleiner, weil das nicht nötig ist.
Alle Kommandos vom Nextion sind dreistellig, das ist ne art "Protokoll", was ich verwende.
Insofern wird inChar immer komplett überschrieben, das passt schon.
Wäre problemlos auch auf mehr Stellen erweiterbar, braucht ich aber eher nicht.
Allerdings: mit Kommandos unterschiedlicher Länge kann der Code so nich umgehen, das stimmt.