Считывание данных с SD карты.

Тема в разделе "Arduino & Shields", создана пользователем un1x, 26 май 2017.

  1. un1x

    un1x Нерд

    Здравствуйте имеется файл который хранит N строк, разделителем является символ ";".
    Пример файла:
    Код (Text):

    0.0031183;
    0.0031183;
    0.0031183;
    0.0031183;
    0.0031183;
    -0.0017693;
    -0.0066569;
    -0.0066569;
    -0.0017693;
    После того как я пытаюсь считать данные с SD получаю следующие:
    Код (Text):

    31183
    31183
    31183
    31183
    31183
    17693
    66569
    66569
    17693
     
    Что не получается:
    Считать знак и точку.
    Код программы:

    Код (C++):

    while (myFile.available())
        {
          char ch = myFile.read();
          if(ch == ';')
          {
            Serial.println(buff);
            buff = 0;
          }
          else if(ch >= 48 && ch <= 57)
          {
            buff *= 10;
            buff += ch - 48;
          }
        }
    Как я понимаю дело в таблице символ ASCII, но я не понимаю каким образом включить недостающие символы, в связи с этим и возник вопрос.
     
  2. Faberge

    Faberge Administrator Администратор

    Код (C++):
    while (myFile.available())
        {
          char ch = myFile.read();
          Serial.print(ch);
          if (ch == ';')
          {
            Serial.println();
          }
        }
     
     
    un1x нравится это.
  3. un1x

    un1x Нерд

    С помощью Serial.print(ch); я получаю строку, ее возможно как то преобразовать в float и записать в массив?
     
  4. Faberge

    Faberge Administrator Администратор

    Ну это вполне естественно, данные-то в вашем файле ведь представлены вероятнее всего в символьном виде. Ваши числа в файле - последовательности символов, вернее цифр, это и есть строка. Для преобразования в вещественное число используйте подобный код:
    Код (C++):
    char* buff = "-0.117";
    float fnum = atof(buff);
     
    un1x нравится это.
  5. un1x

    un1x Нерд

    а вот такая реализация считается плохим тоном?
    Код (C++):
    while (myFile.available())
        {
          char ch = myFile.read();
          data += (char)ch;
          if (ch == '\n') {
            Serial.println(data.toFloat(), 7);
            in += data.toFloat();
            data = "";
          }
        }
     
  6. AlexU

    AlexU Гуру

    В контексте AVR (с его малым объёмом памяти) -- скорее да, эта реализация считается плохим тоном.
    Класс String из комплекта Arduino IDE конечно удобен для работы со строками, но этот класс использует динамическое выделение/освобождение памяти. С этим классом нужно очень аккуратно работать.
     
    arkadyf и un1x нравится это.
  7. mcureenab

    mcureenab Гуру

    Добавить else if ( '.' == ch ) ...

    Но от точки нужно считать дробную часть. Т.е. нужен флаг, что дальше цифры доли десятых и считать их в другой аккумулятор а потом сложить.

    Все это имеет смысл, если нужно получить из строки число, а не скопировать её в Serial.
     
  8. rkit

    rkit Гуру

    Тон как тон, если производительность не критична.
    readStringUntil только, вместо ручного сложения
     
  9. Faberge

    Faberge Administrator Администратор

    Мое мнение, для данной задачи это как из пушки по воробьям стрелять. А потом выясняется, что не хватает скорости/объема памяти.