Fehlerfrei.
Sender: Nano mit Softwareserial bis 115200 getestet
[edit] Die Ausgaben um einen Zeilenumbruch ergänzt.[/edit]
// Umsetzung Daten einlesen
// Dazu gehört SendeSketch https://forum.arduino.cc/index.php?topic=694542.msg4942899#msg4942899
// Vorgaben:
const byte fahrer = 4; // Anzahl Fahrer
const byte charName = 30; // Anzahl Stellen Fahrername
// Bxx ist ein Datensatz
unsigned int BRZvk; // Beste Rundenzeit Vorkomma
unsigned int BRZnk; // Nachkomma
char BRF[charName]; // Fahrername
unsigned int BRS; // Beste Rundennummer
// AR - RZ - F werden mehrere Datensätze
unsigned int AR[fahrer]; // Runden des Fahrer
unsigned int RZvk[fahrer];// Rundenzeit Vorkomma des Fahrer
unsigned int RZnk[fahrer];// Rundenzeit Nachkomma
char F[fahrer][charName]; // Fahrername
// Ende Vorgaben Umsetzung Daten einlesen
bool ausgabe = false; // Wartet auf Vollständigkeit
void setup()
{
Serial.begin(115200); // Serieller Monitor
Serial.println(F("Start..."));
Serial1.begin(115200); // Eingang der Daten sicher getestet von 9600 - 115200
}
void loop()
{
readSerial();
serMon();
}
void readSerial()
{
const int breakTimeRead = 500; // Abbruchzeit in ms
char readChar; // Einzelnes Zeichen
static byte x = 0; // Position im Array
static char buf[30] = {0}; // Zwischenspeicher
unsigned long lastmillis = millis(); // Startzeit merken...
while (Serial1.available() > 0 && millis() - lastmillis < breakTimeRead)
{
readChar = Serial1.read(); // Einlesen
Serial.print(readChar);
if (readChar == ';') // Feldende
{
buf[x] = '\0'; // CharArray abschliessen
teileBuf(buf); // Übergeben zum teilen
x = 0; // Position im Array rücksetzen
}
else
{ if (!isControl(readChar)) // Zeichen ist kein Steuierzeichen
{
buf[x] = readChar; // Dann aufnehmen
x++; // neue Position setzen
}
}
}
}
void teileBuf(char *buf) // Teilt den Puffer
{
char *c; // Zwischenspeicher
c = strtok(buf, ":"); // Übernehme bis Trennzeichen 1
if (!strncmp(c, "BRZ", 3)) { // Feldname
BRZvk = atoi(strtok(NULL, ",")); // Erste Zahl - Trenner ist ,
BRZnk = atoi(strtok(NULL, ",")); // zweite Zahl
}
else if (!strncmp(c, "BRF", 3)) { // Feldname
strcpy(BRF, strtok(NULL, ":")); // Fahrername - Trenner ist :
}
else if (!strncmp(c, "BRS", 3)) { // Feldname
BRS = atoi(strtok(NULL, ":")); // Zahl
}
else if (!strncmp(c, "AR", 2)) {
int x = c[2] - 49;
AR[x] = atoi(strtok(NULL, ":"));
}
else if (!strncmp(c, "RZ", 2)) {
int x = c[2] - 49;
RZvk[x] = atoi(strtok(NULL, ","));
RZnk[x] = atoi(strtok(NULL, ","));
}
else if (!strncmp(c, "F", 1)) {
int x = c[1] - 49;
strcpy(F[x], strtok(NULL, ":"));
if (x == fahrer-1) // Datensatz endet mit Fahrername 4 / Array endet mit 3(!)
{
ausgabe = true; // Freigabe für SerMon
}
}
memset(buf, 0, 30);
}
void serMon()
{
if (ausgabe == true) // Wenn Ausgabe frei
{
ausgabe = false;
Serial.println(); // Umbruch noch eingefügt
Serial.print("BRS: "); Serial.print(BRS);
Serial.print(" BRZ: "); Serial.print(BRZvk); Serial.print(" - "); Serial.print(BRZnk);
Serial.print(" BRF: "); Serial.println(BRF);
for (int i = 0; i < fahrer; i++)
{
Serial.print("AR"); Serial.print(i + 1); Serial.print(": "); Serial.print (AR[i]);
Serial.print(" RZ"); Serial.print(i + 1); Serial.print(": "); Serial.print(RZvk[i]); Serial.print(" - "); Serial.print(RZnk[i]);
Serial.print(" F"); Serial.print(i + 1); Serial.print(": "); Serial.println(F[i]);
}
Serial.println();
}
}
17:21:55.400 -> BRZ:3,801;BRF:Friedhelm Busch;BRS:861;AR1:861;RZ1:3,801;F1:Friedhelm Busch;AR2:861;RZ2:6,342;F2:Max Jägermeister;AR3:861;RZ3:7,699;F3:Paul Mustermann;AR4:861;RZ4:7,944;F4:Thorsten Hesse;
17:21:55.400 -> BRS: 861 BRZ: 3 - 801 BRF: Friedhelm Busch
17:21:55.400 -> AR1: 861 RZ1: 3 - 801 F1: Friedhelm Busch
17:21:55.400 -> AR2: 861 RZ2: 6 - 342 F2: Max Jägermeister
17:21:55.400 -> AR3: 861 RZ3: 7 - 699 F3: Paul Mustermann
17:21:55.433 -> AR4: 861 RZ4: 7 - 944 F4: Thorsten Hesse
17:21:55.433 ->
17:21:55.433 ->
Bei 6 Fahrern aber nur 4 Datenfeldern (Erste Zeile im Code von 4 auf 6 geändert)
Dazu die Ausgabe in Zeile 90 auf x=3 setzen.
17:27:22.468 -> BRZ:5,220;BRF:Friedhelm Busch;BRS:926;AR1:926;RZ1:5,220;F1:Friedhelm Busch;AR2:926;RZ2:7,416;F2:Max Jägermeister;AR3:926;RZ3:6,683;F3:Paul Mustermann;AR4:926;RZ4:8,776;F4:Thorsten Hesse;
17:27:22.468 -> BRS: 926 BRZ: 5 - 220 BRF: Friedhelm Busch
17:27:22.501 -> AR1: 926 RZ1: 5 - 220 F1: Friedhelm Busch
17:27:22.501 -> AR2: 926 RZ2: 7 - 416 F2: Max Jägermeister
17:27:22.501 -> AR3: 926 RZ3: 6 - 683 F3: Paul Mustermann
17:27:22.501 -> AR4: 926 RZ4: 8 - 776 F4: Thorsten Hesse
17:27:22.501 -> AR5: 0 RZ5: 0 - 0 F5:
17:27:22.501 -> AR6: 0 RZ6: 0 - 0 F6:
17:27:22.501 ->
17:27:22.501 ->