Разбор G-кода с Arduino с SD-карты - PullRequest
0 голосов
/ 03 мая 2020

Как видно из названия, я использую следующую функцию для чтения параметров некоторых файлов g-кода, присутствующих на SD-карте:

long parseParameters(String data, char* c){
    int offset = data.indexOf(c);
    int offset1 = data.lastIndexOf(" ", offset + 1);
    return offset1 > 0 ? data.substring(offset + 1, offset + offset1 + 1).toInt() : data.substring(offset + 1).toInt();
}

void setup(){
    Serial.begin(9600);
    String q = "P3 S255"; // input
    Serial.println(parseParameters(p, "S")); // output
}

void loop(){

}

Только сегодня, в попытке прочитать значение S в строке P3 S255 возникла небольшая ошибка:

INPUT -> OUTPUT
P3 S255 -> 25 (wrong)
A20 P3 S255 -> 255 (Correct)
S255 -> 255 (Correct)

Почему? Тем не менее, код показался бы мне корректным ... где я go ошибся?

Заранее спасибо всем ..:)

1 Ответ

1 голос
/ 03 мая 2020

Это объяснение:

int offset = data.indexOf(c); //in your example S

 "P3 S255";
     ^
  offset = 3

, затем вы анализируете для offset1, но принимаете другой параметр, а именно "" после offset - но в строке от offset + 1 нет "", см. Выше, где индекс поэтому он возвращает -1, почему?

 myString.lastIndexOf(val, from) The index of val within the String, or -1 if not found. But we find something:

offset = 3;
offset1 = 2 ==> offset1 > 0 ==> data.substring(offset + 1, offset + offset1 + 1).toInt()

, что приводит к

 data.substring(3 + 1, 3 + 2 + 1).toInt()
      "P3 S*4*25*6*5"; which results to 25 as you already know

(необязательно): индекс для завершения подстроки перед .

Таким образом, вы вначале исправили S, изменив на

data.substring(offset + 1, offset + 1 + offset1 + 1).toInt() 

Объяснение: Вы начинаете со смещения + 1, это должно быть равно от и до (= та же отправная точка для вашего расчета)

...