SD модуль

Тема в разделе "Arduino & Shields", создана пользователем filay23, 19 апр 2015.

  1. filay23

    filay23 Нерд

    Подскажите пожалуйста, как с файла ,который находится на SD, cчитать текст в переменную char[]????
     
  2. geher

    geher Гуру

    Код (Text):

    File myFile = SD.open("config.txt", FILE_READ);
    if (myFile) {
        String aString="";    while (myFile.available()) {
             char c=myFile.read();
             aString+=c;
       }
    }
     
    Код (Text):

    //define MAX_STRING_LEN 255 было
    #define MAX_STRING_LEN 255 // стало
    File myFile = SD.open("config.txt", FILE_READ);
    if (myFile) {
        char aString[MAX_STRING_LEN];
        pos=0;
        while (myFile.available()) {
             char c=myFile.read();
             aString[pos]=c;
             pos++;
            //if (pos)>=MAX_STRING_LEN-1 было
            if (pos>=MAX_STRING_LEN-1) break; // стало
       }
       aString[pos] =0; //добавлем терминатор
    }
     
    Исправлено
     
    Последнее редактирование: 19 апр 2015
    filay23 нравится это.
  3. filay23

    filay23 Нерд

    Извините за глупый вопрос, я просто недавно знакома с Arduino, первую часть кода поняла немного,а со вторым туго.
    "aString[pos]=c;
    pos++;
    if (pos)>=MAX_STRING_LEN-1
    }
    aString[pos] =0; //добавлем терминатор
    }
    "???
     
  4. Unixon

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

    Код (Text):

    #define MAX_STRING_LEN 255
    char aString[MAX_STRING_LEN];

    File myFile = SD.open("config.txt", FILE_READ); // открыли файл
    if (myFile)
    {
     pos=0;
     while (myFile.available())
     {
      char c=myFile.read();
      aString[pos]=c;  // записали символ "c" в позицию "pos" строки "aString".
      pos++; // перешли к следующей позиции
      if ((pos)>=MAX_STRING_LEN-1) // если дошли до конца строки
      {
       break; // закончили читать строку, вышли из while
      }
     }
     aString[pos] =0; // поставили метку конца строки
     // ... // закрыли файл
    }
     
     
    filay23 нравится это.
  5. geher

    geher Гуру

    Точно. Меня прервали, и в результате ушел недописанный фрагмент кода. Дабы не возникало вопросов, дорисовал недостающее.
     
    filay23 нравится это.
  6. filay23

    filay23 Нерд

    в мониторинг порта через Serial.print( ); выводить нужно aString????
     
  7. geher

    geher Гуру

    В обоих вариантах вполне можно скормить в Serial.print() переменную aString.
    В первом случае это будет класс String. Во втором - классический массив элементов типа char.
    Serial.print() одинаково поймет и то, и другое.
     
    filay23 нравится это.
  8. filay23

    filay23 Нерд

    Спасибо большое буду пробовать!!!
     
  9. filay23

    filay23 Нерд

    Не весь файл выдает.( Через for выводить Serial.print???

    #define MAX_STRING_LEN 255
    char aString[MAX_STRING_LEN];

    File myFile = SD.open("config.txt", FILE_READ); // открыли файл
    if (myFile)
    {
    pos=0;
    while (myFile.available())
    {
    char c=myFile.read();
    aString[pos]=c; // записали символ "c" в позицию "pos" строки "aString".
    pos++; // перешли к следующей позиции
    if ((pos)>=MAX_STRING_LEN-1) // если дошли до конца строки
    {
    break; // закончили читать строку, вышли из while
    }
    }
    aString[pos] =0; // поставили метку конца строки
    // ... // закрыли файл
    }

    for (int j=0; j<6; j++)

    Serial.print(aString[j]);
     

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      26,7 КБ
      Просмотров:
      548
  10. Unixon

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

    Какого размера файл?
    Вам нужно его держать все время в памяти?

    Сейчас длина строки всего 255 символов (254+терминатор). Можно сделать больше, но не намного, т.к. у микроконтроллеров вообще мало оперативной памяти.
     
  11. filay23

    filay23 Нерд

    в данный момент размер не большой, но в дальнейшем нужен большой.Смысл в том что бы считать текст в char[] после сделать с ним преобразования и записать на sd другой файл но уже с координатами.
     
  12. filay23

    filay23 Нерд

    в данный момент в файле 6 символов.
     
  13. Unixon

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

    Тогда нужно обрабатывать текст по частям 1/4Kb~4Kb (смотря какой контроллер используется). Считали кусок - обработали - записали.
     
  14. filay23

    filay23 Нерд

    а где можно посмотреть пример такой реализации.??
     
  15. Unixon

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

    Было бы намного проще, если бы вы рассказали, какие у вас входные данные и как именно они должны обрабатываться.
     
  16. filay23

    filay23 Нерд

    Входные данные у меня текст (любой), далее мне нужно этот текст поместить в char[ ], после помещения его в массив он "переводится" в цифры и происходят математические операции.После полученные цифры записываем в файл на sd.Далее эти цифры считываем в переменную long[ ] производим математические вычисления, переводим обратно в текст и записываем в файл.(Алгоритм шифрования). Очень долго сидела над математической частью.А сейчас запуталась с чтением\записью (((
     
  17. Unixon

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

    Сколько вам данных нужно на одну итерацию алгоритма, перед тем как вы сможете записать результат? Насколько я понимаю, алгоритм потоковый и обрабатывает данные по-байтово. Если это так, то вам не нужно даже хранить всю строку, либо можно ограничиться любым небольшим буфером.
     
  18. filay23

    filay23 Нерд

    мне достаточно считывать по одному символу из файла производить операцию и записывать в другой файл.
     
  19. Unixon

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

    Ну тогда вам в самом простом варианте вообще никакой буфер не нужен.
    Код (Text):

    void initEncoder()
    {
    }

    byte encodeByte(byte x)
    {
    byte y = x;
    return y;
    }

    bool processFile(char *src_name, char *dst_name)
    {
    bool result = false;
    File src_file = SD.open(src_name, FILE_READ);
    if (src_file)
    {
      File dst_file = SD.open(dst_name, FILE_WRITE);
      if (dst_file)
      {
      initEncoder();
      while (src_file.available())
      {
      byte x = src_file.read();
      byte y = encodeByte(x);
      dst_file.write(y);
      }
      dst_file.close();
      result = true;
      }
      src_file.close();
    }
    return result;
    }
     
     
  20. filay23

    filay23 Нерд

    Спасибо большое за ответ буду пробовать!