Go Down

Topic: lista file con sdfat (Read 908 times) previous topic - next topic

2aza

Salve a tutti ho un piccolo problema con una funzione di sdfat nello specifico printName() ho provato ad attribuirla a una stringa, questa immagazzina correttamente il nome del file ma in più aggiunge un valore numerico.

Esempio:
File.txt8
File2.raw12

Perche?
Come posso risolvere?

Grazie in anticipo...

Code: [Select]
#include <SPI.h>
#include <SdFat.h>
SdFat sd;
SdFile file;
String prova;

void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  sd.begin(SPI_HALF_SPEED);

  while (file.openNext(sd.vwd(), O_READ))  {
    prova =  file.printName();
    Serial.println(prova);
    file.close();
  }
}

gpb01

La libreria ufficiale Arduino è la SD ... quindi metti un link a questa SdFat così possiamo capire di cosa parli ...

Guglielmo
Search is Your friend ... or I am Your enemy !

2aza


gpb01

Per curiosità, dato che non la conosco, quali sono i vantaggi nell'usare tale libreria (... che, tra l'altro, mi sembra, ancora in uno stato di debug, vista la fase con cui inizia il readme.txt ... "This is a major rewrite of core FAT code so bugs and compatibility problems are likely.") al posto di quella standard di Arduino?

Guglielmo
Search is Your friend ... or I am Your enemy !

2aza

La utilizzo insieme a utft per aprire dei file raw da sd e a quanto pare si può fare solo con questa lib...

nid69ita

#5
Feb 14, 2016, 11:48 am Last Edit: Feb 14, 2016, 11:51 am by nid69ita
E se scrivi da così
Code: [Select]
file.printName();
Serial.println(prova);


a cosi, bypassando la String ?
Code: [Select]
Serial.println(file.printName());

 Sul sito di UTFT suggeriscono la leggera UTFT_tinyFAT, perchè usi quella libreria al link e non quella standard o quella suggerita da UTFT ?
http://www.rinkydinkelectronics.com/library.php?id=53
my name is IGOR, not AIGOR

gpb01

#6
Feb 14, 2016, 11:51 am Last Edit: Feb 14, 2016, 11:52 am by gpb01
La utilizzo insieme a utft per aprire dei file raw da sd e a quanto pare si può fare solo con questa lib...
... non mi pare che la SD entri nel merito del contenuto dei files ... l'hai provata ? Che problemi ti ha dato ?

Guglielmo
Search is Your friend ... or I am Your enemy !

2aza

#7
Feb 14, 2016, 01:55 pm Last Edit: Feb 14, 2016, 02:02 pm by 2aza
E se scrivi da così
Code: [Select]
file.printName();
Serial.println(prova);


a cosi, bypassando la String ?
Code: [Select]
Serial.println(file.printName());

 Sul sito di UTFT suggeriscono la leggera UTFT_tinyFAT, perchè usi quella libreria al link e non quella standard o quella suggerita da UTFT ?
http://www.rinkydinkelectronics.com/library.php?id=53
Mi serve necessariamente dentro una stringa per poterla stampare con utft ed utilizzarla per dei confronti.
Non utilizzo tinyFAT perché non compatibile con arduino due...
... non mi pare che la SD entri nel merito del contenuto dei files ... l'hai provata ? Che problemi ti ha dato ?

Guglielmo
Ho visto che tutti utilizzano questa perché più performante... Non so altro... In effetti funziona bene e comunque ha delle funzioni interessanti che potrebbero tornarmi utili....



Ho capito che il numero che aggiunge dopo il nome si riferisce al numero caratteri...

File.txt8
File2.raw9

nid69ita

#8
Feb 14, 2016, 02:43 pm Last Edit: Feb 14, 2016, 03:01 pm by nid69ita
Mi serve necessariamente dentro una stringa per poterla stampare con utft ed utilizzarla per dei confronti.
Ti ho chiesto una prova, mica di cambiare tutto !!
Ho il dubbio che quella funzione NON lavori con le String ma solo con le stringhe (che sono un'altra cosa)

Allora, mi pare di aver capito. Usai male quel comando. Quella funzione ritorna size_t ovvero il numero di caratteri del nome file. Poi però internamente pare usi Stream base class per darti il nome. Non mi è chiaro come usarla, negli esempi c'e' questo:
Code: [Select]
Serial.print(n++);
Serial.write(' ');
file.printName(&Serial);
Serial.println();

Quindi il nome della funzione dice tutto. Questa STAMPA come una .print()
Code: [Select]
size_t printName() {  return FatFile::printName(&Serial); }
   /** Print a file's size.
   * \param[in] pr Print stream for output.
   * \return The number of characters printed is returned for success and zero is returned for failure.
   */


Credo tu debba usare getName()
Code: [Select]
bool getName(char* name, size_t size);
  /**
   * Get a file's Short File Name followed by a zero byte.
   * \param[out] name An array of characters for the file's name. The array must be at least 13 bytes long.
   * \return The value true, is returned for success and
   * the value false, is returned for failure.
   */  


credo così:
Code: [Select]
char buf[13];
...
file.getName(buf);
Serial.println(buf);
prova=buf;    //spero che la classe String faccia il cast
Serial.println(prova);
...


my name is IGOR, not AIGOR

2aza

#9
Feb 14, 2016, 03:15 pm Last Edit: Feb 14, 2016, 04:09 pm by 2aza
proverò a seguire la tua dritta, nel frattempo facevo un po' di prove e ho risolto cosi ma non so il perché...
Code: [Select]
#include <SPI.h>
#include <SdFat.h>
SdFat sd;
SdFile file;
String prova;
String prova2;
int contatore;
void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  sd.begin(SPI_HALF_SPEED);

  while (file.openNext(sd.vwd(), O_READ))  {
    prova =  file.printName();
    contatore = prova.length();
    prova.substring(0, contatore - 1) = "";//nomi minori di 10 caratteri
    prova.substring(0, contatore - 2) = "";//nomi maggiori di 10 caratteri
    Serial.println(prova2);
    file.close();
  }
}

void loop() {}


Cosa ho fatto?



Ho capito, niente qualsiasi cosa stampo in seriale mi da il nome file...

nid69ita

Non sò come scrivertelo; quel comando (e lo dice bene anche il suo nome)  STAMPA su seriale SEMPRE
file.printName();   non per nulla si chiama print qualcosa
my name is IGOR, not AIGOR

Go Up