Serielle Datenstring vom Computer im Adruino Mega einlesen und aufteilen

Benziner:
Darf ich dich wenn es weiter geht nochmal ansprechen?

Na gut, ausnahmsweise :grin:

Das gilt sicherlich auch für die anderen hilfsbereiten Menschen dieses Forums.

Ich wünsche Dir eine schöne Woche!

Hallo Peter, Hallo agmue,

bevor ich euch nerve wollte ich erstmal selber verstehen…testen und mir die Haare raufen.
Also beide code funk­ti­o­nie­ren, hierfür besten Dank an euch beiden.
Im seriellen Monitor wird der Computer String eingelesen, aufgeteilt und auch richtig dargestellt.

Nun habe ich bei beiden code´s das selbe Problem, sobald ich es auf dem Monitor ausgebe,
werden Daten verschluckt oder durcheinander gewürfelt. Von Peters Code habe ich mal zwei Bilder gemacht.Einmal mit tft Ausgabe(seriell sieht es dann genauso aus) und einmal ohne TFT Ausgabe.

Ich glaube das tft (3,5 Zoll ILI9488) spuckt mir ganz schön ins essen.Oder mache ich hier etwas falsch?

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0);


int x=0;
String myString;
String titelString;
char* Titel [] = {
  "BRZ:",
  "BRF:",
  "BRS:",
  "AR1:",
  "RZ1:",
  "F1:",
  "AR2:",
  "RZ2:",
  "F2:",
  "AR3:",
  "RZ3:",
  "F3:",
  "AR4:",
  "RZ4:",
  "F4:",
  "AR5:",
  "RZ5:"
};
/* Test String
BRZ:5,562;BRF:Fahrer-4;BRS:4;AR1:0;RZ1:0,000;F1:Fahrer-1;AR2:0;RZ2:0,000;F2:Fahrer-2;AR3:1;RZ3:106,288;F3:Fahrer-3;AR4:2;RZ4:5,562;F4:Fahrer-4;
*/
void setup() {
    randomSeed(analogRead(5));   //.kbv Due does not like A0
    pinMode(A0, OUTPUT);       //.kbv mcufriend have RD on A0
    digitalWrite(A0, HIGH);
  
// Setup the LCD
  myGLCD.InitLCD();
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial1.begin(9600);
  Serial2.begin(9600);
  myGLCD.clrScr();
  myGLCD.setBackColor(0,0,0); // Hintergrundfarbe
  myGLCD.setColor(0,255,255); // Schriftfarbe
  
// Bild 1
   
//   myGLCD.print("Schnellste Rundenzeit:",0,10);
//    
//   myGLCD.print("Fahrer schnellste Runde:",0,20);
//   
//   myGLCD.print("Schnellste Runde auf Spur:",0,30);
//   
//   myGLCD.print("Anzahl Runden Spur-1:",0,40);
//
//   myGLCD.print("Anzahl Runden Spur-2:",0,50);
//   
//   myGLCD.print("Anzahl Runden Spur-3:",0,60);
//  
//   myGLCD.print("Anzahl Runden Spur-4:",0,70);  
// 
  Serial.begin (9600);
  Serial1.begin (9600);
  Serial.println("und los geht´s");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial1.available())
  {
    myString = Serial1.readStringUntil(';');
    for (int n = 0 ; n < 16 ; n++)
    {
      if (myString.startsWith(Titel [n]))
      {
        titelString = Titel [n];
        myString.remove(0, titelString.length());
        Serial.print(Titel [n]); Serial.print(" = "); Serial.println(myString);
      
//TFT Ausgabe     
myGLCD.print(Titel [n],100,x);
myGLCD.print(myString,200,x); 
x=x+10; 

      
      
      
      
      
      
      
      
      }
    }
  }
}

@Peter
Auch dir nochmal an dieser Stelle ein besonderen Dank

Com4 Ausgabe.JPG

Tft-Ausgabe.JPG

Hallo und guten Abend…
so nach langem hin und her habe ich mein Projekt fast fertig. Mit Nextion Display funktioniert es auf jedenfall besser.Nun habe ich ein anderes Problem…Die Daten können doch sehr schnell in folge reinkommen.Das heißt im Millisek Bereich.In diesem Fall werden die Datenaufteilung durcheinander gewürfelt. Kommen Sie alle 1 sek. rein ist alles gut. Hat da vielleicht einer ne Lösung für mich parat?

Ich letzten Tage habe ich schon mit Baudrate rauf / runter; Verzögerungszeit…hat alles nichts gebracht.
Oder ist der Mega eventuell für meine Anwendung zu langsam?
Z.B. wenn ich das LCD mit zur Anzeige bringe wird es noch schlimmer :slight_smile:

Wäre echt super wenn ihr mir da helfen könntet.

// Beispiel String der an Serial1 reinkommt....

// BRZ:6,777;BRF:Paul Mustermann;BRS:4;AR1:0;RZ1:0,000;F1:Friedhelm Busch;AR2:0;RZ2:0,000;F2:Max Jägermeister;AR3:0;RZ3:0,000;F3:Paul Mustermann;AR4:0;RZ4:0,000;F4:Thorsten Hesse;

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

const byte numChars = 140; 
char buf[numChars];

float brz;          // Beste Rundenzeit
float rz1;          // Rundenzeit Spur-1
float rz2;          // Rundenzeit Spur-2
float rz3;          // Rundenzeit Spur-3
float rz4;          // Rundenzeit Spur-4
const byte brf_l = 40;
char brf[brf_l];    // Beste Runde vom Fahrer "x" max. 40 Zeichen

const byte f1_l = 40;
char f1[f1_l];      // Fahrername Spur-1

const byte f2_1 = 40;
char f2[f2_1];      // Fahrername Spur-2

const byte f3_1 = 40;
char f3[f3_1];      // Fahrername Spur-3

const byte f4_1 = 40;
char f4[f4_1];      // Fahrername Spur-4

byte brs;           // Beste Runde von Spur-x
byte ar1;           // Anzahl Runden von Spur-1
byte ar2;           // Anzahl Runden von Spur-2
byte ar3;           // Anzahl Runden von Spur-3
byte ar4;           // Anzahl Runden von Spur-4

  
void setup() {
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Welcome to");
  lcd.setCursor(0,1);
  lcd.print("Drive - Control");
   
   //Serial.begin(9600);
   Serial1.begin(9600);
   Serial2.begin(9600);
   Serial3.begin(9600);
}
void loop() {
 
  static uint16_t ndx = 0;
  char rc;

  while (Serial1.available() > 0) {
    rc = Serial1.read();
    Serial3.write(rc);
    //Serial.print(ndx); Serial.print('\t'); Serial.print(rc, HEX); Serial.print('\t'); Serial.println(rc);
    
    if (rc == ';') {
      buf[ndx] = '\0';
      ndx = 0;
      auswertung();
    } else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }

}

void auswertung() {
  char * bez = strtok(buf, ":");
  char * inh = strtok(NULL, ":");
  //Serial.print(bez); Serial.print('\t'); Serial.println(inh);
   
  


  if(!strncmp(bez, "BRZ", numChars)){
    replace (inh, ',', '.');
    brz = atof(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(brz, 3);
    Serial2.print("brz.txt=");
    Serial2.write('"');
    Serial2.print(brz,3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}

  if(!strncmp(bez, "BRF", numChars)){
    strncpy ( brf, inh, brf_l );
    Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.print(inh);Serial.println(brf);
    Serial2.print("brf.txt=");
    Serial2.write('"');
    Serial2.print(brf);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}

  if(!strncmp(bez, "BRS", numChars)){
    brs = atoi(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(brs);
    Serial2.print("brs.txt=");
    Serial2.write('"');
    Serial2.print(brs);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}

// *** Auswertung Anzahl Runden Spur 1 ***

  if(!strncmp(bez, "AR1", numChars)){
    ar1 = atoi(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(ar1);
    Serial2.print("ar1.txt=");
    Serial2.write('"');
    Serial2.print(ar1);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
  
}

// *** Auswertung Anzahl Runden Spur 2 ***

  if(!strncmp(bez, "AR2", numChars)){
    ar2 = atoi(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(ar2);
    Serial2.print("ar2.txt=");
    Serial2.write('"');
    Serial2.print(ar2);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}    

// *** Auswertung Anzahl Runden Spur 3 ***

  if(!strncmp(bez, "AR3", numChars)){
    ar3 = atoi(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(ar3);
    Serial2.print("ar3.txt=");
    Serial2.write('"');
    Serial2.print(ar3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
} 
// *** Auswertung Anzahl Runden Spur 4 ***

  if(!strncmp(bez, "AR4", numChars)){
    ar4 = atoi(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(ar4);
    Serial2.print("ar4.txt=");
    Serial2.write('"');
    Serial2.print(ar4);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}           
// *** Auswertung Letzte Rundenzeit von Spur 1 ***

  if(!strncmp(bez, "RZ1", numChars)){
    replace (inh, ',', '.');
    rz1 = atof(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(rz1);
    if (rz1<99.000){
    Serial2.print("rz1.txt=");
    Serial2.write('"');
    Serial2.print(rz1,3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);}
}
// *** Auswertung Letzte Rundenzeit von Spur 2 ***

  if(!strncmp(bez, "RZ2", numChars)){
    replace (inh, ',', '.');
    rz2 = atof(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(rz2);
    Serial2.print("rz2.txt=");
    Serial2.write('"');
    Serial2.print(rz2,3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}
// *** Auswertung Letzte Rundenzeit von Spur 3 ***

  if(!strncmp(bez, "RZ3", numChars)){
    replace (inh, ',', '.');
    rz3 = atof(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(rz3);
    Serial2.print("rz3.txt=");
    Serial2.write('"');
    Serial2.print(rz3,3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}
//*** Auswertung Letzte Rundenzeit von Spur 4 ***
//
  if(!strncmp(bez, "RZ4", numChars)){
    replace (inh, ',', '.');
    rz4 = atof(inh);
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(rz4);
    Serial2.print("rz4.txt=");
    Serial2.write('"');
    Serial2.print(rz4,3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}
 //*** Auswertung Fahrer von Spur 1 ***

  if(!strncmp(bez, "F1", numChars)){
    strncpy ( f1, inh, f1_l );
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(f1);
    Serial2.print("F1.txt=");
    Serial2.write('"');
    Serial2.print(f1);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
  

}
// *** Auswertung Fahrer von Spur 2 ***

  if(!strncmp(bez, "F2", numChars)){
    strncpy ( f2, inh, f2_1 );
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(f2);
    Serial2.print("F2.txt=");
    Serial2.write('"');
    Serial2.print(f2);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}
// *** Auswertung Fahrer von Spur 3 ***

  if(!strncmp(bez, "F3", numChars)){
    strncpy ( f3, inh, f3_1 );
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(f3);
    Serial2.print("F3.txt=");
    Serial2.write('"');
    Serial2.print(f3);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}
// *** Auswertung Fahrer von Spur 4 ***
if(!strncmp(bez, "F4", numChars)){
    strncpy ( f4, inh, f4_1 );
    //Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(f4);
    Serial2.print("F4.txt=");
    Serial2.write('"');
    Serial2.print(f4);
    Serial2.write('"');
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}


                          
}

void replace( char * str, const char old, const char _new )
{
  while(*str)
  {
    if( *str == old ) *str = _new;
    str++;

  }
  
//  lcd.setCursor(0,0);
//  lcd.print("Bestzeit Heute:");
//  lcd.setCursor(0,1);
//  lcd.print(brz,3);
//  lcd.print("s.  Spur-");lcd.print(brs);
}

Wie sieht Dein aktieller Code aus?

Gruß Tommy

Hallo und guten Abend Ihr netten Forum-User.
Es ist nun schon ne Zeit her das ich hier um Hilfe gebeten habe, ich wollt es auch nicht. Warum, wenn man alles vorgekaut bekommt lernt man es nie. Aber nun verstehe ich meinen MEGA nicht mehr. Es geht immer noch um das alte Thema…

Bin eigendlich seit der letzten Hilfe von “agmue” (An dieser Stelle tausend Dank) am basteln,fräsen,löten,crimpen und abend für abend am probieren.Nun habe ich das Program auf das wesentliche eingekürzt um Den Fehler auszuschließen.

Das einlesen und aufteilen funzt mit hilfe des o.g.Users im grunde, aber…
Egal was ich mache, der 12’er Fehler will einfach nicht weggehen.
Baudrate rauf/runter= Fehler bleibt,
Sendewiederholung von 100ms bis 7 sek.=Fehler bleibt .
Fehler=Es wird an den Display 1-8 bis 1.011 alles richtig angezeigt, dann zeigt er mir 2.011 (soll 2.012), dann wird 3.013 angezeigt, was nach den (soll) ja richtig wäre. Das ganze wiederholt sich alle 12 Eingang-Strings.
Könnte mir einer sagen was da falsch läuft ? Oder kann ich mein Jahresprojekt in die Tonne werfen, wegen einem 12’er Vi

// BRZ:6,777;BRF:Paul Mustermann;BRS:4;AR1:0;RZ1:0,000;F1:Friedhelm Busch;AR2:0;RZ2:0,000;F2:Max Jägermeister;AR3:0;RZ3:0,000;F3:Paul Mustermann;AR4:0;RZ4:0,000;F4:Thorsten Hesse;


#include <TM1637Display.h>             //Einbinden der Bibliothekt zum ansteuern des 7 Segment-Displays
#define CLK1 22   // für Anzeige-1
#define DIO1 6    // für Anzeige-1
#define CLK2 24   // für Anzeige-2
#define DIO2 7    // für Anzeige-2
#define CLK3 26   // für Anzeige-3
#define DIO3 8    // für Anzeige-3
#define CLK4 28   // für Anzeige-4
#define DIO4 9    // für Anzeige-4
#define CLK5 30   // für Anzeige-5
#define DIO5 10   // für Anzeige-5
#define CLK6 32   // für Anzeige-6
#define DIO6 11   // für Anzeige-6
#define CLK7 34   // für Anzeige-7
#define DIO7 12   // für Anzeige-7
#define CLK8 36   // für Anzeige-8
#define DIO8 13   // für Anzeige-8
#define WSL1 31   // Wahlschalter Links "Zeiten"
#define WSL2 33   // Wahlschalter Links "Runden"
#define WSL3 35   // Wahlschalter Links "Uhrzeit"
#define WSL4 37   // Wahlschalter Links "Externe Steuerung"
#define WSR1 43   // Wahlschalter Rechts "Beleuchtung Unten"
#define WSR2 45   // Wahlschalter Rechts "Beleuchtung Oben"
#define WSR3 47   // Wahlschalter Rechts "Beleuchtung Eingang"
#define WSR4 49   // Wahlschalter Rechts "Externe Steuerung"
//#define TL 38     // Taster Links
//#define TR 40     // Taster Recht
//#define TLLED 39  // LED im Taster Links
//#define TRLED 41  // LED im Taster Rechts

byte i=0;
byte t=0;
byte x=2;         // Helligkeit 7-Segment Anzeigen
byte WR1=0;       // Merker ob Wahlschalter auf  Pos.1 steht

//erzeugen des Display 1 bis 8 Objektes mit den Parametern für die PINs
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);
TM1637Display display3(CLK3, DIO3);
TM1637Display display4(CLK4, DIO4);
TM1637Display display5(CLK5, DIO5);
TM1637Display display6(CLK6, DIO6);
TM1637Display display7(CLK7, DIO7);
TM1637Display display8(CLK8, DIO8);

const byte numChars = 250;
char buf[numChars];


float rz1;          // Rundenzeit Spur-1
float rz2;          // Rundenzeit Spur-2
float rz3;          // Rundenzeit Spur-3
float rz4;          // Rundenzeit Spur-4

int Z1;
int Z2;
int Z3;
int Z4;
int Z5;
int Z6;
int Z7;
int Z8; 
void setup() {
  Serial.begin (9600);
  Serial3.begin (9600); 
  
//Setzt die Helligkeit des Displays mögliche Werte sind 0 bis 15, 0 dunkel und 15 hell
  display1.setBrightness(x);
  display2.setBrightness(x);
  display3.setBrightness(x);
  display4.setBrightness(x);
  display5.setBrightness(x);
  display6.setBrightness(x);
  display7.setBrightness(x);
  display8.setBrightness(x);

  // Löschen der Inhalte 1-8
  display1.clear();
  display2.clear();
  display3.clear();
  display4.clear();
  display5.clear();
  display6.clear();
  display7.clear();
  display8.clear();

                    
  pinMode(WSL1, INPUT_PULLUP);                     // Wahlschalter Links "Zeiten"
  }

void loop() {
  
  static uint16_t ndx = 0;
  char rc;
      while (Serial3.available() > 0) {
      rc = Serial3.read();
      //Serial.write(rc);
         
      if (rc == ';') {
      buf[ndx] = '\n';
      ndx = 0;
  
      if((!digitalRead(31))&& (WR1==1)){
      auswertungZeiten();

//
      }
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
 
 
if((!digitalRead(31))&& (WR1==0)){  
  WR1=1;
  display1.showNumberDec(rz1);
  display2.clear();
  display2.showNumberDec(rz1,true,3,0);
  display3.showNumberDec(rz2);
  display4.clear();
  display4.showNumberDec(rz2,true,3,0);
  display5.showNumberDec(rz3);
  display6.clear();
  display6.showNumberDec(rz3,true,3,0);
  display7.showNumberDec(rz4);
  display8.clear();
  display8.showNumberDec(rz4,true,3,0);
 }
  



//void auswertungRunden() {
// 
//  char * bez = strtok(buf, ":");
//  char * inh = strtok(NULL, ":");
//    
//// *** Auswertung Anzahl Runden Spur 1 ***
//    if(!strncmp(bez, "AR1", numChars)){
//    ar1 = atoi(inh);
//    if((!digitalRead(33))&& (WR2==1)){
//    display2.showNumberDec(ar1);}
//    }
//// *** Auswertung Anzahl Runden Spur 2 ***
//    if(!strncmp(bez, "AR2", numChars)){
//    ar2 = atoi(inh);
//    if((!digitalRead(33))&& (WR2==1)){
//    display4.showNumberDec(ar2);}
//    }   
//// *** Auswertung Anzahl Runden Spur 3 ***
//    if(!strncmp(bez, "AR3", numChars)){
//    ar3 = atoi(inh);
//    if((!digitalRead(33))&& (WR2==1)){
//    display6.showNumberDec(ar3);}
//    }
//// *** Auswertung Anzahl Runden Spur 4 ***
//    if(!strncmp(bez, "AR4", numChars)){
//    ar4 = atoi(inh);
//    if((!digitalRead(33))&& (WR2==1)){
//    display8.showNumberDec(ar4);}
//    }           
}

void auswertungZeiten() {
   
   char * bez = strtok(buf, ":");
   char * inh = strtok(NULL, ":");

// *** Auswertung Letzte Rundenzeit von Spur 1 ***
    if(!strncmp(bez, "RZ1", numChars)){
    replace (inh, ',', '.');
    rz1 = atof(inh);
    Z1=(int)rz1;
    Z2=(rz1*1000)-(Z1*1000);
  
    }
// *** Auswertung Letzte Rundenzeit von Spur 2 ***
//
  if(!strncmp(bez, "RZ2", numChars)){
    replace (inh, ',', '.');
    rz2 = atof(inh);
    Z3=(int)rz2;
    Z4=(rz2*1000)-(Z3*1000);
    }

//// *** Auswertung Letzte Rundenzeit von Spur 3 ***

  if(!strncmp(bez, "RZ3", numChars)){
    replace (inh, ',', '.');
    rz3 = atof(inh);
    Z5=(int)rz3;
    Z6=(rz3*1000)-(Z5*1000);
    }

////*** Auswertung Letzte Rundenzeit von Spur 4 ***

  if(!strncmp(bez, "RZ4", numChars)){
    replace (inh, ',', '.');
    rz4 = atof(inh);
    Z7=(int)rz4;
    Z8=(rz4*1000)-(Z7*1000);
    if((!digitalRead(31))&& (WR1==1)){
    display1.showNumberDec(Z1);
    display2.showNumberDec(Z2,true,3,0);
    display3.showNumberDec(Z3);
    display4.showNumberDec(Z4,true,3,0);
    display5.showNumberDec(Z5);
    display6.showNumberDec(Z6,true,3,0); 
    display7.showNumberDec(Z7);
    display8.showNumberDec(Z8,true,3,0);
    //Serial.println(rz4,3);
    
    }}
}                         
void replace( char * str, const char old, const char _new )
{
  while(*str)
  {if( *str == old ) *str = _new;
    str++;}
}

rus? :slight_smile:

Benziner:
Es ist nun schon ne Zeit her

Das ist wohl so...

Egal was ich mache, der 12'er Fehler will einfach nicht weggehen.
Baudrate rauf/runter= Fehler bleibt,
Sendewiederholung von 100ms bis 7 sek.=Fehler bleibt .
Fehler=Es wird an den Display 1-8 bis 1.011 alles richtig angezeigt, dann zeigt er mir 2.011 (soll 2.012), dann wird 3.013 angezeigt, was nach den (soll) ja richtig wäre. Das ganze wiederholt sich alle 12 Eingang-Strings.
Könnte mir einer sagen was da falsch läuft ? Oder kann ich mein Jahresprojekt in die Tonne werfen, wegen einem 12'er Vi

Lies, was ich grad gelesen habe - vor dem Hintergrund, das ich Deinen Aufbau
a) nicht kenne
b) und nicht weiss, was Du willst.

Aber eines was mir aufgefallen ist. Wozu brauchst Du:

  Serial.begin (9600);

Ist nen Insider... :wink:

Ja, da hast du vollkommen recht.ich versuche es mal in kurzen Angaben…
Es sollen von einer Zeitmessung serial Daten empfangen werden und einige Dateninhalte möchte ich an TM1637-Anzeigen ausgeben. Der Empfangende String steht in der ersten Zeile vom Code.

Das trennen funktioniert auch, ich suche mir die Daten raus die ich anzeigen möchte. Zum Beispiel Rundenanzeige, der Programmabschnitt läuft ohne Probleme.Bei der Zeitenanzeige sind es Floatzahlen die ich in vor/nachkomma aufteile um diese auf verschiedene Displays anzeigen zu können.

Serial(9600) zeigt mir das alles richtig getrennt und gerechnet wird. s.Anhang :wink:

Hier ein Bild vom serial Monitor.
Nach dem 12'ten String Eingang zeigt mir das Display statt den 2.012 nur 2.011 an, und das wiederholt sich alle 12 String Eingänge. Der zweite Fehler zeigt 4.023 an nicht wie dargestellt 2.023

Serial-Monitor.JPG

Serial-Monitor.JPG

Ganz ohne quote.
Drücke STRG-T in der IDE!

Die schliessende Klammer in Zeile 167 gehört dahin, wo Schluss ist. In Zeile 218 rate ich...
Das mit der Frage nach Serial.begin() war ernst gemeint...

Hier mal ein Ansatz, wenn ich verstanden habe, was Du willst.
Ich rate das Z1 und Z2 Vorkomma und Nachkomma sind
Das dann bis Z7 und Z8.

Dann hätte ich mal hier mit der Suche angefangen:

    if ((!digitalRead(31)) && (WR1 == 1)) {
      display1.showNumberDec(Z1);
      display2.showNumberDec(Z2, true, 3, 0);
      display3.showNumberDec(Z3);
      display4.showNumberDec(Z4, true, 3, 0);
      display5.showNumberDec(Z5);
      display6.showNumberDec(Z6, true, 3, 0);
      display7.showNumberDec(Z7);
      display8.showNumberDec(Z8, true, 3, 0);
      //Serial.println(rz4,3);
      Serial.println(F("Z2\tZ4\tZ6\tZ8"));
      Serial.print(Z2); Serial.print("\t");
      Serial.print(Z4); Serial.print("\t");
      Serial.print(Z6); Serial.print("\t");
      Serial.println(Z8);
    }

Erstmal vielen Dank für´s reindenken und natürlich Deiner Hilfe.
Nun bin ich von dem Ergebnis sehr überrascht. Warum rechnet er bis 11 richtig und danach falsch und dann wieder bis 23 richtig?
Hab schon Z8 = (rz4,3 * 1000) - (Z7 * 1000); probiert aber da kommtdann nur Müll raus.
Die Klammer in 167 gehört zur void loop
serial benötige ich doch für den Monitor zum beobachten.Oder meinst du die 9600 aus 1970'er :slight_smile:

Serial-Nachkomma.JPG

Serial-Nachkomma.JPG

Benziner:
Nun bin ich von dem Ergebnis sehr überrascht. Warum rechnet er bis 11 richtig und danach falsch und dann wieder bis 23 richtig?

naja… wir haben float…
Ok, können wir uns darauf einigen, das wir das nur erstmal mit der ersten Spur machen?
Ich will wissen:
Inhalt von: inh, rz1 , Z1, Z2

  // *** Auswertung Letzte Rundenzeit von Spur 1 ***
  if (!strncmp(bez, "RZ1", numChars)) {
    replace (inh, ',', '.');
    rz1 = atof(inh);
    Z1 = (int)rz1;
    Z2 = (rz1 * 1000) - (Z1 * 1000);
    Serial.println(F("inh\trz1\tZ1\tZ2"));
    Serial.print(inh);
    Serial.print("\t");
    Serial.print(rz1);
    Serial.print("\t");
    Serial.print(Z1);
    Serial.print("\t");
    Serial.print(rz1);

  }

Die Klammer in 167 gehört zur void loop

Ja. das war mein Gedanke. Was passiert, wenn Du void auswertungRunden() aus den Kommentaren befreist?
Bitte einmal machen, nur kompilieren und hier die Meldung reinkopieren.

serial benötige ich doch für den Monitor zum beobachten.Oder meinst du die 9600 aus 1970’er :slight_smile:

Ja. Und warum mache ich das jetzt für Dich ? :wink:
Und ja - Bild ist JETZT besser als kopierter Text aus dem SerMon.
Bitte nicht dauerhaft angewöhnen - aber Du kannst so klar darstellen, wo es hakt.

Weil du ein ganz netter Mensch bist, der auch alte Männer über die strasse helfen würde :-')

Wenn ich das mache muss ich die Klammer aus 167 wegnehmen, sonst:

Tower-Control_V3.1a:232:1: error: expected '}' at end of input
}
exit status 1
'auswertungZeiten' was not declared in this scope

So, sei mir nicht böse aber ich muss die Bettkarte stempeln.....5:00 ist schluss mit Matrtze horchen.
Wenn du zeit und lust hast können wir gern morgen nochmal.....

Bis dahin schonmal tausend Dank, Fehler gefunden aber keine Ahnnung wie ich den wegbekomme...

Benziner:
Fehler gefunden aber keine Ahnnung wie ich den wegbekomme...

Indem die Klammer dahin kommt, wo die Funktion aufhört.

Weil du ein ganz netter Mensch bist, der auch alte Männer über die strasse helfen würde :-')

Ich nehme nicht nur alte Männer mit über die Strasse. Ganz sicher.

Hallo,vorab 1000 Dank !!! Ich wuste Du bist ein netter Mensch…
Ja es reicht natürlich erstmal eine Spur.Hier mal das Ergebnis…
inh / rz1 / Z1/ Z2
1.001 / 1.00 / 1 / 1
Das geht gut bis inh
14.014 / 14.01 / 14 / 14
dann habe ich folgend Wert
15.015 / 15.02 / 15 / 14
der nächste Fehler tritt dann bei
30.030 / 30.03 / 30 / 29 auf
Kann es sein, das daran liegt das rz1 nicht 3 Stellen nach dem Komma hat?

Benziner:
Hallo,vorab 1000 Dank !!! Ich wuste Du bist ein netter Mensch.....
Ja es reicht natürlich erstmal eine Spur.

Kann es sein, das daran liegt das rz1 nicht 3 Stellen nach dem Komma hat?

NEIN!
Das was Du jetzt merkst, kannst Du leicht austesten:

float rz1;
int Z1;
int Z2;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop() {
  auswertungZeiten();
}

void auswertungZeiten() {
  char inh[] = "15,015";   // Hier nach Belieben ändern
  replace (inh, ',', '.');
  rz1 = atof(inh);
  Z1 = (int)rz1;
  Z2 = (rz1 * 1000);
  Serial.print(F("inh\trz1\tZ1\tZ2 "));
  Serial.print(inh);
  Serial.print("\t");
  Serial.print(rz1);
  Serial.print("\t");
  Serial.print(Z1);
  Serial.print("\t");
  Serial.println(Z2);
while(1); // einmal reicht...
}

void replace( char * str, const char old, const char _new )
{
  while (*str)
  { if ( *str == old ) *str = _new;
    str++;
  }
}

Ich will die Fragezeichen in Deinem Gesicht nicht sehen.....

Aber ich sie Dir zeigen ??? :confused:

Was rechnet der Mega da nur, ich komm da nicht mit, selbst wenn ich rz1 als zweistellig annehme müsste ja 15010 rauskommen. Mhmm grübel....grübel....grübel.

Okay Float kann auch 15.01511111 sein oder 15.015555555 mein ich gelesen zu haben.
Aber auch da könnte ich ja noch 15.016 verstehen aber nicht 15.014

Kannst Du mir das erklären?

Benziner:
Okay Float kann auch 15.01511111 sein oder 15.015555555 mein ich gelesen zu haben.
Aber auch da könnte ich ja noch 15.016 verstehen aber nicht 15.014

Kannst Du mir das erklären?

Ja.
Rundungsregel.

Wenn am Ende die 5 steht, wird gerundet nach der Ziffer davor. Ist die auch 5 wird gerundet nach der davor. Ist die auch 5 ... Und ist die davor 1, wird abgerundet!

Ohh je, ich glaube ich sollte lieber Holz hacken gehn. Gibt es für das Problem eine Möglichkeit, richtig zu runden?
Ich möchte nicht aufgeben, da steckt schon fast 9 Monate arbeit drin.

Benziner:
Ohh je, ich glaube ich sollte lieber Holz hacken gehn. Gibt es für das Problem eine Möglichkeit, richtig zu runden?
Ich möchte nicht aufgeben, da steckt schon fast 9 Monate arbeit drin.

Ja.
Möchtest Du die Langfassung?
Ok - ich bau schnell was...

Nunja, das leicht abgeänderte Testprogramm:

float rz1;
int Z1;
int Z2;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Start..."));
  auswertungZeiten();
}

void loop() {}

void auswertungZeiten() {
  char inh[] = "15,015";   // Hier nach Belieben ändern
  replace (inh, ',', '.');
  rz1 = atof(inh);
  Z1 = (int)rz1;
  Z2 = (rz1 * 1000);
  Serial.println(F("inh\trz1        \tZ1\tZ2 "));
  Serial.print(inh);
  Serial.print("\t");
  Serial.print(rz1, 8);
  Serial.print("\t");
  Serial.print(Z1);
  Serial.print("\t");
  Serial.println(Z2);
}

void replace( char * str, const char old, const char _new )
{
  while (*str)
  { if ( *str == old ) *str = _new;
    str++;
  }
}
[sup]inh   rz1         Z1 Z2 
15.015 15.01499938 15 15014
[/sup]

float stellt manche Zahlen nicht exakt dar und int rundet nicht, sondern schneidet ab.