Dateneinlesen vom Nextion endet bei 63 Byte

Hallo zusammen,

ich betreibe Grundlagenforschung (für mich) in Sachen Datenübertragung.

Im Detail:

Die Hardware besteht aus (momentan) einem UNO mit einem Nextion-TFT-Display (intelligent).

Einige Werte von Slidern und die Schaltzustände div. Schalter speichere ich im EEPROM vom Nextion. Beim Verlassen der aktuellen Page speichere ich die Daten weg und beim erneuten Laden hole ich diese wieder auf den Screen und aktualisiere mein GUI.

Nun muss ich den Uno auch synchronisieren, d.h. die Werte aus dem EEPROM einmalig in den Arduino übertragen, z.B. beim Kaltstart oder Reset.

Dazu hat mir Whandall in einem früheren Beitrag schon den Tipp mit dem Befehl ‚rept‘ gegeben.

Mit diesem arbeite ich mein vorliegendes Problem aus.

Im Forum und im www habe ich sehr viel gesucht, gelesen und ausprobiert, da dieses Thema (noch) nicht meine Stärke ist.

Zunächst hänge ich an der vollständigen Übertragung der Werte an den Arduino.

Das Problem ist, dass ich Daten nur bis ca. 70 Bytes einlesen kann.

Alle meine gewünschten Werte habe ich gruppenweise in <60Byte Blöcke überprüft, das ist alles ok.

Da es einmalig reicht, habe ich den Befehl im Setup eingebaut.

Das nachfolgende Beispiel ist aus dem Forum und soll 230Bytes einlesen können.

Bei mir läuft alles soweit gut, aber halt nur bis der 63Byte-Speicher voll ist.

Ich suche schon ziemlich lange, was das für einen Grund haben könnte.

Kann mir hier jemand weiterhelfen?

Gruß und Dank, Franz


// Filename: SerialInput_230Byte_02.ino
// Hardware: Uno mit USB-TTL-Konverter auf Serial2 und Nextion-Editor
// https://forum.arduino.cc/t/solved-serial-data-coming-in-need-to-organize-it-into-data-on-a-screen/617345/4
// Testprogramm zum Austesten des rept-Befehls vom Nextion 
//
// OK: Beispiel fordert Daten vom Nextion an, die Buffersize=250 ist auch ok.
// OK: den gleichen Befehl kann ich über einen Button vom Nextion starten, kein Unterschied
// OK: Daten bis Byte 61 sind immer ok
// OK: den Programmteil mit Overflow habe ich geteset
// der Code liest nur bis Index 68 ein (max. interne Puffergröße)

#include <SoftwareSerial.h>
SoftwareSerial Serial2(2, 3); // RX, TX

//const byte BufferSize = 250;
const unsigned int BufferSize = 250;    // original
char buffer[BufferSize];

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

//Serial2.print("rept 100,60");
Serial2.print("rept 100,200");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);   
delay(5);                   // benötigt das Nextion (VerarbeitungsZeit)
Serial.println("setup ok");
}
//-----------------------------------------------
void loop()
{
static bool Storing = false;
static unsigned int Index = 0;

  if(Serial2.available()>0)
    {
      char ch=Serial2.read(); 
      Serial.println((ch),DEC); 
        
        if(Storing)
          {
          if(Index<BufferSize-1)
            {
              Serial.print("BufSize: ");
              Serial.print(BufferSize);   
              Serial.print("     Index ");
              Serial.print(Index);
              Serial.print("  Buf: ");
                               
            buffer[Index++]=ch;
            buffer[Index]=0;
            }
          else
            {
            Serial.println("               Overflow");
            Storing = false;
            Index = 0;          
            }

            
          if(Storing && ch==';')
            {
            ProcessBuffer();  
            Storing=false;
            Index=0;          
            }
          }
        else
          {
          if(strchr("ZETS",ch))
            {
            Storing=true;
            Index=0;
            buffer[Index++]=ch;
            buffer[Index]=0;   
            }
          }
          
        }//end if serial2.available
        
}//end loop
//-----------------------------------------------
void ProcessBuffer()
{
Serial.println(buffer);
switch(buffer[0])
  {
  case 'Z':
    ProcessCells();
    break;
  case 'E':
    ProcessEnergy();
    break;
  case 'T':  //do nothing
    break;
  case 'S':
    ProcessCurrent();
    break;
  }
}
//-----------------------------------------------
void     ProcessCells()
{
Serial.println("process cells");  
}

void ProcessEnergy()
{
Serial.println("process energy");  
}

void  ProcessCurrent()
{
Serial.println("process current");    
}

Das riecht so, als sei deine Ausgabe der Einzelzeichen zu langsam und der FIFO-Buffer läuft dir voll. Versuche doch mal, erst in einen Buffer zu lesen und erst wenn nichts mehr kommt, eine Ausgabe zu machen.

Erhöhe die Geschwindigkeit von Serial,

das gibt u.U. 5 Zeichen für jedes empfangene aus.

Wozu soll die Klammer um ch dienen?

Ich würde erst alle Bytes einlesen, und sie danach verarbeiten.

Ein unglücklicher Name für ein SoftwareSerial Objekt,
der unbedarfte Betrachter sieht dort die dritte Hardware Schnittstelle.

Echt?
Den Empfänger taub machen, ist (gerade für SoftwareSerial) eine besonders doofe Idee.

Hallo Whandall,

ich habe mal

  • auf 115200 umgestellt, der Index läuft bis 77.
  • Delay(5) entfernt, Index läuft bis 77
  • die Ausgabe aus der Schleife entfernt und am Ende eingebaut (eine gute Idee), Index zählt bis 77
  • die Klammer um ch ist ein Überbleibsel:)

Da ich relativ wenig Wissen zum Thema habe, eine Frage:
macht der Originalcode Bytes >230 einlesen denn überhaupt das was er verspricht, nämlich bis zu 230 Bytes einzulesen?

Gruß und Dank, Franz

Mir hat er nichts versprochen, er macht aber deutlich mehr als 230 Bytes einlesen.

Warum zählst du nicht selbst bis 230 (wenn du dir den Buffer in der Größe leisten kannst)?

Abgesehen davon sendet das Nextion nur 200 Bytes.

In deiner Aufzählung hast du

  • dummerweise vergessen den neuen Sketch zu posten

vergessen.

Was ist "deutlich mehr...." in Zahlen? Sag doch mal an.

Das macht ja wohl deutlich mehr, als ein paar Zeichen einsammeln.
In Zahlen kann ich das nicht angeben, ich kann es dir in Zeilen zeigen:

if(Serial.available())
  {
  char ch=Serial.read();  
  if(Storing)
    {
    if(Index<BufferSize-1)
      {
      buffer[Index++]=ch;
      buffer[Index]=0;
      }
    else
      {
      Serial.println("Overflow");
      Storing=false;
      Index=0;          
      }
    if(Storing && ch==';')
      {
      ProcessBuffer();  
      Storing=false;
      Index=0;          
      }
    }
  else
    {
    if(strchr("ZETS",ch))
      {
      Storing=true;
      Index=0;
      buffer[Index++]=ch;
      buffer[Index]=0;   
      }
    }
  }
}

void ProcessBuffer()
{
Serial.println(buffer);
switch(buffer[0])
  {
  case 'Z':
    ProcessCells();
    break;
  case 'E':
    ProcessEnergy();
    break;
  case 'T':  //do nothing
    break;
  case 'S':
    ProcessCurrent();
    break;
  }
}

void     ProcessCells()
{
Serial.println("process cells");  
}

void ProcessEnergy()
{
Serial.println("process energy");  
}

void  ProcessCurrent()
{
Serial.println("process current");    
}

Hallo zusammen,

ja es hat etwas länger gedauert, aber ich möchte dieses Thema abschliessen, daher nachfolgend noch mein Code, der lauffähig ist.
Danke für Eure Unterstützung

Franz

/*
    Filename: Serial_Receive_230Bytes_Endstand.ino
    ursprünglich von by noiasca
    https://forum.arduino.cc/index.php?topic=682436
    ----------------

    Code soweit umgebaut, dass der 'rept'-Befehl ausgelöst wird und mir somit
    die Daten vom Nextion-EEPROM einliest.
   
    Code = ok, 27.10.2021
    
 */
//---------------------------------------------------------------------------- 
//#include <SoftwareSerial.h>
//SoftwareSerial Serial2(2, 3);   // RX, TX

const byte numChars = 230;      // max. Speichergröße
byte receivedChars[numChars];
boolean newData = false;

// Block 1 
//--------
unsigned long EGiessMenge1  = 0;   //Exxx steht für EEPROM
unsigned long EGiessMenge2  = 0;
unsigned long EGiessMenge3  = 0;
unsigned long EGiessMenge4  = 0;
unsigned long EGiessMenge5  = 0;

unsigned long EGiessDauer1  = 0;
unsigned long EGiessDauer2  = 0;
unsigned long EGiessDauer3  = 0;
unsigned long EGiessDauer4  = 0;
unsigned long EGiessDauer5  = 0;

boolean EcY1enable          = LOW;
boolean EcY2enable          = LOW;
boolean EcY3enable          = LOW;
boolean EcY4enable          = LOW;
boolean EcY5enable          = LOW;

// Block 2 
//--------
boolean EbtY1man            = LOW;
boolean EbtY2man            = LOW;
boolean EbtY3man            = LOW;
boolean EbtY4man            = LOW;
boolean EbtY5man            = LOW;

boolean EcSense1enable      = LOW;
boolean EcSense2enable      = LOW;
boolean EcSense3enable      = LOW;
boolean EcSense4enable      = LOW;
boolean EcSense5enable      = LOW;

unsigned long EhSense1GW    = 0;
unsigned long EhSense2GW    = 0;
unsigned long EhSense3GW    = 0;
unsigned long EhSense4GW    = 0;
unsigned long EhSense5GW    = 0;

// Block 3 
//--------
unsigned long EhPwmLadeMan    = 0;
unsigned long EhPwmSpringMan  = 0;
unsigned long EhSense8GwAuto  = 0;
unsigned long EhPwmSpringAuto = 0;
//-------------------------------
unsigned long Eh0    = 0;
unsigned long Eh1    = 0;
unsigned long Eh2    = 0;
unsigned long Eh3    = 0;
unsigned long Eh4    = 0;

//----------------------------------------------------------------------------------
void setup() 
{
  Serial.begin(115200);
  Serial1.begin(115200);
  
  Serial1.print("rept 96,220");  
  Serial1.write(0xff);
  Serial1.write(0xff);
  Serial1.write(0xff);  
   
  Serial.println("setup ok");  
}
//----------------------------------------------------------------------------------
void loop() 
{
  recvWithStartEndMarkers();
  showNewData();
}
//----------------------------------------------------------------------------------
void recvWithStartEndMarkers() 
{
  static boolean recvInProgress = false;
  static byte ndx = 0;
  byte rc;
 
  while (Serial1.available() > 0 && newData == false) 
    {
      rc = Serial1.read();    
  
      if (recvInProgress == false && rc == 0)
        {
          memset(receivedChars, 0, numChars);
          ndx = 0;
          recvInProgress = true;
          receivedChars[ndx] = rc;
        
        }
        else if (recvInProgress)
        {
          ndx++;
          receivedChars[ndx] = rc;
        }
   
      if (ndx >= 200)
        { //Serial.println(ndx);
          ndx = 0;
          newData = true;
          recvInProgress = false;
        }
        
    } // end while
    
  //Serial.println(newData);
}
//----------------------------------------------------------------------------------
void showNewData() 
{
  if (newData == true) 
  {
    Serial.print("\nDatenEingang: ");

        // bestimmt die Länge, welche in einem Stück ausgegeben wird.
        // momentan bei 160 kommen die letzten Bytes korrekt an
        // Schleife ist nur zur Kontrolle der eingehenden Bytes...
/*        for (byte i = 0; i < 160; i++)  
        {
          if (receivedChars[i] < 0x10) Serial.print("0");
          Serial.print (receivedChars[i], HEX);
          Serial.print(" ");      
        }
        Serial.println();
*/        
        newData = false;
            
          Serial.println("Block1");   
          Serial.println("------"); 
          EGiessMenge1 = (receivedChars[4]+receivedChars[5]*256+receivedChars[6]*65536+receivedChars[7]*16777216);
          Serial.print("EGM1: ");
          Serial.println(EGiessMenge1);
          
          EGiessMenge2 = (receivedChars[8]+receivedChars[9]*256+receivedChars[10]*65536+receivedChars[11]*16777216);
          Serial.print("EGM2: ");
          Serial.println(EGiessMenge2);
          
          EGiessMenge3 = (receivedChars[12]+receivedChars[13]*256+receivedChars[14]*65536+receivedChars[15]*16777216);
          Serial.print("EGM3: ");
          Serial.println(EGiessMenge3);
          
          EGiessMenge4 = (receivedChars[16]+receivedChars[17]*256+receivedChars[18]*65536+receivedChars[19]*16777216);
          Serial.print("EGM4: ");
          Serial.println(EGiessMenge4);
          
          EGiessMenge5 = (receivedChars[20]+receivedChars[21]*256+receivedChars[22]*65536+receivedChars[23]*16777216);
          Serial.print("EGM5: ");
          Serial.println(EGiessMenge5);
          //-----------------------------------------------------------------------------
          EGiessDauer1 = (receivedChars[24]+receivedChars[25]*256+receivedChars[26]*65536+receivedChars[27]*16777216);
          Serial.print("EGD1: ");
          Serial.println(EGiessDauer1);
          
          EGiessDauer2 = (receivedChars[28]+receivedChars[29]*256+receivedChars[30]*65536+receivedChars[31]*16777216);
          Serial.print("EGD2: ");
          Serial.println(EGiessDauer2);
          
          EGiessDauer3 = (receivedChars[32]+receivedChars[33]*256+receivedChars[34]*65536+receivedChars[35]*16777216);
          Serial.print("EGD3: ");
          Serial.println(EGiessDauer3);
          
          EGiessDauer4 = (receivedChars[36]+receivedChars[37]*256+receivedChars[38]*65536+receivedChars[39]*16777216);
          Serial.print("EGD4: ");
          Serial.println(EGiessDauer4);
          
          EGiessDauer5 = (receivedChars[40]+receivedChars[41]*256+receivedChars[42]*65536+receivedChars[43]*16777216);
          Serial.print("EGD5: ");
          Serial.println(EGiessDauer5);
          //-----------------------------------------------------------------------------
          EcY1enable = (receivedChars[44]+receivedChars[45]*256+receivedChars[46]*65536+receivedChars[47]*16777216);
          Serial.print("EcY1enable: ");
          Serial.println(EcY1enable);

          EcY2enable = (receivedChars[48]+receivedChars[49]*256+receivedChars[50]*65536+receivedChars[51]*16777216);
          Serial.print("EcY2enable: ");
          Serial.println(EcY2enable);

          EcY3enable = (receivedChars[52]+receivedChars[53]*256+receivedChars[54]*65536+receivedChars[55]*16777216);
          Serial.print("EcY3enable: ");
          Serial.println(EcY3enable);

          EcY4enable = (receivedChars[56]+receivedChars[57]*256+receivedChars[58]*65536+receivedChars[59]*16777216);
          Serial.print("EcY4enable: ");
          Serial.println(EcY4enable);

          EcY5enable = (receivedChars[60]+receivedChars[61]*256+receivedChars[62]*65536+receivedChars[63]*16777216);
          Serial.print("EcY5enable: ");
          Serial.println(EcY5enable);
          Serial.println();
     
      // Einlesen Block 2,
      //--------------------------------------------------------------------------------------------   
          Serial.println("Block2"); 
          Serial.println("------");     
          EbtY1man = (receivedChars[64]+receivedChars[65]*256+receivedChars[66]*65536+receivedChars[67]*16777216);
          Serial.print("EbtY1: ");
          Serial.println(EbtY1man);

          EbtY2man = (receivedChars[68]+receivedChars[69]*256+receivedChars[70]*65536+receivedChars[71]*16777216);
          Serial.print("EbtY2: ");
          Serial.println(EbtY2man);

          EbtY3man = (receivedChars[72]+receivedChars[73]*256+receivedChars[74]*65536+receivedChars[75]*16777216);
          Serial.print("EbtY3: ");
          Serial.println(EbtY3man);

          EbtY4man = (receivedChars[76]+receivedChars[77]*256+receivedChars[78]*65536+receivedChars[79]*16777216);
          Serial.print("EbtY4: ");
          Serial.println(EbtY4man);

          EbtY5man = (receivedChars[80]+receivedChars[81]*256+receivedChars[82]*65536+receivedChars[83]*16777216);
          Serial.print("EbtY5: ");
          Serial.println(EbtY5man);
          //-----------------------------------------------------------------------------                  
          EcSense1enable = (receivedChars[84]+receivedChars[85]*256+receivedChars[86]*65536+receivedChars[87]*16777216);
          Serial.print("EcSense1en: ");
          Serial.println(EcSense1enable);

          EcSense2enable = (receivedChars[88]+receivedChars[89]*256+receivedChars[90]*65536+receivedChars[91]*16777216);
          Serial.print("EcSense2en: ");
          Serial.println(EcSense2enable);

          EcSense3enable = (receivedChars[92]+receivedChars[93]*256+receivedChars[94]*65536+receivedChars[95]*16777216);
          Serial.print("EcSense3en: ");
          Serial.println(EcSense3enable);

          EcSense4enable = (receivedChars[96]+receivedChars[97]*256+receivedChars[98]*65536+receivedChars[99]*16777216);
          Serial.print("EcSense4en: ");
          Serial.println(EcSense4enable);

          EcSense5enable = (receivedChars[100]+receivedChars[101]*256+receivedChars[102]*65536+receivedChars[103]*16777216);
          Serial.print("EcSense5en: ");
          Serial.println(EcSense5enable);
          //-----------------------------------------------------------------------------  
          EhSense1GW = (receivedChars[104]+receivedChars[105]*256+receivedChars[106]*65536+receivedChars[107]*16777216);
          Serial.print("EhSense1GW: ");
          Serial.println(EhSense1GW);

          EhSense2GW = (receivedChars[108]+receivedChars[109]*256+receivedChars[110]*65536+receivedChars[111]*16777216);
          Serial.print("EhSense2GW: ");
          Serial.println(EhSense2GW);

          EhSense3GW = (receivedChars[112]+receivedChars[113]*256+receivedChars[114]*65536+receivedChars[115]*16777216);
          Serial.print("EhSense3GW: ");
          Serial.println(EhSense3GW);

          EhSense4GW = (receivedChars[116]+receivedChars[117]*256+receivedChars[118]*65536+receivedChars[119]*16777216);
          Serial.print("EhSense4GW: ");
          Serial.println(EhSense4GW);

          EhSense5GW = (receivedChars[120]+receivedChars[121]*256+receivedChars[122]*65536+receivedChars[123]*16777216);
          Serial.print("EhSense5GW: ");
          Serial.println(EhSense5GW);
          Serial.println();   
       
        
      // Einlesen Block 3,
      //--------------------------------------------------------------------------------------------                
          Serial.println("Block3");
          Serial.println("------"); 
          EhPwmLadeMan = (receivedChars[124]+receivedChars[125]*256+receivedChars[126]*65536+receivedChars[127]*16777216);
          Serial.print("EhPwmLadeMan   : ");
          Serial.println(EhPwmLadeMan);

          EhPwmSpringMan = (receivedChars[128]+receivedChars[129]*256+receivedChars[130]*65536+receivedChars[131]*16777216);
          Serial.print("EhPwmSpringMan : ");
          Serial.println(EhPwmSpringMan);
          
          EhSense8GwAuto = (receivedChars[132]+receivedChars[133]*256+receivedChars[134]*65536+receivedChars[135]*16777216); 
          Serial.print("EhSense8GwAuto : ");            
          Serial.println(EhSense8GwAuto);
          
          EhPwmSpringAuto = (receivedChars[136]+receivedChars[137]*256+receivedChars[138]*65536+receivedChars[139]*16777216);
          Serial.print("EhPwmSpringAuto: ");
          Serial.println(EhPwmSpringAuto);

                  
      // Einlesen Reservekanäle zum Austesten der Zählerschleifen, wenn weitere Elemente auf dem GUI dazukommen
      //------------------------------------------------------------------------------------------------------- 
          Eh0 = (receivedChars[140]+receivedChars[141]*256+receivedChars[142]*65536+receivedChars[143]*16777216);
          Serial.print("Eh0: ");
          Serial.println(Eh0);

          Eh1 = (receivedChars[144]+receivedChars[145]*256+receivedChars[146]*65536+receivedChars[147]*16777216);
          Serial.print("Eh1: ");
          Serial.println(Eh1);

          Eh2 = (receivedChars[148]+receivedChars[149]*256+receivedChars[150]*65536+receivedChars[151]*16777216);
          Serial.print("Eh2: ");
          Serial.println(Eh2);

          Eh3 = (receivedChars[152]+receivedChars[153]*256+receivedChars[154]*65536+receivedChars[155]*16777216);
          Serial.print("Eh3: ");
          Serial.println(Eh3);
          
          Eh4 = (receivedChars[156]+receivedChars[157]*256+receivedChars[158]*65536+receivedChars[159]*16777216);
          Serial.print("Eh4: ");
          Serial.println(Eh4);          
          Serial.println();  
    
  }// end newData

} //end showNewData

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.