serielle Kommunikation funktioniert noch nicht richtig

Hallo,
Ich bin neu hier und hätte ein Problem.

Ich möchte mit dem UNO einen Led strip steuern. Dazu nutz ich Neopixel.
Das funktioniert auch gut.

bedienen möchte ich das über ein Nextion display.
Zuerst hatte ich mit dem Nextion nur int geschickt (print 1 usw).

Das hat auch funktoniert. Weil mein funktionsumfang jetzt aber immer grösser wird,
wollte ich zur besser möglichen nutzung einen String schicken der dann ich ein Array gelegt wird.

Solange ich nur vom Nextion zum Uno sende, kommt immer alles richtig an.
Aber wenn ich die empfangen Daten benutze um den Strip zu schalten, kommen die Daten sporalisch falsch an.

Zur kontrolle habe ich hinter serial.read direkt ein serial.print gesetzt.

Normalerweise schicke ich z.b <26> oder <01> usw.
< und > sind start und endzeichen.
oft kommt aber nur <0> an.
aber wie gesagt nur, wenn der strip an ist. Wenn ich switch case ausklammere, kommt immer alles richtig an.

ich hatte versucht zwischen den einzelnen werten noch trenner zu setzen die erkannt werden sollen.
z.b. <2,6> oder <2,4,3>. diese dann in ein int array zu legen das ich zum steuern nehmen kann.

Dies hat auchmal funktioniert. jedoch habe ich dann gemerkt das der Slider Wert so nicht mehr gelesen werden kann. momentan benutze ich den slider so:

print "<"
print slider.val
print ">"

was ich auch noch nicht ganz verstehe, wenn ich serial.println(data[0]) printe, bekomme ich eine 0, wenn ich serial.print(seite) mache, bekomme ich ascci.

wie kann ich das einlesen verbessern?
lg
Hichi

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#define NUM_LEDS 150
#define PIN 3
#define BRIGHTNESS 20
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

const byte numChars = 32;

char data[numChars];
boolean newData = false;
int seite;
int objekt;
int i;

//seriell einlesen
void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '<';
  char endMarker = '>';

  char rc;
  while (Serial.available() > 0 && newData == false) {

    rc = Serial.read();

    if (recvInProgress == true) {
      if (rc != endMarker) {
        data[ndx] = rc;

        ndx++;

        if (ndx >= numChars) {
          ndx = numChars - 1;
        }
      }
      else {
        data[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }

    else if (rc == startMarker) {



      recvInProgress = true;

    }
  }
}
//seriell ausgeben zur kontrolle
void showNewData() {
  if (newData == true) {
     seite = (data[0]);
     objekt = data[1];

    // Serial.print("This just in ... ");
    Serial.println(seite);
    Serial.println(objekt);
    // Serial.println(data[2]);
    // Serial.println(data[3]);
    // Serial.println(data[4]);
    // Serial.println(data[5]);
    //Serial.println(data[6]);
    //Serial.println(data[7]);
    newData = false;
  }
}

//led strip dauerlicht
void einfarbig(uint32_t c) {
  if (i<strip.numPixels()){
  i++;
    strip.setPixelColor(i, c);
  }
  strip.show();
}

void setup() {
  strip.begin();
  strip.show();

  Serial.begin(115200);
  Serial.println("<Arduino is ready>");
}

void loop() {
  //seriell einlesen
  recvWithStartEndMarkers();
 
  showNewData();

//Led strip dauerlicht
  if (seite == 48) {
    switch (objekt) {

      case 48:
        einfarbig(strip.Color(255, 0, 0)); //rot
     
        break;
      case 49:
        einfarbig(strip.Color(0, 255, 0)); //gruen

        break;

      case 50:
        einfarbig(strip.Color(255, 255, 5)); //gelb
        break;

      case 51:
        einfarbig(strip.Color(0, 0, 255)); //blau
        break;

      case 52:
        einfarbig(strip.Color(255, 128, 0)); //orange
        break;

      case 53:
        einfarbig(strip.Color(255, 0, 255)); //lila
        break;

      case 54:
        einfarbig(strip.Color(255, 0, 128)); //pink
        break;

      case 55:
        einfarbig(strip.Color(255, 255, 255)); //blau
        break;

    }
  }


  
}

Dir ist schon klar, dass die Serial Pins schon mit dem Serial-USB Chip des Uno verbunden sind?

Du solltest den 16U2 des UNOs im Reset halten, damit der nicht stört.

Der serielle Monitor ist dabei aus.
trotzdem besteht das Problem.

Ich habe einen anderen Sketch versucht, das selbe Problem.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#define NUM_LEDS 150
#define PIN 3
#define BRIGHTNESS 20
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

// Example 5 - Receive with start- and end-markers combined with parsing

const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];        // temporary array for use when parsing

      // variables to hold the parsed data
char messageFromPC[numChars] = {0};
int integerFromPC = 0;
float floatFromPC = 0.0;

boolean newData = false;

//============

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;

    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

//============

void parseData() {      // split the data into its parts

    char * strtokIndx; // this is used by strtok() as an index

    strtokIndx = strtok(tempChars,",");      // get the first part - the string
    strcpy(messageFromPC, strtokIndx); // copy it to messageFromPC
 
    strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
    integerFromPC = atoi(strtokIndx);     // convert this part to an integer

    strtokIndx = strtok(NULL, ",");
    floatFromPC = atof(strtokIndx);     // convert this part to a float

}

//============

void showParsedData() {
    Serial.print("Message ");
    Serial.println(messageFromPC);
    Serial.print("Integer ");
    Serial.println(integerFromPC);
    Serial.print("Float ");
    Serial.println(floatFromPC);
}


//led strip dauerlicht
void einfarbig(uint32_t c) {
 for (int i=0;i<strip.numPixels();i++){
  i++;
    strip.setPixelColor(i, c);
  }
  strip.show();
}

void setup() {
    Serial.begin(115200);
    Serial.println("This demo expects 3 pieces of data - text, an integer and a floating point value");
    Serial.println("Enter data in this style <HelloWorld, 12, 24.7>  ");
    Serial.println();

    strip.begin();
  strip.show();
}

//============

void loop() {
    recvWithStartEndMarkers();
    if (newData == true) {
        strcpy(tempChars, receivedChars);
            // this temporary copy is necessary to protect the original data
            //   because strtok() used in parseData() replaces the commas with \0
        parseData();
        showParsedData();
        newData = false;

        
    }
    Serial.println(messageFromPC);
    Serial.println(integerFromPC);
    if ( strcmp(messageFromPC,"dauer") == 0 &&integerFromPC == 0) {
  einfarbig(strip.Color(255, 0, 0)); //rot
}
if ( strcmp(messageFromPC,"dauer") == 0 &&integerFromPC == 1) {
  einfarbig(strip.Color(0, 255, 0)); //grün
}
if ( strcmp(messageFromPC,"dauer") == 0 &&integerFromPC == 2) {
  einfarbig(strip.Color(0, 0, 255)); //blau
}
}

 

//============

Hier habe ich zum Beispiel <dauer,0> eingegeben und das rote Licht ging an.
danach mehrmal <dauer,1> und irgendwann kam dann dies dabei raus:

Message dauer
Integer 0
Float 0.00
Message d
<d
<d
<d

<d
<d
<d
<d
<da
<d

Integer 0
Float 0.00

wenn ich die funktion vom strip ausklammere, funktioniert das ohne Probleme.

Ich verstehe nicht woran das liegt.

lg
Hichi