• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Karta sd i szukanie w pliku
#1
Witam.
Czy zna ktos dobry sposob na porownanie Stringa z danymi na karcie sd (plik txt)?
Mam w pliku txt zapisane dane z numerem telefonu, potrzebuje zrobic funkcje szukajaca danego numeru.Jesli jest na karcie, najlepiej niech zwroci pozycje lub numer + 10 znakow przed i po numerze (do tego numeru przypisane mam nazwy).
Takie cos juz mi pomoze wyluskac nazwe.

Szukam jakiejs gotowej funkcji, ale cos nie moge znalesc, chyba ze trzeba niestety zapisac czesc pliku do bufora i porownywac.
Ma ktos jakis pomysl?

Wysłane z mojego SM-G950F przy użyciu Tapatalka
 
Odpowiedź
#2
Oczywiście, że trzeba odczytać np. linijkę tekstu i dalej się bawić funkcjami C do tablic char lub funkcjami Arduino do string https://www.arduino.cc/reference/en/lang...ingobject/. Co do zasady, nieważne gdzie masz dane, by je analizować musisz je pobrać do RAM.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Hej.
Wlasnie z tym sie borykam.
Odczytanie calego pliku to nie problem, tak samo wczytanie do ram.
Raczej chodzi mi o jakas funkcje lub przyklad, jak mozna odczytac np 30 bajtow z zapamietaniem pozycji.
Find() lub inna funkcja zwracajaca?


Wysłane z mojego SM-G950F przy użyciu Tapatalka
 
Odpowiedź
#4
(30-10-2018, 09:02)wchpikus napisał(a): Raczej chodzi mi o jakas funkcje lub przyklad, jak mozna odczytac np 30 bajtow z zapamietaniem pozycji.
Find() lub inna funkcja zwracajaca?

FatFS ma funkcję seek, ta umożliwia odczyt od wybranej pozycji. Funkcja read pozwala odczytać dowlna liczbę bajtów, nie koniecznie cały plik.
Kod:
   f_lseek( &plik, ptr_odczytu );
   FRESULT fresult_read = f_read( &plik, bufor_sd, bajtow_do_odczytu, &odczytanychBajtow );
Wszystko to znajdziesz w opisie FatFS http://elm-chan.org/fsw/ff/00index_e.html Poczytaj dokładnie o FatFS, wiele zależy od od jego konfiguracji.

Pamiętaj też, że odczyt z karty SD ma pewne wymagania co do szybkości interfejsu i zapotrzebowania na RAM. Na 2kb RAM (pewnie używasz UNO) to niewiele zrobisz, pewnie nawet nie da się równocześnie otworzyć kilku plików. Szybkość (w przypadku AVR wolność) SPI nie ułatwia sprawy,w dodatku tylko 1-bit a brak DMA dobija (nie tylko w przypadku RAM).
FATem na AVR możesz się pobawić ale coś sensownego to zrobisz tylko na Xmega cz lepiej ARM.
Próbowałem FAT na różnych platformach, jakość działania od najgorszego:
AVR
ARM, VNC-2
RaspberryPi
 
Odpowiedź
#5
Robie to na esp8622, wiec spoko.


Wysłane z mojego SM-G950F przy użyciu Tapatalka
 
Odpowiedź
#6
(30-10-2018, 10:28)wchpikus napisał(a): Robie to na esp8622, wiec spoko.

Na ESP FAT nie robiłem.Jak podłączyłeś kartę? Przez SPI? No to poczytaj o ograniczeniach SPI w ESP8266 (8622 nie znam) albo lepiej przeprowadź pomiary prędkości z jaką czyta pliki. Używasz funkcji blokujących?
 
Odpowiedź
#7
Hej
Karta jest podłączona przez spi i taki moduł:
https://www.elementzonline.com/microsd-c...pi-arduino
Predkosci nie sprawdzalem, ale widze ze da sie to ustawic:

***************************************************************
boolean SDClass::begin(uint8_t csPin, uint32_t speed) {
/*

Performs the initialisation required by the sdfatlib library.

Return true if initialization succeeds, false otherwise.

*/
return card.init(speed, csPin) &&
volume.init(card) &&
root.openRoot(volume);
}
*******************************************************************

i tutaj:

*******************************************************************
void SPIClass::beginTransaction(SPISettings settings) {
while(SPI1CMD & SPIBUSY) {}
setFrequency(settings._clock);
setBitOrder(settings._bitOrder);
setDataMode(settings._dataMode);
}
********************************************************************
Spróbuje ustawić SPI_CLOCK i zobaczymy na jakich będzie działał..

Musze poszukać jak to sprawdzić, jak szybka jest transmisja.

Co do funkcji blokujących to nie problem, nie ma takich (a jak są to się zrobi tak by nie było).
Na spi wisi tez oled, ale można w czasie obsługi sd go wyłączyć.
 
Odpowiedź
#8
Niepotrzebnie wydałeś kasę na moduł, który ma konwerter 5-3.3V. Wystarczy moduł z gniazdem i złączem za kilka złotych albo gniazdo za 1..2zł, do którego dolutujesz kabelki .

Co do prędkości, to trybu 4-bit i tak nie osiągniesz ale to ma znaczenie przy transmisji dużej ilości danych. W trybie 1-bit,z pewnością, ESP będzie kilka czy kilkanaście razy szybszy od AVR. Buforowanie itp to już ustawienia FAT, robi to się przez modyfikację odpowiednich definicji. Opis znajdziesz w linku, który dałem w poprzedniej wypowiedzi.

Co do funkcji blokujących,to chyba nie wiesz o czym piszę.
 
Odpowiedź
#9
Pytasz czy nie mam nic w przerwaniu..nie nie mam. (timer działa, ale nie blokuje i nie wywołuje nic więcej).
Tak wiec przy obsłudze karty nie będzie nic co nie wskoczy w trakcie obsługi karty.
A kasy nie wydałem, na ali kosztuje to śmieszne pieniądze, $ 0.47Smile
 
Odpowiedź
#10
(30-10-2018, 11:25)wchpikus napisał(a): Pytasz czy nie mam nic w przerwaniu..nie nie mam. (timer działa, ale nie blokuje i nie wywołuje nic więcej).

Chodzi o równoczesną obsługę pliku (np pliku dźwiękowego) i innych peryferii (np termometru, wyświetlacza LCD, itp).
W AVR, jak wywołasz operację na pliku, np czytanie, to program główny jest zablokowany. W ARM, można uzyć DMA, gdy dane są czytane do bufora przez DMA program główny może działać. Gdy bufor się zapełni, program główny albo przerwanie może kazać czytać kolejny blok.
W AVR nie ma DMA więc pozamiatane.
ESP, ma RTOS i da się uzyskać wielozadaniowość ale raczej nie z poziomu Arduino IDE chyba, że znasz na to sposób.
W ARM, trzeba trochę zmodyfikować bibliotekę FatFS i bez RTOS, można obsługiwać plik i realizować inne zadania.
Dlatego, najwygodniej, obsługiwać FAT na Raspberry. Nic nie trzeba modyfikować. OS się wszystkim zajmuje.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości