Строки, парсинг

Тема в разделе "Arduino & Shields", создана пользователем Chris, 5 июл 2012.

  1. Chris

    Chris Нерд

    Доброго уважаемые форумчане,

    вопрос по строковым переменным получаемым, ну например через сериал.

    Предположим ко мне приходит строка var1:10 var2:250.. varN:NN...

    я читаю её через serial.read(), а как дальше её распарсить? Ну исключаем serial.parseint

    Второй вопрос из этой же серии, но иной. Получаем данные с GPS, как эту строку разобрать на части?!
     
  2. Unixon

    Unixon Оракул Модератор

    Если по простому, то по очереди сравниваете приходящие символы с некоторым шаблоном, и ориентируетесь по результатам сравнения, выделяете подстроки и интерпретируете их как вам нужно. А вообще, поинтересуйтесь такими понятиями как "лексический анализ", "синтаксический анализ", "конечный автомат". Есть совершенно замечательная книга на эту тему.

    Непосредственно для работы со строками можно пользоваться всеми функциями C/C++, не забывая при этом, что у МК очень немного памяти.
     
  3. Chris

    Chris Нерд

    А теперь вернемся к конкретике. Есть ли функции отвечающие за выделение в переменные (можно array) в Arduino IDE. (по типу split в php)
     
  4. Unixon

    Unixon Оракул Модератор

    Вы случайно не String::substring(int from, int to) ищете?
    Готовой функции разбора строки по разделителям или регулярным выражениям в адруиновских классах нет. Доступа к внутреннему буферу класса String нет, но можете сами сделать его в наследнике класса String и отдать сырую char* строку в libc, STL, Boost или что вы предпочитаете. Ну или написать функцию разбора с нуля или класс свой какой-нибудь class SuperString: public String {} если есть желание.
     
  5. Chris

    Chris Нерд

    Что то нашел

    Код (Text):
    #include <string.h>
     
    char sz[] = "Here; is some; sample;100;data;1.414;1020";
    void setup()
    {
    char *p = sz;
    char *str;
    Serial.begin(9600);
    while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon
      Serial.println(str);
    }
     
    void loop(){}
     
    generates this output:
     
    Here
    is some
    sample
    100
    data
    1.414
    1020
     
    Tomasina нравится это.
  6. Unixon

    Unixon Оракул Модератор

    Ну да, тоже вариант. :)
     
  7. //функция для парсинга массива
    String getValue(String data, char separator, int index)
    {
    int found = 0;
    int strIndex[] = {0, -1};
    int maxIndex = data.length()-1;

    for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
    found++;
    strIndex[0] = strIndex[1]+1;
    strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
    }
    return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
    }

    // далее в void loop ()
    String part01 = getValue(SMStxt,';',0);
    String part02 = getValue(SMStxt,';',1);
    String part03 = getValue(SMStxt,';',2);
    //