Ethernet Shield + Arduino Mega 2560. Прочитать и изменить файл на SD карте.

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

  1. tgwt

    tgwt Нерд

    Всем доброго времени суток. Есть такая проблема: нужно реализовать чтение и изменение данных на SD карте не компилируя каждый раз скетч, просто залить HEX и чтобы все работало. Но данные для изменения чтобы хранились не в скетче, ибо данные могут быть большого размера, и ардуинка много в себя не вмещает. Может кто сталкивался с подобным или знает где можно найти/спросить. Просьба самых умных не предлагать гугл/яндекс/бинг и т.п. Также я поискал на форуме, но не нашел подобной темы. Если вдруг пропустил не серчайте, а подскажите. Заранее благодарю за помощь.
     
    Последнее редактирование: 21 май 2016
  2. tgwt

    tgwt Нерд

    Да, забыл добавить. Есть доступ только к проводу, который подключается к компьютеру. Доступа к самой arduino нет. Устройство работает по принципу "черный ящик". Естественно, если придется что то изменять в схеме устройства, то это можно сделать. Если придется что то другое вывести, то можно подумать.
     
  3. tgwt

    tgwt Нерд

    Пока есть вариант записывать через COM порт, он же Serial, но если вдруг кто лучше знает, не стесняйтесь.
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Попробуйте передавать файлы через FTP. Вот еще статья.
     
  5. tgwt

    tgwt Нерд

    Спасибо посмотрю сейчас.
     
  6. tgwt

    tgwt Нерд

    К сожалению, такие варианты не пойдут, ибо в том файле я храню конфигурацию, в том числе и адрес веб сервера, который развернут у меня на адуинке, но все равно спасибо. Буду пока копать в сторону ком порта, плюс там, оказывается, все очень просто.
     
  7. tgwt

    tgwt Нерд

    Все оказалось не так то просто, как мне нужно. Не могу считать строку байтов из сериала в строку.
     
  8. Vetrinus

    Vetrinus Гик

    Код (C++):

    int index=0;
    char buffer[];
    while (Serial.available()) {
    char c = Serial.read();
    buffer[index]=c;
    index++;
    }
    index=0;
     
     
    Последнее редактирование: 21 май 2016
  9. tgwt

    tgwt Нерд

    Уже нашел решение(немного лучше), но все равно спасибо:)
     
  10. Vetrinus

    Vetrinus Гик

    Покажите, если не сложно
     
  11. tgwt

    tgwt Нерд

    Код (C++):
    String content = "";
      char character;
      while (Serial.available())
      {
        character = Serial.read();
        content.concat(character);
        delay(10);
      }
      if (content != "") {
        Serial.println(content);
      }
     
  12. Vetrinus

    Vetrinus Гик

    По сути тоже самое, но с использованием класса String.
     
  13. tgwt

    tgwt Нерд

    Ну, в принципе, да
     
  14. tgwt

    tgwt Нерд

    Появилась идея передавать в порт строку типа [команда] [файл] [какой либо массив строк(если это запись в файл)]. Можете подсказать какие нибудь идеи? Пока у меня только идея делать все через splitToken. Типа вот когда записываем строку в порт, потом splitToken, он делит строку на массив строк, берем два первых управляющих слова из этого массива, а остальное циклом записываем, если это запись. Но я не знаю насколько хороша эта идея.
     
  15. Vetrinus

    Vetrinus Гик

    Сама по себе идея рабочая, я нигде, кроме экспериментов, не использовал, поэтому относительно плюсов и минусов подсказать не могу. Единственное, в плане реализации, вам нужно будет использовать не spliToken, а комбинацию из strtok и atoi. Ну и нужно будет выбрать специфичный символ разделитель, типо &.
    Строка будет вида info1&value_info1&info2&value_info2
    Ну или можно изменить, на ваше усмотрение.
    Вообще можно довольно много материала по работе со строками найти в сети.
    вот тут можете глянуть. Если тяжко будет, могу более менее рабочий пример показать из своей практики.
    http://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string
     
    tgwt нравится это.
  16. tgwt

    tgwt Нерд

    Спасибо, попробую.
     
  17. tgwt

    tgwt Нерд

    Вот че то попробовал. Код сыроватый, так что не стоит обращать внимание на его кривость. В общем, у меня не работает. Думаю, может подскажете чего, а то вдруг я не вижу.

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

    File myFile;

    String file = "";
    const String readFile = "readfile";
    const String deleteFile = "deletefile";
    const String beginWriteFile = "writefile";

    char *readCommand()
    {
      String content = "";
      char character;
      while (Serial.available())
      {
        character = Serial.read();
        content.concat(character);
        delay(10);
      }
      if (content != "") {
        Serial.println(content);
      }
      int str_len = content.length() + 1;
      char contentchar[str_len];
      content.toCharArray(contentchar, str_len);
      return contentchar;
    }

    void setup()
    {
      Serial.begin(9600);
      sdcard.InitializeCard();
    }

    void loop()
    {
      char *incomingByte = readCommand();
      String words[100];
      words[0] = strtok(incomingByte, "$");
      words[1] = strtok(NULL, "$");
      words[2] = strtok(NULL, "$");
      if (words[0] == readFile)
      {
        Serial.println("Reading file...");
        file = sdcard.readFileToEnd("CONFIG.xml");
        Serial.println(file);
        Serial.println("Done");
      }
      if (words[0] == deleteFile)
      {
        Serial.println("Deleting file...");
        sdcard.DeleteFile("CONFIG.xml");
      }
      if (words[0] == beginWriteFile)
      {
        Serial.println("Writing file...");
        sdcard.writeFileToEnd("CONFIG.xml", words[2]);
      }
    }
    P.S.: библиотека dvssdcard "кустарная", т.е. наша
     
  18. tgwt

    tgwt Нерд

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

    File myFile;

    String file = "";
    const String readFile = "readfile";
    const String deleteFile = "deletefile";
    const String beginWriteFile = "writefile";
    int str_len;

    void readCommand(char *dest)
    {
      String content = "";
      char character;
      while (Serial.available())
      {
        character = Serial.read();
        content.concat(character);
        delay(10);
      }
      if (content != "") {
        Serial.println(content);
      }
      str_len = content.length() + 1;
      char contentchar[str_len];
      content.toCharArray(dest, str_len);
    }

    void setup()
    {
      Serial.begin(9600);
      sdcard.InitializeCard();
    }

    void loop()
    {
      char incomingByte;
      readCommand(&incomingByte);
      String words[100];
      words[0] = strtok(&incomingByte, "$");
      words[1] = strtok(NULL, "$");
      words[2] = strtok(NULL, "$");
      if (words[0] == readFile)
      {
        Serial.println("Reading file...");
        file = sdcard.readFileToEnd("CONFIG.xml");
        Serial.println(file);
        Serial.println("Done");
      }
      if (words[0] == deleteFile)
      {
        Serial.println("Deleting file...");
        sdcard.DeleteFile("CONFIG.xml");
      }
      if (words[0] == beginWriteFile)
      {
        Serial.println("Writing file...");
        sdcard.writeFileToEnd("CONFIG.xml", words[2]);
      }
    }
     
  19. tgwt

    tgwt Нерд

    Допилил скетч, но он отказывается принимать второй параметр через символ "$".
    Код:
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    #include <SD.h>
    #include <dvssdcard.h>


    const String readFile = "readfile";
    const String deleteFile = "deletefile";
    const String beginWriteFile = "writefile";

    void readCommand(char *dest)
    {
      String content = "";
      char character;
      while (Serial.available())
      {
        character = Serial.read();
        content.concat(character);
        delay(10);
      }
      if (content != "")
      {
        Serial.println(content);
      }
      int str_len = content.length() + 1;
      char contentchar[str_len];
      content.toCharArray(dest, str_len);
    }

    void setup()
    {
      Serial.begin(9600);
      sdcard.InitializeCard();
    }

    void loop()
    {
      char incomingByte;
      readCommand(&incomingByte);
      String command = strtok(&incomingByte, "$");
      String destFile = strtok(NULL, "$");
      String toWrite = strtok(NULL, "$");
      if (command == readFile)
      {
        Serial.println("Reading file...");
        String file = sdcard.readFileToEnd(destFile);
        Serial.println(file);
        Serial.println("Done");
      }
      if (command == deleteFile)
      {
        Serial.println("Deleting file...");
        sdcard.DeleteFile(destFile);
      }
      if (command == beginWriteFile)
      {
        Serial.println("Writing file...");
        sdcard.writeFileToEnd(destFile, toWrite);
      }
    }
     
  20. aleksis-76

    aleksis-76 Нерд