Arduino Forum

International => Deutsch => Topic started by: Chris72622 on May 22, 2019, 11:33 am

Title: "Parser-Array-Abfrage" abbrechen
Post by: Chris72622 on May 22, 2019, 11:33 am
Ein Array soll über die Eingabe entsprechender Daten mit sinnvollen Werten befüllt werden.

Ein beispielhaft zu erwartender Befehl lautet z.B. "prio14,3,2,5".

Die zu beschreibende Anzahl der Index soll sich hierbei nach der Anzahl der eingegebenen Daten richten.

Nun zu meinem Problem:

Sobald ab Index 2 eine Null eingegeben wurde soll nur dann die Funktion prio() nicht aufgerufen werden, wenn im Anschluss weitere Zahlen größer als Null eingegeben wurden.

Ein fehlerfhafter Befehl wäre somit z.B. "prio14,3,0,5".

Wie könnte ich den Code aus Eurer Sicht modifizieren/verbessern?

Mit einem einfachen break; scheine ich hier nicht weiterzukommen.

Gruß Chris

Code: [Select]
char* parseString(char* serialBuffer) //String verarbeiten
{
  if (strstr(serialBuffer, "prio") == serialBuffer &&
      getIntFromString(serialBuffer, 1) != 0 &&
      getIntFromString(serialBuffer, 1) <= 30 &&
      getIntFromString(serialBuffer, 2) != 0 &&
      getIntFromString(serialBuffer, 2) <= 8)
  {
    Serial.println("prio");
    byte prioInput[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
    byte j = 1;
    for (byte i = 0; i <= 8; i++)
    {
      j = getIntFromString(serialBuffer, i + 1);
      prioInput[i] = j;
    }
    prio(prioInput);
  }
  else if (strcmp(serialBuffer, "") != 0)
  {
    Serial.print("\"");
    Serial.print(serialBuffer);
    Serial.println("\" ist ein unbekanntes Kommando.");
  }
}

int getIntFromString (char *stringWithInt, byte num) // Zieht der Reihe nach einzelne Integer aus dem String
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
  char *tail;
  while (num > 0)
  {
    num--;
    while ((!isdigit (*stringWithInt)) && (*stringWithInt != 0)) stringWithInt++; // skip non-digits
    tail = stringWithInt;
    while ((isdigit(*tail)) && (*tail != 0)) tail++; // find digits
    if (num > 0) stringWithInt = tail; // new search string is the string after that number
  }
  return (strtol(stringWithInt, &tail, 0));
}
Title: Re: "Parser-Array-Abfrage" abbrechen
Post by: Tommy56 on May 22, 2019, 01:12 pm
Ich würde mit einem Endezeichen, z.B. '\n' arbeiten, um zu erkennen, wenn die Eingabe fertig ist. Bis dahin alles in einen Puffer schreiben und bei '\n' mit '\0' abschließen.
Weiterhin zwischen "prio" und dem 1. Parameter (14) ebenfalls ein Trennzeichen setzen und dann die Teile mit strtok trennen. Infos dazu gibt es hier (https://www.wikinger-tommy.de/arduino/tut_zeichenketten.html).
Dabei als erstes den Befehl ermittel (prio) und dann die Parameter einlesen. Dabei oder danach die Bedingungsprüfung durchführen.

Gruß Tommy
Title: Re: "Parser-Array-Abfrage" abbrechen
Post by: Chris72622 on May 22, 2019, 01:14 pm
Super Idee, danke!

Gruß Chris