SD карта, запись, чтение, сравнение

Тема в разделе "Закажу проект", создана пользователем U-Alexey, 6 июн 2016.

Метки:
?

Это сложное задание?

  1. Да

    0 голосов
    0,0%
  2. Нет

    4 голосов
    100,0%
  1. U-Alexey

    U-Alexey Нуб

    Добрый день.
    Нужен программный код для arduino.
    Идея такова:
    1) Подключаем SD карту;
    2) Все вводимые данные с монитор порта записываем на SD карту в файл test.csv
    Главное условие, что бы каждые вводимые данные сохранялись на новой строке.
    3) Считываем полученные данные и вносим их в массив (например).
    4) Вводимые данные с монитор порта постоянно сверяем с данными в файле test.csv.
    Типа такая строка записывалась ранее.
    Прошу подсказать и помочь, как можно это реализовать, хотя бы какой либо из пунктов 2-4.
     
  2. Gippopotam

    Gippopotam Нерд

    Посмотрите примеры из стандартной библиотеки SD, там все понятно
     
  3. Vetrinus

    Vetrinus Гик

    Так просите подсказать, или просите реализацию?
     
  4. U-Alexey

    U-Alexey Нуб

    Можно подсказать и реализовать. Стоимость назовите пожалуйста.
     
  5. tgwt

    tgwt Нерд

    могу и подсказать и реализовать, но непонятен 3 пункт. зачем он?
     
  6. Gippopotam

    Gippopotam Нерд

    А как иначе вы планируете сравнивать масиивы информации?
     
  7. tgwt

    tgwt Нерд

    Можно ведь и потоками. Можно выводить в порт по строке и сравнивать. Можно просто вывести все в порт и парсить по строке. Способов куча.
     
  8. tgwt

    tgwt Нерд

    Вот код. Проверку на ошибки прошел, значит, должен работать.

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

    File myFile;
    SimpleList<String> myList;

    void setup()
    {
      Serial.begin(57600);
      if (!SD.begin(4))
      {
        Serial.println("Crd failed or not present!");
      }
      else
      {
        Serial.println("Card initialized");
      }
    }


    void loop()
    {
      String content = "";
      char character;
      while (Serial.available())
      {
        character = Serial.read();
        content.concat(character);
        delay(10);
      }

      if (content != "")
      {
        for (SimpleList<String>::iterator itr = myList.begin(); itr != myList.end(); itr++)
        {
          if(*itr == content)
          {
            Serial.println("Repeated string");
            break;
          }
          else
          {
            myFile = SD.open("test.txt");
            myFile.println(content);
            myList.push_back(content);
            myFile.close();
          }
        }
      }
    }
     
    U-Alexey нравится это.
  9. tgwt

    tgwt Нерд

    Если хочешь, можешь скинуть на пивис, сколько не жалко:D. В лс.
     
  10. U-Alexey

    U-Alexey Нуб

    )))
    Привет! За помощь большое спасибо, но выдает ошибку? нет библиотеки "SimpleList.h".
    Внести данные с монитор порта получилось сделать с помощью Serial.readBytes, ограничены символы, меня в принципе это устраивает.
    Теперь осталось сделать сравнение вновь введенных данных с порта с данными на карте. Можешь подсказать, где копать? С меня на пивас )))
    Код (C++):
    #include <SD.h> //Библиотека SD карты
    int CSpin = 4;
    File myFile; // файл
    char incomingBytes[8]; //Новый идентификатор 7-и значный


    void setup() {
      // инициализация последовательного порта
      Serial.begin(9600);
      Serial.println("Soedinenie gotovo");
      pinMode(CSpin, OUTPUT); // SD пин выход
      // Проверка SD карты
       if(!SD.begin(CSpin))
      {
        Serial.print("Karta ne dostupna");
        return;
        }
        Serial.println("Karta gotova");
    }

    void loop() {

    if (Serial.available() > 0) {
       int newid;
        newid = Serial.read();
        // Вызов функции записи на SD карту
        if (newid == 'H') {
         zapis();
        }
        // Вызов функции чтения
         else if (newid == 'L') {
         chtenie();
        }
      }
    }

    // Запись на SD карту
    void zapis(){
        Serial.println("K zapisi gotov");
        while (!Serial.available()) {
         if (Serial.available()>0){
            Serial.readBytes(incomingBytes, 7);
            Serial.println(incomingBytes);
              myFile = SD.open("baza.csv", FILE_WRITE);
              if(myFile)
              {
                  myFile.println(incomingBytes);
                  myFile.close();
                  Serial.println("Identifikator dobavlen");
                  return;
                }
                else
                {
                  Serial.println("Net vozmojnosti otkryt kartu");
                  return;
                  }
         }
       }
      }
    // считываем все данные из файла baza.csv:
    void chtenie(){
      myFile = SD.open("baza.csv");
      if (myFile) {
      while (myFile.available()) {
      Serial.write(myFile.read());
      }
      // закрываем файл:
      myFile.close();
      } else {
      // если файл не открылся, отображаем сообщение об ошибке:
      Serial.println("Oshibka baza.csv");
      }
    }
     
  11. tgwt

    tgwt Нерд

    Все что я написал хватит для твоей задачи. Библиотеку для SimpleList можно скачать здесь: https://codebender.cc/library/SimpleList#SimpleList.h. С установкой библиотек, думаю проблем не должно быть. Но я на гитхабе скачивал: https://github.com/Phillaf/Arduino-SimpleList, они все равно одинаковые. Тебе не обязательно именно с флешки читать, чтобы проверить есть такая строка или нет. Если тебе все таки надо именно так, как у тебя, то могу посмотреть.
     
  12. tgwt

    tgwt Нерд

    Отпишись, если получилось, или если нужно все-таки переделать под чтение с sd карты.
     
  13. U-Alexey

    U-Alexey Нуб


    Установил библиотеку, Спасибо! Код откомпилировался, загрузил на Arduino. Карту видит, но при вводе данных в монитор порта ничего не происходит, даже файл на карте не создается. ((( Посмотри пожалуйста как в моем коде можно реализовать сравнение введенных данных с данными из файла.
     
  14. tgwt

    tgwt Нерд

    А в твоем коде создается файл?
     
  15. tgwt

    tgwt Нерд

    По идее, когда создаешь файл и пишешь в него, он должен создаваться.
     
  16. tgwt

    tgwt Нерд

    Вообще, тебе надо вызывать функцию чтения с файла из функции записи, когда выбираешь записать или нет(ну если есть или нет файла на флешке)

    Вот так примерно:
    Код (C++):
    void zapis(){
        Serial.println("K zapisi gotov");
        while (!Serial.available()) {
         if (Serial.available()>0){
            Serial.readBytes(incomingBytes, 7);
            Serial.println(incomingBytes);
              myFile = SD.open("baza.csv", FILE_WRITE);
              if(myFile)
              {
                 if(!chtenie())//тут типа в функции чтения считываешь все строки в массив строк и проверяешь есть ли там такая строка
                 {
                    myFile.println(incomingBytes);
                    myFile.close();
                    Serial.println("Identifikator dobavlen");
                    return;
                  }
                }
                else
                {
                  Serial.println("Net vozmojnosti otkryt kartu");
                  return;
                  }
         }
       }
      }
     
  17. tgwt

    tgwt Нерд

    Если проблемы будут с занесением в массив строк, то попробуй распарсить. Я уже сегодня не могу тебе помочь(предзащита завтра). Завтра могу помочь, если не будет получаться.
     
  18. U-Alexey

    U-Alexey Нуб

    Спасибо, по итогу отпишусь.
     
  19. tgwt

    tgwt Нерд

    Попробуй добавить в мой код атрибут FILE_WRITE там, где SD.open. Возможно поэтому не создавался файл.
     
  20. U-Alexey

    U-Alexey Нуб

    Не не помогла ( Все сижу капаюсь с кодом, никак пока не получается сравнение сделать (