Pages: [1] 2   Go Down
Author Topic: leggere file .csv da sd card  (Read 2949 times)
0 Members and 1 Guest are viewing this topic.
torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, è da un po' che non traffico con la libreria sd card.
Mi chiedevo se fosse semplice leggere un file csv, una riga dopo l'altra, come farebbe processing quando invia i file ad arduino, e poi vengono divisi con serial.parseInt.
Gli esempi che ho trovato nella libreria sono su file .txt e non c'era molto "parsing".
Vi ringrazio.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

i metodi base ti consentono di aprire un file e di leggerlo carattere per carattere.
dovresti quindi:

- leggere il carattere e salvartelo in un char[]
- se il carattere è ; hai finito di leggere il campo attuale
- se il carattere è \n (o \r\n se il file è DOS) hai finito di leggere la riga
Logged

lucadentella.it

torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti ringrazio, mi sembra fattibile.
Il metodo parseInt su arduino è applicabile solo alla seriale quindi?
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2319
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
molte librerie per SD ti permettono di aprire un file e leggerlo riga per riga.
Per ogni riga, con la funzione strtok_r ne fai il parse in una sequenza di token, separati da un carattere (nel tuo caso ";")
Quindi riesci ad ottenere in modo veloce i vari valori.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

parseInt è un metodo applicabile ad ogni oggetto Stream:
http://arduino.cc/en/Reference/StreamParseInt

SdFile però non è di tale tipo.
Logged

lucadentella.it

torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
molte librerie per SD ti permettono di aprire un file e leggerlo riga per riga.
Per ogni riga, con la funzione strtok_r ne fai il parse in una sequenza di token, separati da un carattere (nel tuo caso ";")
Quindi riesci ad ottenere in modo veloce i vari valori.

Quindi ci sono altre librerie oltre la SD ufficiale?
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2319
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Quindi ci sono altre librerie oltre la SD ufficiale?

 smiley-yell tu quale stai usando?
Logged

torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gli esempi che ho guardato sono quelli compresi nell'IDE.
http://arduino.cc/en/Reference/SD
Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usa la fscanf!

esempio se vuoi leggere un intero, poi un float e poi una stringa

int i;
float f;
char s[10];
scanf("%d %f %s", &i, &f, s);
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dove il numero di caratteri preceduto da "%" è il numero di variabili che ci si aspetta per riga e che vanno a modificare le variaili precedute da "&"?
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3478
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Più che riga per riga viene letto un byte alla volta, poi quello cha fa la libreria o lo sketch col parsing è un altro discorso.
il buffer che ottieni dalla SD non è diverso da quello della ethernet shield, dalla seriale, da un hard disk, da un cdrom.
tutto dipende dall' archiaviazione dei dati sul supporto, più semplice sarà il criterio di scrittura, più semplice e veloce sarà il recupero.
Ci lavoro da un anno con archivi di dati su SD che tipo di dati vuoi estrarre dal file?  o meglio come sono composte queste linee? quanti dati ci sono su una linea prima di incontrare  "/n"

ciao
« Last Edit: January 09, 2013, 09:03:21 am by pablos » Logged

no comment

torino, italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Per esempio un csv con linee composte da quattro variabili.
Per esempio:
1,0,11500,6430
1,0,11550,6435
1,0,20000,6700
Mi servirebbe per una specie di cnc, in modo da archiviare una specie di gcode semplificato, in realtà un csv, sulla sd card invece di riceverlo da processing via seriale.
Per non impiegare ad ogni costo un computer.
Ogni riga conterrebbe delle coordinate e dei comandi, espressi comunque da numeri predefiniti in certi campi.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3478
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ho capito, tu cosa hai di già fatto per leggere i char del file da SD?
hai qualcosa o ti manca tutto?

inoltre i dati che devi prelevare ti servono sequenziali o ti servono dei salti all'interno del file?
in caso ti servissero dei salti dovresti far numerare le righe dal programma che genera il file

se mi dai queste info ti faccio un esempio veloce già fatto
« Last Edit: January 09, 2013, 12:19:14 pm by pablos » Logged

no comment

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3478
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dovresti fare una cosa simile se hai già la parte che ti inizializza la sd, controllo errori ecc

Code:
void read_sd_config()
{
  String ReadLine;
  char charBuf[40];
    
  if(file.open(&root, "file.csv", O_READ))  
  {
   int16_t c;
       while ((c = file.read())>0)
       {
         ReadLine += (char)c;        
           if((char)c=='\n')
           {                
                 //--------------------------------------- LETTURA LINEE FILE-------------------------------                          
                 Serial.print(ReadLine);//debug                
                 //-----------------------------------------------------------------------------------------  
                            
                ReadLine.toCharArray(charBuf, 40);                        
                get_data(charBuf);    
                 ReadLine="";
           }         
       }
   }

    else
    {
       Serial << F("File inesistente o errore SD ");            
    }      
}

void get_data(char *charBuffer)
{  
  int temp_dato[]= {0,0,0,0}; //<<<<< (int) se usi numeri oltre il 255 altrimenti byte
  char *p = charBuffer;  
  byte i = 0;

  while (*p != '\0')
  {
    if (*p == ',') { ++i;  ++p;  continue;} // separatore usa quello che ti pare
    if (isdigit(*p)) //questo controlla che siano solo numeri, se c'e' una lettera o uno spazio vuoto la salta
    {
         temp_dato[i] *= 10;
         temp_dato[i] += (*p - '0');            
    }    
    ++p;
  }  
    
//--------------------test di lettura dell'array verifica se e' corretta la scrittura
  for (byte ii = 0; ii < 4; ii++)
  {
      Serial.println((String)temp_dato[ii]+" ");//debug
  }
//---------------------------------------------------------------------
}

Per leggere l'ultima riga io di solito piazzo un EOF (end of file) alla fine, altrimenti non trova l'ultimo /n
Il char buffer l'ho impostato a 40, se la tua riga supera tale valore aumentalo, ma non esagerare

ciao
« Last Edit: January 09, 2013, 12:59:52 pm by pablos » Logged

no comment

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dove il numero di caratteri preceduto da "%" è il numero di variabili che ci si aspetta per riga e che vanno a modificare le variaili precedute da "&"?


il carattere che segue il % vuol dire il tipo di dato che vuoi leggere. %d è un intero con segno, %f un float. sono gli stessi identici che usa il printf: Insomma la spataffiata di codice di pablos in realtà esiste già smiley http://www.cplusplus.com/reference/cstdio/printf/

Quote
vanno a modificare le variaili precedute da "&"?

esatto, la & commerciale usa l'indirizzo della variabile. Notare che l'array non ha bisogno di & in quanto se usato senza [] allora è già un indirizzo
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2   Go Up
Jump to: