Scrivere su seriale il nome del programma

Curiosità, forse non è fattibile, forse si...
Per poter identificare velocemente cosa ho caricato sul mio arduino mi piacerebbe far scrivere su seriale il nome del programma, in modo tale che se creo una versione nuova, senza doverlo scrivere io fisicamente con il serial.print, me lo trovo all'accensione scritto su seriale.
Tipo: salvo lo sketch con mionome ver1, l'ide crea il file mionome ver1 lo carico su arduino, e quando accendo arduino troso sul seriale mionome ver1....
Si può fare????
O è una cavolata???

Puoi usare la macro FILE :

FILE
This macro expands to the name of the current input le, in the form of a C string constant. This is the path by which the preprocessor opened the le, not the short name speci ed in ‘#include’ or as the input le name argument. For example, "/usr/local/include/myheader.h" is a possible expansion of this macro.

In allegato il manuale del preprocessore 'C' dove trovi tutte queste informazioni.

Guglielmo

The C Preprocessor.pdf (470 KB)

:o
Uao...non sapevo di questa macro....
Googlando poi ho trovato questo:

void setup() {
  Serial.begin(9600);
  Serial.println(__FILE__);
  char s[] = __FILE__;
  byte b = sizeof(s);
  while ( (b > 0) && (s[b] != '\\')) b--;
  char *u = &s[++b];
  Serial.println(u);
}

Ora non riesco a provare...ma potrebbe funzionare??
Solo che qusto lo capisco:

void setup() {
  Serial.begin(9600);
  Serial.println(__FILE__);

E questo no:

  char s[] = __FILE__;
  byte b = sizeof(s);
  while ( (b > 0) && (s[b] != '\\')) b--;
  char *u = &s[++b];
  Serial.println(u);

FILE ti ritorna una stringa quindi ci puoi tranquillamente inizializzare una variabile stringa classica del 'C', ovvero un array di char ed è quello che viene fatto con "char s[] = FILE;" dove l'array viene automaticamnete dimensionato per contenere la stringa di caratteri ed il suo terminatore 0x00.

Il resto sono operazioni sulla stringa alla ricerca del carattere **\** e poi stampa quello che segue.

Guglielmo

Certo che quell'esempio è delirante... Invece di fare tutto quel casino bastava usare strrchr()... :confused:

Delirante, concordo, per una volta, con sukko
però, allo scopo di imparare, si potrebbe giocare a "togliere"

  char s[] = __FILE__;
  byte b = strlen(s);
// sizeof si adatta a una maggiore varieta' di oggetti, ma prevede che la dimensione sia conosciuta a compiletime
// che in questo caso è vero, ma comunque strlen è più generale
   while ( b  && (s[b--] != '\\'));
// perche' fare un test esplicito a maggiore di zero? 
// e mettere un corpo del while che fa un autoincremento che si può fare "nel" while?
  Serial.println(&s[++b]);
// perche' passare per una variabile temporanea inutile?

Anche questa mi pare dura da leggere:
char *u = &s[++b];
non basta usare la matematica sui puntatori ?
char *u=s+b+1;

È la stessa cosa, per definizione
Stranament io "penso" nella prima maniera.
Ma mi viene più leggibile la seconda, non me ne ero reso conto finché non la hai mostrata
Si vede che sto cambiando modo di pensare?
Io comunque direi che la prima maniera è più "classica", più leggibile da chi conosce linguaggi più antichi (gwbasic?)
la seconda più "moderna"

@standard, vero che in pratica sono la stessa cosa. A me viene più semplice la seconda perché do per scontato che un array (s in questo codice) è già di per se un puntatore. s da solo è già l'indirizzo iniziale dell'array. Quindi chiedere con & l'indirizzo di una cella di s[ ] mi pare ... "brutto" :slight_smile:

Adesso pare brutto anche a me
Però mi ricordo di aver letto una cosa simile su un testo "importante" forse proprio il k&r....

SukkoPera:
Certo che quell'esempio è delirante... Invece di fare tutto quel casino bastava usare strrchr()... :confused:

Sukko, come lo useresti ne mio intento??

A te basta:

Serial.println(FILE);

Sukko, questo l'avevo provato, ed effettivamente funzionava...
Ma mi stampa tutto il percorso...
c:\documenti\arduino\progetti\pippo_4.ino
Io volevo stampare solo il nome del file che termina .ino
pippo_4

:confused:

Ok, non avevo capito:

char *s =__FILE__;
char *progname = strrchr(s, '\\');
if (progname != NULL) {
 Serial.println(progname + 1);
}

Perfetto!!Quello che cercavo!!
Grazie.

Ehm... :frowning:
Ho due domande da fare:
1- Visualizza bene in seriale, ma termina con .ino: come posso togliere il .ino e lasciare solo il nome?
2- Ho utilizzato lo stesso sistema su un programma vecchio diviso in più schede...mi visualizza sempre l'ultimo nome.ino nella cartella, mentre io voglio che venga stampato il nome della cartella...come fare?

beh, non è difficile
se vuoi togliere il ".ino" basta che invece di stampare la stringa "risultato" della prima ricerca le fai cercare di nuovo, ma un punto questa volta.
trovato il punto lo sostituisci con uno 0, che termina artificialmente la stringa li, invece che alla sua "fine naturale"
se invece vuoi che appaia il nome della directory, invece che il nome del file, devi lggere la stringa, contare i caratteri '/' (separatore di directory, non so, se usi windows magari è '')
quando sai quanti sono riscandisci la stringa, contando di nuovo, quando arrivi al penultimo registri l'indice, li comincia il nome di cartella
quando arrivi all'ultimo lo sostituisci con uno 0
e mandi in stampa dal penultimo trovato

Grazie Standardoil, detta così sembra facile ma molto più difficile da mettere in pratica :confused:
Che comando devo usare per trovare il punto e sostituirlo con lo 0?
Come faccio a registrare l'indice bel secondo caso???
:frowning:

beh, guarda
come trovare l'ultimo punto è come trovare l'utlima barra, e questo te lo hanno già indicato
se non sei capace di salvare un valore in una variabile e/o scrivere un elemento di un array....
io andrei a leggere un po' di libri di testo............
la teoria serve, purtroppo

Quindi non fai altro che confermare quel che diciamo sempre, ahimé: ti ho fornito un pezzo di codice già pronto, tu l'hai copiato senza nemmeno guardarlo e non hai imparato niente.

Non è questo il principio per cui partecipo al forum, quindi mi astengo da ulteriori suggerimenti. Se hai voglia di CAPIRE e IMPARARE, sopra c'è tutto quel che ti serve sapere per camminare con le tue gambe.