tu invece gli dai un mattone di libreria fregandotene a metà di quello che fa.
infatti non funziona nemmeno, il puntatore a file della fscanf e quelli della SD sono differenti e non compatibili
per rimediare ecco il codice compilato MA NON TESTATO (niente SD sorry), spero che si autocommenti, sono partito dall'esempio della SD
/*
SD card read/write
This example shows how to read and write data to and from an SD card file
The circuit:
- SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 10 Gen 2013
by Lesto
This example code is in the public domain.
*/
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
int numero = 0;
while (myFile.available()) {//finchè ci sono dati
char tmp = myFile.read(); //leggo una lettera
switch (tmp){
//se è una vigola o uno '\n' interpreto il valore letto come intero, se è \n avviso della fine riga
case '\n':
case ',':
Serial.print("letto un intero:");
Serial.println( numero ); //stampo il numero
numero=0; //lo azzero per leggere il prossimo
if (tmp == '\n'){
Serial.print("riga è completa");
}else{
Serial.print("altri dati nella riga");
}
break;
//in tutti gli altri casi
default:
if (tmp >= '0' && tmp <='9'){ //se è una cifra e non manda il tutto in overflow
numero = (numero*10); //scifta il numero a sinistra in base 10
numero += tmp - '0'; //salva nello spazio vuoto la nuova unità, convertendola da carattere a numero
}else{ //altrimenti c'è un errore!
Serial.print("Errore di interpretazione del file, carattere errato ignorato (in esadecimale):");
Serial.println(tmp, HEX);
}
break;
}
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
pablos, senza offesa ma se segui il link in firma o fai una ricerca sul forum e vedrai che i miei bei esperimenti me li son fatti anche io
Purtopppo lavoro fino alle 18.30/19.00, e anche se sono attivo sul forum capirai ce non posso tirare fuori l'arduino/arduino IDE e fare esprerimenti
poi quando arrivo a casa non ho certo voglia di scrivere e testare codice per terze parti, salvo che non sia stimolante, ovvero la questione non sia stata affrontata centinaia di volte su questo forum.
I motivi per cui ho dato della "spatafiata" al tuo codice sono 2, e come puoi vedere lamia soluzione non è molto differente dalla tua:
- il mio prof di informatica chiamava così i nostri codici, e mi fa piacere ricordarlo;
- devi ammettere che fai dei salti moltali.
leggi un'intera riga in char, la metti nella classe String (per l'allocazione di ram dinamica, ovvero concatenare più facilmente i dati. ma tu sai che 1 intero è di al massimo 6 cifre, ovvero -32768, * 4 perchè sono 4 interi, +3 per le virgole e +1 perlo \n, etvoilà la dimensione massima della riga), poi da String ritorni ad array di char (che non è allocato dinamicamente, quindi rendi inutile iol concetto dell'uso di String!).
Quì avstri potuto evitare di ritornare ad array di char, tanto anche la string può essere usata con [] ([] - Arduino Reference)
Bella l'idea di scorrere l'array con un puntatore, ma forse scelta infelice a scopi didattici.
Avresti potuto felicemente usare atoi() (che inserita nel codice mio di prima porta da 13.994 bytes a 14.154), ma a questo punto nascondevi la parte "interessante" di conversione vera e propria, altro punto dolente di chi fa queste richieste ( e quindi usa poco il tasto search ] ).
la
Serial.println((String)temp_dato[ii]+" ");//debug
è tranquillamente
Serial.println( temp_dato[ii] );//debug
ps. anche tu non hai compilato... Serial << F("File inesistente o errore SD "); non mi risulta sai ]