Serielle Datenstring vom Computer im Adruino Mega einlesen und aufteilen

wno158:
Darf ich ein "Bingo!" ergänzen?

Ich hab Deine PM bekommen ... :wink: :wink: :wink: - aber ich wusste, das der TO irgendwann sebst drauf kommt.

Jetzt kommt seine float-Umwandlung und die Multiplikation weg und schon ist das nur noch eine Handvoll Zeilen.

Dann ein Array für die Spuren und der Code schrumpft um 80%.
Ok. Na dann...

Ja habe ich, aber auch da kommen irgendwann unplausible Zahlen auf mein Display. Habt Dank für eure Hilfe
es tut gut sich mit Menschen auszutauschen die verstehen was sie tun. Und Mitleid mit alten Männer haben :slight_smile:

Die Idee hab ich gehabt okay, aber die Umsetzung zeigt den Profi.

Wäre schön wenn ich noch ein Ansatz von euch bekommen würde, ich glaube für weitere 9 Monate fehlen mir die Nerven :confused: :slight_smile:

Ich geh jetzt mal die Bettkarte stempeln.... Wünsche euch allen ne gute Nacht und bleibt gesund.
Und wenn Ihr lust habt mich zu unterstützen, immer wieder gern.

Gruß aus den Tal

Benziner:
Mitleid

Woher nimmst Du diese Annahme?

mit alten Männer

Nicht schon wieder. Du büsst mindest Sympathie ein.

Benziner:
@agmue Willkommen an Board, schön von dir zu hören.Hoffe es geht Dir gut.

Ja, danke der Nachfrage, leider mußte ich ein paar medizinische Begriffe lernen, ich hätte daher Geschichten für alte Männer ::slight_smile:

my_xy_projekt:
Ich bin nicht allein - schön :wink:

Bist Du nicht. Leider fehlt mir der Überblick, was in diesem Thema eigentlich gesucht wird, aber ich habe etwas gespielt in der Hoffnung, irgendjemand kann Nutzen daraus ziehen:

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

void loop() {}

void auswertungZeiten() {
  char inh[] = "15,015";   // Hier nach Belieben ändern
  replace (inh, ',', '.');
  float rz1 = atof(inh);
  int Z1 = (int)rz1;
  int Z2 = (rz1 * 1000);
  int Z3 = -1;
  byte nks = 0;
  uint32_t mul = stringtoint(inh, Z3, nks);
  char buf [30];
  int Z4 = Z3 / mul;
  int Z5 = Z3 % mul;
  char format[] = "%d.%01u";
  format[5] = char(nks+'0');
  snprintf ( buf, 30, format, Z4, Z5);
  Serial.println(F("inh\trz1        \tZ1\tZ2\tZ3\tmul\tnks\tZ4\tZ5\tbuf "));
  Serial.print(inh);
  Serial.print("\t");
  Serial.print(rz1, 8);
  Serial.print("\t");
  Serial.print(Z1);
  Serial.print("\t");
  Serial.print(Z2);
  Serial.print("\t");
  Serial.print(Z3);
  Serial.print("\t");
  Serial.print(mul);
  Serial.print("\t");
  Serial.print(nks);
  Serial.print("\t");
  Serial.print(Z4);
  Serial.print("\t");
  Serial.print(Z5);
  Serial.print("\t");
  Serial.print(buf);
  Serial.println();
}

uint32_t stringtoint(char * z, int & f, byte & n) {
  int s = -1;
  f = 0;
  n = 0;
  for (byte j = 0; j < 255; j++) {
    if (z[j] == '\0') {
      break;
    } else if (z[j] == '.') {
      s = 1;
    } else {
      f = f * 10 + (z[j] - '0');
      if (s >= 0) {
        s *= 10;
        n++;
      }
    }
  }
  return s;
}

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

agmue:
Leider fehlt mir der Überblick, was in diesem Thema eigentlich gesucht wird, aber ich habe etwas gespielt

Mir auch...
Aber ich hab gestern auch gespielt.
Was mir nicht klar ist, warum das replace.
Mein Ansatz ohne die Austauschfunktion:

float rz;
int vorkomma;
int nachkomma;

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

void loop() {
  auswertungZeiten();
}

void auswertungZeiten() {
  char buf[4];
  char inh[] = "15,015";
  sscanf(inh, "%i,%s", &vorkomma, &buf);
  nachkomma = atoi(buf);
  rz = vorkomma+(atoi(buf)/1000.0);
  Serial.print(inh);
  Serial.print("\t");
  Serial.print(rz, 3);
  Serial.print("\t");
  Serial.print(vorkomma);
  Serial.print(F(" , "));  // Die Leerzeichen sind Absicht
  Serial.println(nachkomma);
  while (1); // Nach einem Durchlauf stoppen
}

Upps, da sieht man wer die Profi´s sind, mein vollsten Respekt.
Als Anfänger überfordert mich das total, wenn ich ehrlich bin kann ich den Sketch von agmue nicht ansatzweise nachvollziehen und in meinem Projekt verbauen. Von XY_Projekt ansatzweise… hier bekomme ich die nachkommazahlen nicht angezeigt.(s code)

Hier nochmal mein Vorhaben, es ist ein Computer der mir folgenden String am Stück zu meinem Mega sendet.
Unter umständen können diese sehr schnell in folge reinkommen. <100ms
Nun möchte ich die Bezeichnung und deren Werte aus den String trennen und weiter verarbeiten z.B.
Anzeige von “Runden” Inhalt A1 an Display 2, Inhalt A2 an Display 4 usw. oder durch Wahlschalter umschaltbar auf “Rundenzeiten” dann inhalt RZ1 vorkomma an Display 1, nachkomma an Display2

BRZ:6,777; Mögliche Werte: 0,000 bis 999,999
BRF:Vorname Nachname; Mögliche Werte: Bis zu 25 Buchstaben
BRS:4; Mögliche Werte: 0 bis 8
AR1:0; Mögliche Werte: 1-9999
RZ1:0,000; Mögliche Werte: 0,000 bis 999,999
F1:Vorname Nachname; Mögliche Werte: Bis zu 25 Buchstaben
AR2:0; Mögliche Werte: 1-9999
RZ2:0,000; Mögliche Werte: 0,000 bis 999,999
F2:Vorname Nachname; Mögliche Werte: Bis zu 25 Buchstaben
AR3:0; Mögliche Werte: 1-9999
RZ3:0,000 Mögliche Werte: 0,000 bis 999,999
F3:Vorname Nachname; Mögliche Werte: Bis zu 25 Buchstaben
AR4:0; Mögliche Werte: 1-9999
RZ4:0,000; Mögliche Werte: 0,000 bis 999,999
F4:Vorname Nachname; Mögliche Werte: Bis zu 25 Buchstaben
/n

Der Sketch von agmue hat in den ersten Versuchen auch ganz gut funkuioniert, bis ich bemerkte das die Floatzahlen nach dem Komma nicht richtig dargestellt wurden. Im Prinzip habe ich jetzt dazugelernt das Float großer Mist am Mega ist.
Der weg von XY_Projekt macht da mehr sinn, so meine Vermutung für mein Vorhaben.
Oder wie seht ihr das?

Nur nun der code mit für eine Spur…

// 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-1

//erzeugen des Display 1 bis 8 Objektes mit den Parametern für die PINs
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);

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

float rz;
int vorkomma;
int nachkomma;
int rz1;

void setup() {
  Serial.begin(115200);
  Serial3.begin(9600);
  Serial.println(F("Start..."));
  display1.setBrightness(10);
  display2.setBrightness(10);
}

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;
      auswertungZeiten();
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
}
void auswertungZeiten() {

  char * bez = strtok(buf, ":");
  char * inh = strtok(NULL, ":");
  if (!strncmp(bez, "RZ1", numChars)) {
    sscanf(inh, "%i,%s", &vorkomma, &buf);
    nachkomma = atoi(buf);
    rz = vorkomma + (atoi(buf) / 1000.0);
    Serial.print(inh);
    Serial.print("\t");
    Serial.print(rz, 3);
    Serial.print("\t");
    Serial.print(vorkomma);
    Serial.print(F(" , "));  // Die Leerzeichen sind Absicht
    Serial.println(nachkomma);
    //while (1); // Nach einem Durchlauf stoppen
  }
  display1.showNumberDec(vorkomma);
  display2.showNumberDec(nachkomma, true, 3, 0);

}

Benziner:
hier bekomme ich die nachkommazahlen nicht angezeigt.

Die NK-Stellen kommen wo nicht an?

Ich habe das auf die Ausgabe auf dem Ser-Mon runtergebrochen und da bekomme ich sowohl Vor- als auch Nachkomma.
Beim Display bin ich aussen vor - erstens habe ich nicht so viele und zweitens passt die von Dir verwendete Lib nicht mit meiner, was hier beim Versuch Deinen Code zu compilieren zum Ausstieg führt ;( - Nicht weiter schlimm, ich brech mir das runter, wenns sein muss.

Unter umständen können diese sehr schnell in folge reinkommen. <100ms
Anzeige von “Runden” Inhalt A1 an Display 2,
umschaltbar RZ1 vorkomma an Display 1, nachkomma an Display2

ok…
Jetzt komm ich dahinter, was das wird…
A1 wäre dann AR1 :wink:

Wir haben also 5 Datensätze, von denen sich nur der Erste inhaltlich von allen weiteren 4 unterscheidet.
Die weiteren vier bestehen aus drei Inhalten - Runde, RundenZeit, Fahrername
Nebenschauplatz: Frage, was ist im ersten Datensatz?

Ich denke, das mit dem Display evtl. was durcheinanderkommt.

Ich hatte gestern schon so einen schönen Ansatz mit einem Array…
Den möchte ich dir nicht vorenthalten.
Der löst die Zeiten aller vier Spuren auf - also das was bisher mit einer Spur war.
Achte auf die Anzahl der tatsächlichen Zeilen, die sich in der auswertung-Funktion geändert haben… :wink:

Fragen: Verstehst Du den Hintergrund und möchtest Du das weiterverfolgen?

const byte spuren = 4;
char inh[spuren][7] = {"15,015", "30,030", "14,014", "1,001"}; // Für jede Spur ein Wert

float rz[spuren];  // Brauchst Du die wirklich?
unsigned int vorkomma[spuren];
unsigned int nachkomma[spuren];

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

void loop() {
  auswertungZeiten();
}

void auswertungZeiten()
{
  char buf[4];
  for (int i = 0; i < spuren; i++)                 // für jede Spur
  {
    sscanf(inh[i], "%i,%s", &vorkomma[i], &buf);   // Vorkomma->Zahl - Nachkomma->Zwischenpuffer
    nachkomma[i] = atoi(buf);                      // Nachkomma aus Puffer
    rz[i] = vorkomma[i] + nachkomma[i] / 1000.0;   // rz zusammensetzen
    Serial.print(F("Spur "));
    Serial.print(i+1);
    Serial.print(" inh - RZ - VK , NK\t");
    Serial.print(inh[i]);
    Serial.print("\t");
    Serial.print(rz[i], 3);
    Serial.print("\t");
    Serial.print(vorkomma[i]);
    Serial.print(F(" , "));  // Die Leerzeichen sind Absicht
    Serial.println(nachkomma[i]);
  }
  while (1); // Nach einem Durchlauf Endlosschleife...
}

#52 gibt eine Warnung:

[sup]format '%s' expects argument of type 'char*', but argument 4 has type 'char (*)[4]' [-Wformat=]
     sscanf(inh[ i ], "%i,%s", &vorkomma[ i ], &buf);
                                               ~~~~^
[/sup]

Benziner:
Als Anfänger überfordert mich das total, wenn ich ehrlich bin kann ich den Sketch von agmue nicht ansatzweise nachvollziehen und in meinem Projekt verbauen.

Macht nichts, brauchst Du auch nicht.

Dafür mache ich einen neuen Vorschlag, basierend auf #52, ohne Umweg über float:

const byte spuren = 4;
char inh[spuren][7] = {"15,015", "30,030", "14,014", "1,001"}; // Für jede Spur ein Wert

unsigned int vorkomma[spuren];
unsigned int nachkomma[spuren];

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

void loop() {
  auswertungZeiten();
}

void auswertungZeiten()
{
  for (int i = 0; i < spuren; i++)                 // für jede Spur
  {
    stringtoint(inh[i], vorkomma[i], nachkomma[i]);
    Serial.print(F("Spur "));
    Serial.print(i + 1);
    Serial.print(" inh - RZ - VK , NK\t");
    Serial.print(inh[i]);
    Serial.print("\t");
    Serial.print(vorkomma[i]);
    Serial.print(F(" , "));  // Die Leerzeichen sind Absicht
    Serial.println(nachkomma[i]);
  }
  while (1); // Nach einem Durchlauf Endlosschleife...
}

void stringtoint(char *z, unsigned int &v, unsigned int &n) {
  v = 0;
  n = 0;
  bool s = false;
  for (byte j = 0; j < 255; j++) {
    if (z[j] == '\0') {
      break;
    } else if (z[j] == ',') {
      s = true;
    } else {
      if (s) {
        n = n * 10 + (z[j] - '0');
      } else {
        v = v * 10 + (z[j] - '0');
      }
    }
  }
}

agmue:
#52 gibt eine Warnung:

...die sich aber ganz leicht beheben lässt (Zeile 23):

   sscanf(inh[i], "%i,%s", &vorkomma[i], buf);   // Vorkomma->Zahl - Nachkomma->Zwischenpuffer

Das & vor dem buf war überflüssig - ein char-Array ist schon ein char* (kein Array von Pointern).

ok, wno158 war schneller - ich hab das tatsächlich übersehen, weil ich eigentlich schon viel weiter war.

[edit]
Mir ist hier die nachkommastelle auf die Füsse gefallen und ich weiss nicht warum. Dazu mach ich aber am WE ggfls. was neues auf.[/edit]

Ich habe #53 gerade noch ergänzt, hat sich überschnitten.

Abend zusammen, ihr macht mich (positiv) fertig :confused:

Ich möchte doch nur… Ich geh Holz hacken. :slight_smile: Jetzt habe ich das Beispiel von XY-Projekt halbwegs verstanden und versucht in meinen Mega mit einlesen der Seriellen umzusetzen.

Da bei mir ja die Daten aus der Seriellen und kommen nicht wie im Beispiel hintereinander…komme ich jetzt durcheinander.Kann ich wie im Sketch überhaupt einen buf2 machen?
Es geht um die die nachkomma Anzeige, vorkomma funktioniert.

#include <TM1637Display.h>
#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
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);

//const byte spuren = 4;
//char inh[spuren][7] = {"15,015", "30,030", "14,014", "1,001"}; // Für jede Spur ein Wert

const byte numChars = 150;       //agmue`s war´s 
char buf[numChars];              //agmue`s war´s

float rz;  // Brauchst Du die wirklich?           Hierfür nicht wirklich... ;-)
unsigned int vorkomma;
unsigned int nachkomma;

void setup() {
  display1.setBrightness(10);
  display2.setBrightness(10);
  Serial.begin(115200);
  Serial3.begin(9600);
  Serial.println(F("Start..."));
}

void loop() {
  static uint16_t ndx = 0;            // von hier
  char rc;

  while (Serial3.available() > 0) {
    rc = Serial3.read();
    //Serial.write(rc);

    if (rc == ';') {
      buf[ndx] = '\n';
      ndx = 0;

      auswertungZeiten();
    }
  else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;     // bis hier stammt es aus agmue´s Feder
    }
  }
}
void auswertungZeiten()

{                                                      // *** Auswertung Letzte Rundenzeit von Spur 1 *** 
  char * bez = strtok(buf, ":");                       // auch das stammt aus agmue´s Feder
  char * inh = strtok(NULL, ":");                      // auch das stammt aus agmue´s Feder
  char buf2[7];
                                                       
  if (!strncmp(bez, "RZ1", numChars)) {                // auch das stammt aus agmue´s Feder
    sscanf(inh, "%i,%s", &vorkomma, buf2);             // Vorkomma->Zahl - Nachkomma->Zwischenpuffer
    nachkomma = atoi(buf2);                            // Nachkomma aus Puffer
    rz = vorkomma + nachkomma / 1000.0;                // rz zusammensetzen                                
    display1.showNumberDec(vorkomma);
    display2.showNumberDec(nachkomma, true/false,3,0);
  }
//    char buf[4];
//    for (int i = 0; i < spuren; i++)                 // für jede Spur
//    {
//      sscanf(inh[i], "%i,%s", &vorkomma[i], &buf);   // Vorkomma->Zahl - Nachkomma->Zwischenpuffer
//      nachkomma[i] = atoi(buf);                      // Nachkomma aus Puffer
//      rz[i] = vorkomma[i] + nachkomma[i] / 1000.0;   // rz zusammensetzen
//      Serial.print(F("Spur "));
//      Serial.print(i + 1);
//      Serial.print(" inh - RZ - VK , NK\t");
//      Serial.print(inh[i]);
//      Serial.print("\t");
//      Serial.print(rz[i], 3);
//      Serial.print("\t");
//      Serial.print(vorkomma[i]);
//      Serial.print(F(" , "));  // Die Leerzeichen sind Absicht
//      Serial.println(nachkomma[i]);
//    }
//    while (1); // Nach einem Durchlauf Endlosschleife...
  
}

Das mit dem buf scheint mir okay.

Habe mal nach Deinem Display-Header gesucht.

display2.showNumberDec(nachkomma, true/false,3,0);

Wenn Du das so im Code stehen hast, sollte es eigentlich immer Bruch geben: Du teilst true durch false?
An der Stelle kannst Du führende Nullen einschalten (true) oder ausschalten (false, das ist auch der Standardwert wenn nichts angegeben wird). Bei drei Stellen solltest Du true angeben, denn 'nachkomma' kann ja auch nur ein- oder zweistellig sein:

display2.showNumberDec(nachkomma, true,3,0);

Geht damit die Nachkommaausgabe dann auch?

Hallo Walter,danke für den Tipp.
stimmt war ein Fehler vom mir, hab einfach kopiert und nicht darauf geachtet true/false. Entweder oder nicht beides :wink:

Aber auch das war es nicht, das Display zeigt mir jetzt 0006 dauerhaft.

Benziner:
Ich möchte doch nur… Ich geh Holz hacken. :slight_smile:

Um die Uhrzeit besser nicht, außer Du wohnst ganz abseits ;D

Die Programme für Sender und Empfänger von Juli 2020 habe ich noch, kann ich bei Bedarf anwerfen.

Aber heute nicht mehr, der Sandmann ruft :sleeping:

Ich hätte nur noch zwei Ideen in auswertungZeiten():

#1: Ich weiß nicht sicher, ob der sscanf den String in buf2 mit 0 abschließt. Da würde vor dem if folgende Zeile helfen:

 memset(buf2, 0, 7);

#2: Geht auch um den sscanf - vielleicht kann der das mit dem buf2 nicht richtig. Dann hilft es u.U. die Adresse des ersten Zeichens zu reinzustecken:

   sscanf(inh, "%i,%s", &vorkomma, &buf2[0]);

Erst einzeln ausprobieren, falls es an einem oder beidem gelegen haben sollte, wollen wir ja wissen, was es war.

Hallo Walter,
leider keine von beiden möglichkeiten. Ich vermute er bekommt garnicht mit was hinter dem komma steht.
Im SM sehe ich auch nur eine Null. Mir geht es mittlerweile wie agmue, das Bett ruft....und Viereckige Augen hab ich auch schon :slight_smile:

Habt vielen Dank für eure Hilfe, es ist nicht selbstverständlich aber echt nett von euch.
@agmue
Juli 2020....wie die Zeit vergeht. Freu mich auf deine Ideen.

Gut Nächtle euch allen

Benziner:
leider keine von beiden möglichkeiten. Ich vermute er bekommt garnicht mit was hinter dem komma steht.

Ich hab's befürchtet.

Gibt ja jetzt nicht mehr so viele Möglichkeiten:
Entweder ist das, was Du in die Funktion reinsteckst schon Murks oder da drin geht was schief.
Mit umfangreichen Testausgaben auch der Zwischenergebnisse wird sich das finden lassen; hilfsweise die Funktion mit festen Eingabedaten (nicht von der seriellen Schnittstelle) versorgen und nachsehen, ob damit die Ausgabe stimmt.
Da wird Dir am Wochenende nicht langweilig!

Gut Nächtle euch allen

Dir auch!

Benziner:
Upps, da sieht man wer die Profi´s sind, mein vollsten Respekt.

Ich Programmiere nur so zum Spaß und würde mich als fortgeschrittenen Anfänger mit ein paar Jahren Erfahrung bezeichnen, Anfänger ganz besonders hinsichtlich OOP. Vom Profi bin ich weit entfernt. Nur mal um das richtig einzusortieren. Wenn Du mir nicht glauben solltest, frage combie oder Serenifly, die begleiten mich seit Beginn meiner Aktivität hier im Forum.

Ich gehe jetzt mal zurück auf das, was ich im Juli gemacht habe. Ergänzt habe ich nun die Aufteilung in die ganzzahligen Variablen vorkomma und nachkomma. Damit sollten Rundungsfehler durch atof vom Tisch sein.

Ich habe Zeilen aus #51 übernommen:

// BRZ:15,015;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-1

// erzeugen des Display 1 bis 8 Objektes mit den Parametern für die PINs
//TM1637Display display1(CLK1, DIO1);
//TM1637Display display2(CLK2, DIO2);
const byte numChars = 25;
char buf[numChars];

float brz;
const byte brf_l = 20;
char brf[brf_l];
byte brs;

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial3.begin(9600);
  //display1.setBrightness(10);
  //display2.setBrightness(10);
}

void loop() {
  static uint16_t ndx = 0;
  char rc;

  while (Serial3.available() > 0) {
    rc = Serial3.read();
    //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", 3)) {
    unsigned int vorkomma = 0, nachkomma = 0;
    stringtoint(inh, vorkomma, nachkomma);
    Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.print(vorkomma); Serial.print(" , "); Serial.println(nachkomma);
    //display1.showNumberDec(vorkomma);
    //display2.showNumberDec(nachkomma, true, 3, 0);
  }

  if (!strncmp(bez, "BRF", 3)) {
    strncpy ( brf, inh, brf_l );
    Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(brf);
  }

  if (!strncmp(bez, "BRS", 3)) {
    brs = atoi(inh);
    Serial.print("\t\t"); Serial.print(bez); Serial.print('\t'); Serial.println(brs);
  }
}

void stringtoint(char *z, unsigned int &v, unsigned int &n) {
  v = 0;
  n = 0;
  bool s = false;
  for (byte j = 0; j < 255; j++) {
    if (z[j] == '\0') {
      break;
    } else if (z[j] == ',') {
      s = true;
    } else {
      if (s) {
        n = n * 10 + (z[j] - '0');
      } else {
        v = v * 10 + (z[j] - '0');
      }
    }
  }
}

Ausgabe:

[sup]BRZ 15,015
 BRZ [color=blue]15 , 15[/color]
BRF Paul Mustermann
 BRF Paul Mustermann
BRS 4
 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
[/sup]

Hilft Dir das? Bei Fragen fragen!

Hallo agmue.....und ob mir das geholfen hat :slight_smile: :slight_smile: :slight_smile: Jetzt funzt es wie es soll!!!!
Ich glaube Dir, aber Dein Können ist für mich mehr wie fortgeschrittenen Anfänger.

Danke, Danke danke an euch allen die sich mein Problem angenommen haben und mir geholfen haben. Noch vor einem Jahr habe ich ein Forum für Blödsinn gehalten, dachte da wollen sich alle nur beweisen und Anfänger wie mich dumm sterben lassen. Agmue zeigte mir das es anders geht, auch großes Lob an XY Projekt und all die anderen von gestern abend. Ich war total überrascht wieviele sich das (mein) Problem angenommen haben.

Ich werde aber nicht das letzte mal Fragen stellen.... :wink:

Den mein Projekt geht jetzt erst recht weiter, Werte auf Speicherkarte speichen, RTC mit Tasten stellen, WS2812 Farben über Tasten verändern....eventuell RTC serial stellen.

Ich denke da werde ich euch ganz schön lange erhalten bleiben :grin: