Arduino + Ethernet shield. Прочитать из файла информацию построчно.

Тема в разделе "Arduino & Shields", создана пользователем tgwt, 29 июн 2016.

  1. tgwt

    tgwt Нерд

    Всем доброго времени суток! Прошу помочь, кто понимает, я просто не соображаю немного(много инфы в голове: диплом, все такое, совсем голова забита). Есть файл на сд-карте. Он пополняется при ошибке отправки на сервер определенными строками. Заполнить это не проблема. Но мне еще надо построчно с файла прочитать. Т.к. файл может быть достаточно большим, то мне придется работать без использования переменных, что не подходит, т.к. нереализуемо в моем случае. Остается вариант просто считывать строку с файла в переменную, отправлять, и, в случае успешной отправки удалить эту строку из файла и перейти на следующую, но я не понимаю как это реализовать. Еще раз прошу помощи тех, кто понимает что делать. И прошу прощения, если изложил непонятно. Заранее благодарю за помощь.
     
  2. obuhanoe

    obuhanoe Гик

    Добрый день!
    Отправка данных на сервер через GET-запрос? Ну тогда есть ограничение в количестве символов.
    У меня если отправлять данные до 1 кБ - все ок, а если больше ошибка.
    Отправка производится с помощью GRPS-модуля.
     
  3. tgwt

    tgwt Нерд

    Отправка POST-запросом. Да и там не такие большие данные. С этим проблем нет. Проблема именно в том, что не могу прочитать из файла строку, но уже наткнулся на форум, там почти моя проблема решена. Сейчас попробую.
     
  4. tgwt

    tgwt Нерд

    Вот код примерный с того форума, но проблему не решает. Может что не так написал. Если кто сможет помочь, буду благодарен.

    Код (C++):
    #include <dvssdcard.h>
    #include <SD.h>

    void setup() {
      Serial.begin(9600);
      sdcard.InitializeCard();
      delay(100);
      Serial.println("HARDBASS");
    }

    void loop() {
      Serial.println("HARDBASS1");
      File myFile = SD.open("123.txt");
      delay(100);
      Serial.println("HARDBASS2");
      String *stringi;
      delay(100);
      Serial.println("HARDBASS3");
      char **stroki;
      delay(100);
      Serial.println("HARDBASS4");
      int st_len = 0;
      delay(100);
      Serial.println("HARDBASS5");
      if (myFile)
      {
        int st = 0, ch = 0;
        while (myFile.available())
        {
          delay(100);
          Serial.println("hardbass1");
          delay(100);
          char buff = myFile.read();
          Serial.println("hardbass2");
          delay(100);
          stroki[st][ch] = buff;
          Serial.println("hardbass3");
          delay(100);
          if (buff == ';') // разделитель строки
          {
            stroki[st][ch] = 0;
            Serial.println("hardbass4");
            delay(100);
            st++;
            Serial.println("hardbass5");
            delay(100);
            st_len++;
            Serial.println("hardbass6");
            delay(100);
            ch = 0;
            Serial.println("hardbass7");
            delay(100);
          }
          else ch++;
          Serial.println("hardbass8");
          delay(100);
        }
        myFile.close();
        Serial.println("HARDBASS6");
        delay(100);
      }
      Serial.println("HARDBASS7");
      delay(100);
      for (int i = 0; i < st_len; i++)
      {
        for (int j = 0; stroki[i][j] != '\0'; j++)
        {
          stringi[i] += stroki[i][j];
        }
      }

      for (int i = 0; i < st_len; i++)
      {
        Serial.println(stringi[i]);
      }

    }
    Хардбасс для отладки:D
     
  5. Vetrinus

    Vetrinus Гик

    Чем вас не устраивает находить конец строки по символам переноса каретки \r\n?
    Читаете файл до переноса строки. Пишете в буфер. Буфер отправляете. Как удалять строки я вам подсказать не смогу, т.к. сам не знаю. Но это можно обойти. Попробуйте завести переменную счетчик количества отправленных строк. И от нее пляшите
     
    Последнее редактирование: 29 июн 2016
  6. tgwt

    tgwt Нерд

    Просто про символ переноса каретки по-другому думал. Буду пробовать как вы сказали.
     
  7. tgwt

    tgwt Нерд

    Все равно ничего не получается в сериал порт вывод такой:
    upload_2016-6-30_12-47-47.png
    и все время повторяется это:
    upload_2016-6-30_12-49-11.png
     
  8. tgwt

    tgwt Нерд

    Вот сделал примерный набросок, все работает. Осталось только либо удалить из файла эти строки, либо придумать что получше, но я пока не могу догнать как и что лучше будет сделать. Прошу помощи.
    Код (C++):
    #include <dvssdcard.h>
    #include <SD.h>

    void setup() {
      Serial.begin(9600);
      sdcard.InitializeCard();
      delay(100);
      Serial.println("HARDBASS");

      Serial.println("HARDBASS1");
      File myFile = SD.open("123.txt");
      Serial.println("HARDBASS2");
      String dataString[100];
      for (int i = 0; i < 100; i++)
      {
        dataString[i] = "";
      }
      int itr = 0;
      Serial.println("HARDBASS3");
      if (myFile)
      {
        while (myFile.available())
        {
          Serial.println("hardbass1");

          char buf = myFile.read();
          if (buf == '\n' || buf == '\r')
          {
            if (dataString[itr] != "")
            {
              itr++;
              Serial.println("hardbass2");
            }
          }
          else
          {
            dataString[itr] += buf;
            Serial.println("hardbass3");
          }
        }
      }
      Serial.println("HARDBASS4");
      for (int i = 0; i < 100; i++)
      {
        if (dataString[i] != "")
          Serial.println(dataString[i]);
      }
    }
    void loop() {

    }
     
     
  9. Vetrinus

    Vetrinus Гик

    Я запутался в этих ваших хардбассах вашем отладочном выводе. Я уже выше говорил. Заведите счетчик, в котором будет хранится количество считанных строк. Потом как надо будет считать новую строку, ищете столько символов переноса строки, сколько у вас в счетчике. Как прочитали нужное, счетчик инкрементировали.
     
  10. tgwt

    tgwt Нерд

    Я уже сделал все, но к сожалению, сейчас не могу выложить код. Использую методы position() и seek() и все работает отлично. Завтра могу скинуть сюда код, если надо.