Salve ragazzi e grazie in anticipo dell'aiuto.
Dunque sto sbattendo la testa da una settimana su questo benedetto problema e ho provato diversi codici e librerie ma nessuno mi funziona
cosa vorrei ottenere
su una scheda SD ( collegata già e legge tranquillamente ) c'è un file chiamato " config.txt" strutturato in questo modo:
number_of key= 3
key1=1234567890
key2=2345678901
key3=3456789012
ora ovviamente se sono qui è perché questi benedetti dati non vengono caricati !
veniamo all'errore
ibutton_v3:472: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
dunque G-addr è definita all'inizio in questo modo
unsigned char G_addr[10][8]; //qui memorizzo fino a 10 indirizzi da 8 bytes (64bit)
ora io ho ipotizzato nel file 3 chiavi ma facendolo funzionare con 3 poi a farlo da 10 sarà facile !!!
ora il problema credo sia qui
void applySetting(String settingName, String settingValue ) {
if(settingName == "number_of_key") {
number_of_key=settingValue.toInt();
}
if(settingName == "key1") {
G_addr [1] = settingValue;
}
io ho una stringa e un unsigned char che litigano tra loro...
come ne esco ?
in allegato il codice completo
grazie mille
ibutton_v3.ino (10.9 KB)
diciamo che potremmo sintetizzare con
inserire una stringa dentro un unsigned char
ragazzi possibile ? sto cercando come un pazzo su Google ma non ne vengo a capo
ho una stringa con valori esadecimali da mettere dentro una variabile unsigned char
che mi invento ?
strncpy (G_addr[1], settingValue.c_str (), 10);
Ma secondo me ci sono altri problemi, ora non posso guardare con attenzione.
intanto grazie mille per la risposta più tardi farò alcune prove che ci siano altri errori è sicuro ma risolto questo credo che il resto sia superabile
il codice originale della lettura del codicechiave iButton usa questo comando per "riempire" l'unsigned char
for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia l'indirizzo
G_Devices++; // incrementa il numero di devices memorizzati
ora la variabile G_Devices viene impostata leggendo dal configfile il numerochiavi
mentre G_addr viene "riempita" col codice qui sopra
come si vede qui sopra G_addr viene riempita da address[aa]
come faccio a mettere dentro G_addr quello che è presente invece nella stringa settingValue ?
questo è il punto esatto di errore
grazie per chi mi aiuterà
inserendo la conversione che è stata suggerita qui sopra ecco l'errore
ibutton_v3.ino: In function 'void applySetting(String, String)':
ibutton_v3:472: error: invalid conversion from 'unsigned char*' to 'char*'
ibutton_v3:472: error: initializing argument 1 of 'char* strncpy(char*, const char*, size_t)'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope
Il problema principale è che G_addr non è fatta per contenere l'indirizzo in versione stringa, bensì in versione "byte". Perché devi fare questa copia?
Forse non ho capito io, ma quando leggi da SD hai già dei char, non potresti copiarli direttamente sul tuo chararray?
Perchè hai delle stringhe? da dove arrivano?
Dunque come potete vedere dallo sketch che ho allegato non è che voglio String o voglio charter a piacimento il problema è che sto unendo due sketch diversi per cercare di farlo funzionare. Dalla lettura del file config presente su scheda sd la lettura finisce sul String per questo chiedo la conversione. Come fare altrimenti a leggere e mettere dal file sd su unsigned char ?
Ripeto che secondo me quell'unsigned char non serve a quello che pensi tu, altrimenti sarebbe char e basta. Non puoi tenerlo in formato String?
char character;
character = myFile.read();
come vedi "character" è un char
ora devi trovare il numero dopo l'= key1=1234567890
if(character == '=') salva nell'array tutti i char che arrivano e fermati quando trovi '\n'
sull'idice 0 troverai anche il char '=' .... o lo salvi lo stesso e poi lo scarti o metti un flag che inizia a registrare al ciclo successivo
dunque grazie mille intravedo poca luce alla fine del tunnel
void readSDSettings(){
char character;
String settingName;
String settingValue;
char addr;
myFile = SD.open("settings.txt");
if (myFile) {
while (myFile.available()) {
character = myFile.read();
while((myFile.available()) && (character != '[')){
character = myFile.read();
}
character = myFile.read();
while((myFile.available()) && (character != '=')){
settingName = settingName + character;
character = myFile.read();
}
character = myFile.read();
while((myFile.available()) && (character != ']')){
settingValue = settingValue + character;
character = myFile.read();
}
if(character == ']'){
/*
//Debuuging Printing
Serial.print("Name:");
Serial.println(settingName);
Serial.print("Value :");
Serial.println(settingValue);
*/
// Apply the value to the parameter
applySetting(settingName,settingValue,addr);
// Reset Strings
settingName = "";
settingValue = "";
}
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
lcd.print("error opening settings.txt");
delay(1000);
lcd.clear();
}
}
/* Apply the value to the parameter by searching for the parameter name
Using String.toInt(); for Integers
toFloat(string); for Float
toBoolean(string); for Boolean
toLong(string); for Long
*/
void applySetting(String settingName, String settingValue , char addr) {
if(settingName == "number_of_key") {
number_of_key=settingValue.toInt();
}
if(settingName == "key1") {
G_addr [1] = addr; [color=red]<===== ora dovrebbe funzionare[/color]
}
ed invece ecco l'errore
ibutton_v3.ino: In function 'void applySetting(String, String, char)':
ibutton_v3:473: error: incompatible types in assignment of 'char' to 'unsigned char [8]'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope
ma se elimino dalla struttura del file il nome della variabile si semplifica ?
ovvero
3
1234567890
2345678901
3456789012
sto diventando cretino
del resto a me il file serve per configurare le chiavi e i rispettivi codici quindi la spiegazione del file o meglio
numero_chiavi=3
chiave1=12345678899
ec
ecc
se serve per semplificarla certo era meglio
il problema è che a livello logico è chiarissimo quello che dice pablos
leggo carattere dopo carattere dall' = finchè non arrivo a ]
poi metto tutto dentro G_addr [numero chiave]
il problema è farlo !
mi si sta intrecciando tutto !
Ma perché non li tieni come String???
ho provato a cambiare qui
String G_addr[10][8]; //qui memorizzo fino a 10 indirizzi da 8 bytes (64bit)
byte G_Devices; // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus
OneWire ow(1); // inizializza il bus onewire sulla porta n°8 (se avete collegato i sensori su un'altro pin dovete modificare qui)
ma poi l'errore lo presenta qui
for (int i=0;i<G_Devices;i++) if(CheckAddress(G_addr[i],address)) {old=true;break;} // se trovo l'indirizzo imposto old a true ed esco dal for
ecco l'errore
ibutton_v3.ino: In function 'void lookUpKeys()':
ibutton_v3:140: error: cannot convert 'String*' to 'unsigned char*' for argument '1' to 'bool CheckAddress(unsigned char*, unsigned char*)'
ibutton_v3:148: error: invalid conversion from 'byte' to 'const char*'
ibutton_v3:148: error: initializing argument 1 of 'String& String::operator=(const char*)'
ibutton_v3.ino: In function 'void applySetting(String, String, char)':
ibutton_v3:473: error: incompatible types in assignment of 'char' to 'String [8]'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'String [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'String [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope
Va bene tieni lo string ... fai conto che non ti abbia detto nulla, sono 8 anni che diciamo "le stringhe sono la morte degli AVR", ma fa nulla .... tieni la stringa in definitiva è più semplice
Se vuoi espandere però lo studio sui char e file di inizializzazione presi da SD ti consiglio di consultare questa lib, io non l'ho utilizzata per intero, mi sono limitato a prenderne delle parti e a fonderle nello sketch, è molto intelligente ed educativa ... ho impiegato un po' di tempo agli inizi per studiarla e capirla quando era uscita 5 anni fa, ma non è poi così complicata.GitHub - stevemarple/IniFile: Arduino library to parse ini files.
pablos grazie mille tra poco provo comunque uso String perchè nello sketch del dallas ibutto ho trovato quello
sto continuando a sbattermici sopra
dunque vediamo se ho capito
l'unsigned char è una variale composta dalla "somma" ovvero dall'affiancamento di diversi caratteri ottenuti leggendo ciclicamente qualcosa
allora ecco come avrei modificato il codice
void readSDSettings(){
char character;
String settingName;
String settingValue;
unsigned char temp [1][8];
myFile = SD.open("settings.txt");
if (myFile) {
while (myFile.available()) {
character = myFile.read();
while((myFile.available()) && (character != '[')){
character = myFile.read();
}
character = myFile.read();
while((myFile.available()) && (character != '=')){
settingName = settingName + character;
character = myFile.read();
}
character = myFile.read();
while((myFile.available()) && (character != ']')){
for(int aa=0;aa<8;aa++) temp[1][aa]=character[aa]; // copia l'indirizzo
// settingValue = settingValue + character;
character = myFile.read();
}
visto che legge i char character che faccio ?
per un ciclo di for gestito da aa faccio mettere nella variabile temp[1] quello che viene letto da characte[aa]
ma non funziona di nuovo
vi prego aiutatemi tra poco mi ricoverano alla neuro
ecco l'errore
ibutton_v3.ino: In function 'void readSDSettings()':
ibutton_v3:434: error: invalid types 'char[int]' for array subscript
ibutton_v3.ino: In function 'void applySetting(String, String)':
ibutton_v3:477: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exBoolean' was not declared in this scope
ibutton_v3:484: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:485: error: 'exLong' was not declared in this scope
ho provato a fare nuove prove con un altra libreria ( allego il file comuqnue)
char temp[8]; // Since the SD functions expect a character array and not a string we have to temporarily store the string in a character array.
fname.toCharArray(temp,8); // Convert the string to a character array
G_addr[1] = temp;
// Check to see if the file exists
ma perchè non funziona ???????????
ibutton.ino: In function 'bool does_file_exist(String)':
ibutton:450: error: incompatible types in assignment of 'char [8]' to 'unsigned char [8]'
ibutton_test.ino (11.4 KB)