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/
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
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ì:
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 charQuesto 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:
quindichar 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
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
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
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
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"
leo72:
Beh, il file puoi crearlo in anticipo, anzi puoi anche crearne più di uno vuoti e lasciarli sulla SD "pronti all'uso"
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