Arduino String Split

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

Når man arbejder med Arduino, så kan det være rart at kunne splitte strenge op i flere dele ved at skille dem ad med et skilletegn.

Det kan være at man ønsker at indlæse en X- og en Y-værdi fra Serial Monitor, men ikke vil indtaste to strenge, med alle de muligheder for fejl der er der. Det kan så gøre ved at man taster strengen 123;654, hvor 123 er X-værdien og 654 er Y-værdien.

Kodeeksempel der tester String Split

Hele kodeeksemplet kan hentes i denne ZIP-fil.

Koden der tester funktionen er lavet som følger:

String stringOne;

String result[10];

void loop() {
  if (Serial.available()) {
    stringOne = Serial.readStringUntil('\n');
    stringOne.trim();
    int antal = strSplit(result, stringOne, ':');
    Serial.println("Splitting with :");
    for (int i = 0; i < antal; i++) {
      Serial.println(result[i]);
    }
    antal = strSplit(result, stringOne, '-');
    Serial.println("Splitting with -");
    for (int i = 0; i < antal; i++) {
      Serial.println(result[i]);
    }
  }
}

Koden leder først efter input fra Seriel-porten, og når det kommer, så læses en hel linje ind i stringOne.

Når man har linjen, så testes den på to forskellige karakterer. Først splittes strengen op ved karakteren ':', hvor resultatet gemmes i et array af String (maksimalt 10 dele), hvorefter hver del printes ud.

På den samme streng laves derefter samme analyse med strSplit ved karakteren '-', og resultatet printes ud.

Funktionen strSplit()

Funktionen er lidt speciel, da den ikke returnerer de opsplittede strenge direkte - den returnerer i stedet det antal strenge der blev resultatet af spilt-operationen.

Resultatet af split-operationen bliver lagret i den første parameter, der skal være et String-array, som kan indeholde det maksimale antal strenge der ønskes returneret.

Selve funktionen ser ud som følger:

int strSplit(String * res, String txt, char splitChar) {
  int pos;
  int i = 0;
  while (txt.indexOf(splitChar) > 0) {
    pos = txt.indexOf(splitChar);
    res[i] = txt.substring(0, pos);
    i++;
    txt = txt.substring(pos + 1);
  }
  res[i] = txt;
  i++;
  return i;
}

Funktionen skal have 3 parametre:

  1. Det array der skal lagre resultatet af split-processen
  2. Den streng txt, der skal splittes op
  3. Den karakter der skal splittes ud fra

Funktionen bliver ved med at splitte strenge op, så længe splitkarakteren er til stede i den resterende del af strengen.

Hver gang trækkes der den første del af resten ud, indtil der ikke er flere split-karakterer.

Den sidste del lægges også i resultatet, så selv en streng uden split-karakterer vil returnere en streng.

Til slut returneres det antal strenge der blev fundet.