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

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

  1. Адель

    Адель Нерд

    Здравствуйте пользователи этого форума.Есть такая проблема у меня на ардуино приходит строки с разными значениями и мне их надо как то вывести эти числа в строках в int как это сделать помогите пожалуйста.
    Код (C++):

    70 n0:199 ff ff ff
    70 n0:198 ff ff ff
    70 n0:196 ff ff ff
      70 n0:10 ff ff ff
        70 n0:1 ff ff ff
    70 n0:100 ff ff ff
    70 n0:150 ff ff ff



     
    Типа таких и как мне извлечь последние цифры
     
  2. b707

    b707 Гуру

    а зачем новая тема?
    вы же уже спрашивали пару дней назад и закрыли ту тему со статусом "РЕШЕНО"
     
    Andrey12 и Vovka нравится это.
  3. Andrey12

    Andrey12 Гик

    Ну тут я как посмотрю цифры отличаются от тех что были в той теме. Может в этом проблема!
    А в какой системе счисления у вас "n0:" ? Ну ff явно шестнадцатеричная? те что цифрами могут быть и двоичная и шестнадцатеричная. То есть как переводить эти строки в int то? По какой системе счисления?
     
  4. Адель

    Адель Нерд

    Ну вообще мне надо вывести именно что после n0: то есть те числа которые отличаются.
     
  5. parovoZZ

    parovoZZ Гуру

    ну так через if распарсь строку.
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Есть два вопроса.

    1. Кто или что мешает это сделать? Какая именно помощь нужна?

    2. Кто или что помешал написать это в первом посте, чтобы не выносить всем мозг?
     
  7. Адель

    Адель Нерд

    они разные их вроде 200-300 штук
     
  8. fogary

    fogary Гик

    Вот так - ступенькой, и приходит? Или это Вы так вставили, по красоте?
     
  9. b707

    b707 Гуру

    Адель, откуда эти строки берутся? Может, кстати. это не строки. а числа? - тогда извлечь их будет проще
     
  10. Адель

    Адель Нерд

    нет это просто так.Они приходят в разброс с разными данными
    От nextion. И это строки а не числа
     
  11. parovoZZ

    parovoZZ Гуру

    разве? В цифровой технике нет ничего, кроме двух цифр - 0 и 1.
     
  12. akl

    akl Гуру

    0 и 1 в цифровой технике - это не цифры! это состояния логического элемента. и это только если не касаться квантовых элементов!
     
  13. parovoZZ

    parovoZZ Гуру

    а в цифровой технике есть квантовые элементы?
     
  14. fogary

    fogary Гик

    Я имел ввиду, что строки 4 и 5 содержат несколько пробелов вначале. Это Вы их вставили, или строки в таком виде и приходят?
     
  15. Адель

    Адель Нерд

    они все приходят без пробелов просто пока я делал и на других форумах так текс сложился
    Код (C++):
    70 n0:199 ff ff ff
    70 n0:198 ff ff ff
    70 n0:196 ff ff ff
    70 n0:10 ff ff ff
    70 n0:1 ff ff ff
    70 n0:100 ff ff ff
    70 n0:150 ff ff ff
    вот так
     
  16. Адель

    Адель Нерд

    Вообще их много разных типов
    Код (C++):
    70 6E 30 3A 31 30 FF FF FF
    65 8 3 1 ffff ffff ffff
    65 5 3 1 ffff ffff ffff
    И вот эти не надо превращать в число
    а вот эти надо:
    Код (C++):
    70 n0:199 ff ff ff
    70 n0:198 ff ff ff
    70 n0:196 ff ff ff
    70 n0:10 ff ff ff
    70 n0:1 ff ff ff
    70 n0:100 ff ff ff
    70 n0:150 ff ff ff
    и то те которые меняются то есть что после n0: и до ff ff ff
    А ff ff ff это что строка передалась
     
  17. akl

    akl Гуру

    если перед каждой цифрой всегда идет "n0:", то в чем проблема находить в строке это "n0:" и применять функцию atoi() к тому что идет после?
     
  18. Адель

    Адель Нерд

    Код (C++):
    int Int1;
    String 1 ="34";
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    }

    void loop() {
    1 = Serial.read();
    Int1 = atoi(lol);
    Serial.println(Int1);
    }
    Вот так е работает.
     
  19. Asper Daffy

    Asper Daffy Иксперд

    Как? Вот так?
    Да, она у Вас не "е работает", а "ЁПРСТ... работает"!
     
  20. akl

    akl Гуру

    попробуй так

    Код (C++):
    int Int1;
    //длина приемного массива
    #define ARRLEN 32
    char arr[ARRLEN]; //приемный массив для строки
    char cmd1[]="n0:"; //строка-команда для сравнения
    char *arr_pt; //указатель на чар
    char str_ready = 0; //флаг готовности строки
    int i=0;//переменная-счетчик символов
    char error=0;
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }

    void loop() {
    //напихиваем в приемный массив все что приходит пока не
    //кончился массив или пока не пришел конец строки '\n'
      for ( ; i < ARRLEN && Serial.available(); i++) {
        arr[i] = Serial.read();
        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;
      }
    }
    кстати не факт что это заработает как надо, т.к. я не проверял и не особо шарю в си.
    но если изучить пару начальных глав учебника "керниган риччи язык си" то можно и самостоятельно запилить по красоте
     
    Последнее редактирование: 6 дек 2020
    Адель нравится это.