Помогите с фильтрованием строки в число.

Тема в разделе "Arduino & Shields", создана пользователем Адель, 2 дек 2020.

  1. fogary

    fogary Гик

    Так сильно хуже (упрощено для демонстрации)?
    Код (C++):
      char str[] = "70 n0:196 ff ff ff";

      int n = 0;
      int i = 6;

      while (str[i] != ' ') {
        n = n * 10 + (str[i] - '0');
        i++;
      }
    Автор же пишет, что позиция числа, относительно начала строки, всегда одна и та же. Зачем ее искать-то?
     
  2. akl

    akl Гуру

    даже если число всегда идет с 6-ой ячейки, все равно надо как минимум удостовериться что перед числом стоит "n0:", т.к. строчки приходят разные. а еще возможно будет приходить какой-нибудь мусор, в котором вообще куча непонятного без символа конца строки. а еще потом окажется что надо вынимать не только числа после "n0:", но и еще какие-нибудь.
     
  3. fogary

    fogary Гик

    Вы несомненно правы. Но, про разбор других вариантов строк вопроса не было.
     
  4. b707

    b707 Гуру

    если не искать - то ваш код можно записать в разы короче
    Код (C++):
    char str[] = "70 n0:196 ff ff ff";
    int n = atoi(str+6);
     
     
    Andrey12 нравится это.
  5. akl

    akl Гуру

    тащемта, в целяхо обучения (а ТС явно обучается) лучше наоборот все эти стандартные функции типа atoi, strlen, strstr написать свои. чтобы пришло просветление таксказать
     
  6. b707

    b707 Гуру

    обучается думаете? :)
    ТС уже неделю ждет готового ответа, насколько я вижу

    мой ответ адресован fogary. а не ТС
     
    Последнее редактирование: 7 дек 2020
    Andrey12 нравится это.
  7. fogary

    fogary Гик

    Красиво.
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Не придёт, таксказать :)
     
    Andrey12 нравится это.
  9. Адель

    Адель Нерд

    Еше раз здравствуйте и надеюсь последний:).
    Код (C++):




    #include <Nextion.h>
    int Int1;
    #define ARRLEN 32
    char arr[ARRLEN];
    char cmd1[]="n0:";
    char *arr_pt;
    char str_ready = 0;
    int i=0;
    char error=0;
    Nextion myNextion(Serial3, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
    void setup() {
      Serial.begin(9600);
      myNextion.init();

    }
    void loop() {
      String message = myNextion.listen(); //check for message
      if(message != ""){ // if a message is received...
        Serial.println(message); //...print it out
      }
    char *str15 = message.c_str();
        for ( ; i < ARRLEN; i++) {
        arr[i] = str15;
        if (arr[i] == '\n') {//если строчка напихалась нормально
          str_ready = 1;  //взводим флаг готовности
          arr[i]=0; //в конец строки ставим ноль чтобы было нуль-терменировано
          i=0;//обнуляем счетчик
          error=0; //ошибки нет все ок
          break; //выходим из цикла
        }
      }
      if (str_ready) { //флаг говорит что строка принята
        str_ready=0;//возвращаем флаг на место
        arr_pt=strstr(arr,cmd1); //применяем функцию strstr
        if(arr_pt!=NULL){ //если совпадение найдено
          arr_pt+=strlen(cmd1); //сдвигаем указатель вдоль строки на длину команды
          Int1=atoi(arr_pt); //применяем atoi туда куда указывает указатель
          Serial.println(Int1);
        }
      }else if(i==ARRLEN){//иначе если строка не закончилась, но массив уже забит
        i=0; //значит есть ошибка и обнуляем счетчик
        error=1;
        Serial.println(error);
      }



    }
    Вот код но почему то когда приходит команда от nextion он выводит нормально но результат после прихода команды выдается квадратами в чем может быть проблема ?