Odczyt zmiennej z karty SD

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
hertzh1
Majsterkowicz
Posty: 62
Rejestracja: 29 sty 2014, 12:23

Odczyt zmiennej z karty SD

Post autor: hertzh1 » 12 lut 2014, 15:07

Witam

Mam problem z odczytem zmiennej (unsigned long int) z karty SD. Wiem, że prosty odczyt polega na przekazaniu textu, dlatego przypisanie go do zmiennej powoduje wyświetlenie zupełnie innej wartości. W moim wypadku dla testu używam pliku z wartością 123456789 (może raczej zapisanymi znakami), co przy praca = (myFile.read()); daje wartość praca == 57. Nie za bardzo wiem czym się posłużyć, czy wykorzystać jakoś opcję długości pliku size() poszukuję jakiegoś prostego rozwiązania. Wiem, że ten temat był już poruszany kilka razy na arduino.cc ale tam znalazłem tylko odpowiedzi dla znanej długości pliku a ja poszukuję dowolnej.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Odczyt zmiennej z karty SD

Post autor: Malen » 13 lut 2014, 23:22

Jest możliwość taka, ale skoro masz problem ze zbyt dużymi tablicami to należałoby zmniejszyć te tablice i podzielić dane odczytane z pliku na karcie SD na kilka fragmentów. Gdy skończysz pracę z danym partem danych to wczytaj kolejny.

Kod: Zaznacz cały

#include <SD.h>

int counter=0;
Kod: Zaznacz cały
File myFile;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
        if(counter == 10)
              break;
       counter++;
       Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
              Serial.println("error opening test.txt");
  }
}

void loop()
{
    // nothing happens after setup
}


Ten kod powinien wczytać ci z pliku pierwsze 10 znaków i wyświetlić w SerialMonitor. Nie miałem możliwości go przetestować.

Aby załadować do talbicy te 10 elementów możesz zrobić coś takiego.

Tworzysz globalnie tablice 10 elementowa;

szukasz w ciągu znaków przecinka ( do czasu gdy nie bedzie przecinka budujesz element tablicy )


Kod: Zaznacz cały

Kod: Zaznacz cały

if(myFile.read() != ',')

i tutaj tworzysz poszczególne elementy tablicy. Aby to zrobić bedziesz musiał skorzystać z rzutowania na int. Do indexowania tablicy użyj zmiennej counter.

Pozdrawiam.
hertzh1
Majsterkowicz
Posty: 62
Rejestracja: 29 sty 2014, 12:23

Re: Odczyt zmiennej z karty SD

Post autor: hertzh1 » 14 lut 2014, 11:48

dzięki za wskazanie drogi do rozwiązania, problem jest nie tyle z dużymi porcjami danych co z przetworzeniem odczytanych danych z pliku na LICZBĘ. Ponieważ nie mam teraz dostępu do komputera z kompilatorem nie mogę sprawdzić czy to rozwiązanie zadziała.
Domyślnie liczby mają być całkowite i każda zmienna w innym pliku, eliminuje to konieczność wyszukiwania. Zastanawia mnie czy mogę zdefiniować wielkość tablicy po odczytaniu wielkości pliku, tak żeby od razu załadować do niej cały plik, i przekształcić go na liczbę. Wiem, że powstanie niebezpieczeństwo że zbyt duży plik wywali program ze względu na zbyt dużą tablicę, ale można się zabezpieczyć że jeżeli plik jest zbyt duży żeby pomijać tą operację i sygnalizować błąd.
Domyślnie szukam rozwiązania na tyle łatwego żeby nadawało się na tutorial, bo wiele osób ma ten sam problem.
ODPOWIEDZ

Strony partnerskie: