Conversioni

di default se atoi() fallisce perché il char array non è un numero valido, restituisce 0:

If no valid conversion could be performed, a zero value is returned.
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Vedo di rompere per l'ultima volta

  if (dataFile) {
    while (dataFile.available()) {
      x = (dataFile.read());
      Serial.print(char(x)); // Stampa il carattere e non il codice ASCII
    } // End while
    dataFile.close();   
   } // End if (dataFile)

Visto che il read restituisce byte, come dovrei fare per avere una stringa da cui estrarre i vari gruppi caratteri da convertire con atoi senza ricorrere all'uso di String ??

Mi rendo conto che per fare una qualsiasi cosa che vada oltre la lettura o il set di un pin ci vuole una buona conoscenza del C/C++
Tutt'altro che non serve niente come si scriveva in qualche messaggio :drooling_face:

ciao

esattamente come ti ho indicato sopra... un char è sempre un byte (http://arduino.cc/it/Reference/Char) che "identifica" un carattere secondo la tabella ASCII... puoi quindi fare un array di char e memorizzare quanto leggi dalla SD e quindi applicare direttamente a tale array la funzione atoi()

lucadentella:
puoi quindi fare un array di char

Questo e' il punto ; non capisco e non trovo come fare un array di char

Siccome i miei parametri sono tutti concatenati divisi da una , ( virgola ) facevo conto di leggere il byte che sarebbe l'x che viene fuori dal read del file
Verificare cosa ci sia dentro per trovare la virgola
Se c'e' la virgola non "accodo" il byte all'array e converto l'array in intero
Per semplicita' sara un array di interi per cui dopo avro' a[0] a[1] etc per fare quello che mi serve
Cancello l'array e vado avanti fino alla seconda virgola , poi la terza .
Il discorso di trovare la virgola salta fuori perche' puo' esserci 168 ma anche 1 ; 1 potrebbe essere 001 per avere elementi tutti da 3 caratteri ma se poi c'e' 086 si arrabbia tirando fuori storie di numeri in fomato ottale
Quindi solo 86 e niente 086

Ciao

(ti rispondo "in teoria" perché non ho sottomano un arduino+sd con cui provare)...

fai così:

  • definisci un array di char della dimensione massima che ti aspetti (es. se sono 3 cifre, char buffer[3])
  • inizi a leggere un carattere per volta dalla sd e accodi al buffer se il carattere non è ','
  • quando trovi la virgola, non la accodi al buffer e converti quanto hai memorizzato fin qui con atoi(), quindi resetti l'indice del buffer (ovvero torni a scrivere dalla posizione 0), e leggi il nuovo byte (che sarà dopo la virgola)

lucadentella:

  • definisci un array di char della dimensione massima che ti aspetti (es. se sono 3 cifre, char buffer[3])

E' quello che ho fatto

char Riga[4] ;

poi

if (dataFile) {
while (dataFile.available()) {
x = (dataFile.read());

x ha il codice asci del carattere

Come lo metto ( accodo ) sull'array Riga ?? perche poi Riga sia valida per atoi
E' questo che non so fare
Immagino che per cancellarlo basta far Riga[] = { }

Poi per il resto della struttura di controllo non avro' sicuramente problemi
If switch case for non mi fanno paura ; col linguaggio strutturato lavoro sui PLC in IEC 61131-3

Grazie per la pazienza

tieni in una variabile (tipo int posizione_riga) il punto in cui sei arrivato a scrivere nel vettore...

quindi

char carattere = leggiCarattere()
if(carattere != ',')
riga[posizione_riga++] = carattere;
else {
atoi(riga);
posizione_riga = 0;
}

brunol949:

lucadentella:
puoi quindi fare un array di char

Questo e' il punto ; non capisco e non trovo come fare un array di char

Prima di continuare col povero Luca Dentella che ti sta facendo il programma lui ;), ti consiglierei di studiarti un po' di basi di C.
Ad esempio qui spiegano gli array:
http://programmazione.html.it/guide/lezione/1099/cosa-sono-gli-array/
e qui gli array di char:
http://arduino.cc/en/Reference/String

lucadentella:
quindi

char carattere = leggiCarattere()
if(carattere != ',')
riga[posizione_riga++] = carattere;
else {
atoi(riga);
posizione_riga = 0;
}

Quindi un brutale array
Quello che dovro' capire e' la questione degli *
char e char*

Stasera riprendo in mano la cosa ; oggi e' una giornata di collaudi
Ho una torcia al plasma che mi fa' inpazzire un bus di campo sebbene sia fatto con tutti i crismi

leo72:
http://programmazione.html.it/guide/lezione/1099/cosa-sono-gli-array/
http://arduino.cc/en/Reference/String

Il primo lo guardo
il secondo lo ho consumato

Non sono gli array che mi sono sconosciuti , ci mancherebbe ( avrei gia' cambiato lavoro )
Come detto sopra e' la trattazione delle stringhe in C che mi e' oscura
E cosa cambia con gli * dopo e prima delle variabili

Ti ringrazio per la pazienza

Ciao

parti da un presupposto: le stringhe in C (senza oggetti "wrapper" tipo String...) sono degli array di caratteri terminati, ovvero l'ultimo carattere della stringa sarà '\0'.

se poi mi chiedi cosa indica l' *... significa che devi rivedere i puntatori :wink:
http://www.science.unitn.it/~fiorella/guidac/guidac025.html

ricordate che un array di char volgarmente chiamato stringa deve avere una dimensione massima di un carattere in più rispetto alla stringa che ci aspettiamo cioè se voglio scrivere dentro un array di char la parola "Ciao" devo creare un array di dimensioni 5

ES:
char saluto[5]=ciao; //corretto il contenuto di saluto sarà ciao\0 dove \0 è il terminatore di stringa
char saluto2[4]=ciao; //errato il contenuto di saluto2 sarà cia\0

lucadentella:
se poi mi chiedi cosa indica l' *... significa che devi rivedere i puntatori :wink:
Guida C - Puntatori

Questa vai tranquillo che me la leggo ed e' gia' nella cartella delle cose utili

Sempre usati anche i puntatori , ma sempre riferiti agli elementi di un array

Ho recentemente completato un lettore di scatolette ; queste vengono scansionate da un laser sugli assi X ed Y per trovarne Altezza ( dal laser ), posizione , larghezza per differenza , lunghezza .
Quindi riscansionate in X ad una distanza predefinita diversa dalla precedente e quindi confrontando le 2 posizioni X ricavo l'angolo di inclinazione
Finito questo leggo i barcode
Tutto questo e' un enorme array la cui dimensione e' data dal numero di scatole trovate sul piano

Non sono un matematico ma su queste cose mi destreggio abbastanza bene riuscendo a fare anche dei programmi abbastanza ottimizzati
Pero' son tutti linguaggi simil basic e del C ricordo poco ; e' passato un bel di tempo da quando feci un corso .

Ti ringrazio per la risposta e per il link
Stasera sono stanco ma domattina son libero e mi butto nella lettura e sperimentazione.

x iscrizione

Ecco qua il risultato :slight_smile:

int pc = 0 ;  // puntatore caratteri letti
int pi = 0 ;  //  puntatore numeri da archiviare
int Num[22];  // dimensiono l'array dei numeri
char Stringa[4]; // array caratteri da convertire in numemero

//   Omissis ...  fare riferimento agli esempi SD\DumpFile

File dataFile = SD.open("IPL.txt");
  if (dataFile) {
    while (dataFile.available()) {
      char x = (dataFile.read());
      //if (x != '\r' && x != '\n'){  // da abilitare se le serie di numeri sono su piu' righe / mangia 12 byte
        if (x != ',' ){
            Stringa[pc++] = x ; }
        else {
            Num[pi]=atoi(Stringa) ;
            for(pc=0;pc<=3;pc++){Stringa[pc] = ' ';}
            pc = 0 ;
            pi++ ;  } // fine else
        //}      // Fine del if disabilitato piu' sopra 
    } // End while
    dataFile.close();   
   } // End if (dataFile)

for(pi=0;pi<=21;pi++){ Serial.println(Num[pi]);} // verifico il risultato sul serial monitor

Siccome i numeri letti sono a 1 2 e 3 cifre ho dovuto inserire il for che cancella tutti gli elementi del'array altrimenti veniva falsata la conversione causa permanenza nell'array di quanto letto in precedenza
Se poi ci sia un modo per "svuotare" l'array piu' semplice vado a studiarmelo nei link suggeriti

diciamo che per leggere 22 "parametri" si sono consumati
Binary sketch size: 13814 bytes (of a 32256 byte maximum)

Se c'e' spazio puo' andare ma se non sussiste la necessita' di cambiare i valori si brucia un sacco di memoria
Puo' andare anche se comunque viene inclusa la libreria della SD

Il tutto comunque e' stato un buon esercizio :grin:

Il problema è la libreria SD, che si brucia da sola una dozzina di kB di memoria. Potresti usare la petit File-System:

Ha funzionalità molto limitate ma supporta la FAT32 ed occupa da 2 a 4 kB di Flash appena. Io non l'ho provata però se devi solo leggere/scrivere da un file forse ti potrebbe far comodo.

leo72:
Ha funzionalità molto limitate ma supporta la FAT32 ed occupa da 2 a 4 kB di Flash appena. Io non l'ho provata però se devi solo leggere/scrivere da un file forse ti potrebbe far comodo.

Da una rapida occhiata sembrerebbe avere tutto quello che serve a parte limitazioni descritte
Mi pare che SD , vista al volo , consenta di creare e cancellare file che l'altra non fa' , devono esistere
poi non aggiorna la data ma se non hai un rtc la cosa conta poco

Certo che occupare il triplo di memoria per fare proprio poco in piu ....

Grazie per la tua prontezza e disponibilta'

Beh, il file puoi crearlo in anticipo, anzi puoi anche crearne più di uno vuoti e lasciarli sulla SD "pronti all'uso" :wink:

leo72:
Beh, il file puoi crearlo in anticipo, anzi puoi anche crearne più di uno vuoti e lasciarli sulla SD "pronti all'uso" :wink:

Infatti
Bisognerebbe analizzare in dettaglio ma a prima vista non trovo sulla libreria SD.h "features" tali da giustificare l'occupazione del triplo della memoria