Nome file MicroSD concatenato

Buonasera a tutti,
sono a chiedere il vostro prezioso aiuto per un problema che sto riscontrando con il nome variabile da dare ai file salvati sulla micro SD ad ogni nuovo avvio.
per adesso per dare il nome concatenato al file ho utilizzato questo codice ma ho notato che non viene salvato niente sulla MIcro SD come posso fare?

LogFile = SD.open("Batteria" + String(FileSd) + ".txt", FILE_WRITE);

Non si concatenano il quel modo le stringhe, mia stai scrivendo in Basic :smile:

Il nome del file lo devi creare prima e poi parrare la variabile che lo contiene ...
... dat che sconsigliamo SEMPRE l'uso di cella classe String su piccole MCU come quelle di Arduino, ti do le indicazioni per le stringhe classiche del 'C' ovvero per dei char array.

Prima di tutto dichiari dove vuoi mettere il nome con una variabile di tipo char array sufficentemnete lunga da contenerlo completo ... tipo 32 caratteri + 1 per il terminatore (0x00):

char nomeFile[33];

... poi ci metti dentro la prima parte del come file e ci accodi il resto usando le funzioni che trovi in <string.h> che fa parte di AVR libc (libreria SEMPRE disponibile nel IDE di Arduino), tipo strcpy() e strcat().

Non so che tipo di variabile è 'FileSd' e quindi non posso farti un esempio fino a quando non lo dici.

Guglielmo

attenzione, che oltre a non usare oggetti String su piccole MCU
e a non poter comunque passare oggetti String ai metodi della SD che aprono file, perché si aspettano stringhe di C...
non puoi nemmeno usare nome file lunghi
la lunghezza dei nomi file rimane (come in DOS) di 8 caratteri, un punto (obbligatorio? non è mai stato chiaro...) e un'estensione di 3 caratteri

inoltre c'è "confusione" sull'uso di lettere maiuscole/minuscole

quindi stacci attento, ma molto, sui nomi di file...

Beh ... questo dipende dalla piattaforma e dalla libreria che utilizzi ...
... la SdFat ha totalmente superato tali limiti e, ad esempio, su piattaforma ESP, anche se tu includi la classica SD in realtà viene usata la SdFat :wink:

Guglielmo

vero,

io però parto sempre dal presupposto che si parli di una UNO

poi esistono talmente tante schede, che se tutto può essere...

... va bene, ma ... NON ha detto che libreria usa :smile: :smile: :smile: ... la Sdfat la usi anche con la UNO :wink:

Guglielmo

sì, ma dalla documentazione dell'autore con una uno e la SdFat V2 la UNO si e no si accende, non mi meraviglierebbe che fosse la versione "precedente" quella del library manager,

comunque basta provare....

... aspettiamo che ci dice l'OP in merito alla piattaforma su cui sta lavorando ed alla libreria che sta usando così ... andiamo sul sicuro :wink:

Guglielmo

Io ultilizzo arduino Nano che tipo di libreria mi consigliate?

Cosi puo a dare bene???

char nomeFile[10];
nomeFile[1] = "B";
nomeFile[2] = "a";
nomeFile[3] = "t";
nomeFile[4] = FileSd;
nomeFile[5] = ".";
nomeFile[6] = "t";
nomeFile[7] = "x";
nomeFile[8] = "t";
nomeFile[9] = 0;

LogFile = SD.open(nomeFile, FILE_WRITE);

No

Primo tu usi stringhe "B" e non caratteri 'B'
Poi cosa che è fileSd?

Ti posso solo consigliare di studiare un po' di C

Quindi la UNO in "scatola piccola"...

Nomi file 8.3, ci starei attento con mischiare maiuscole e minuscole, assolutamente da evitare simboli strani e caratteri accentati

1 Like

Ma lo hai letto bene il mio post #2 ? Ti sei andato a studiare le funzioni che ti ho indicato ?

E comunque, se usi la libreria SD standard di Arduino, come ti ha già detto Standardoil, devi limitare il nome del file a 8.3 caratteri maiuscoli come con il vecchio MSDOS ...

The library supports FAT16 and FAT32 file systems on standard SD cards and SDHC cards. It uses short 8.3 names for files.

Guglielmo

1 Like
char nomeFile[10];
nomeFile[1] = 'b';
nomeFile[2] = 'a';
nomeFile[3] = 't';
nomeFile[4] = FileSd; // variabile int a cui è associato un numero intero progressivo ad ogni accensione di arduino
nomeFile[5] = '.';
nomeFile[6] = 't';
nomeFile[7] = 'x';
nomeFile[8] = t';
nomeFile[9] = 0;

LogFile = SD.open(nomeFile, FILE_WRITE);

Cominciamo a ragionare...

Però in C gli array non partono dell'elemento [1]

La variabile intera va da ... a ...
(Ovvero quante cifre?)

E comunque numero 1 diverso da carattere '1' e anche da stringa "1"

Domana seria: quando e come hai studiato C?

O sei completamente autodidatta?
Nulla di male, intendiamoci, io ho studiato C talmente tanti anni prima di usarlo che me ne ero pure dimenticato, sono partito da praticamente autodidatta

Poi durante uno dei miei tanti tragislochi ho trovato sia il K&R che l'attestato del corso...

Io sono completamente Auto didatta e il numero intero nella variabile FileSd è una sola cifra unitaria.

Vengo dal mondo della programmazione VBA di Office e mi sono introdotto a questo mondo ma noto che molte cose sono molto differenti.
Comunque anche in VBA sono autodidatta ma non arrivato molto in alto.
Comunque ho trovato forse una cosa che è un po più nelle mie corde secondo te può funzionare?

byte nomefile[10];
...
sprintf(nomefile,"%01d.txt",FileSd);
SD.open(nomefile, FILE_WRITE);

strano

sia famiglia[0].figlio che famiglia[1].pestifero_nipote sono ingegneri civili come te

e tutti e due hanno dato informatica al primo anno e conoscono il C quasi (quasi) come me...

hanno anche ambedue lo stesso cognome (per puro caso?) e lo stesso nome di battesimo...

oltretutto laureati nello stesso ateneo, per fortuna non coetanei...
che comunque qualche docente qualche commento ha fatto...

anche io, che sono vecchio e stanco, li confondo spesso...

ma bando alle ciance
vediamo come si potrebbe risolvere il tuo problema specifico


char filename[]= "bat0.txt"; // la base per poi scrivere il nome corrente
// il carattere da modificare è .... h
// modifico il carattere
filename[h]=variabielintera+....;
// e qui lo studio è essenziale, ma sono cose facili da trovare

come vedi è quasi più facile così che usando oggetti String

byte nomefile.... ?

magari pensare ai tipi dati...

poi per carità, andare va

prova a vedere il consumo di memoria e le velocità rispetto alla versione che ho pubblicato...

Ciao ho fatto in questo modo poi:

char filename[]= "bat0.txt"; 
filename[3]= numeroProgressimo

Dove numeroProgressimo è una variabile int numero progressivo che viene scritto nella memoria EEPROM e è progressivo ad ogni accensione.
Secondo re ci puo essere qualcosa che non va