lettura da SD e divisione di una stringa

Ho un grosso problema
devo leggere da un file in SD
per ogni riga devo estrapolare due dati divisi da un '='
tipo Kiave = Valore.

il contenuto della SD e':

ID_code=A1A0F664
SSID=Xxxxxx
IP=192.168.1.10
GW=192.168.1.1
FTPServer=ftp.XyXxyXX.org
FTPUtente=bingoBongo
FTPPasswd=pimoub
FTPDirectory=/

questo e' il programma

#include <SPI.h>


#include <SoftwareSerial.h>
#include <SD.h>
#include <string.h>

const int chipSelect = 4;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  
  Serial.print("Initializing SD card...");
   pinMode(SS, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
}
boolean sdReadConfig() {
  char Buf[200];
  char * Kiave;
  char * Valore;
  int px=0;
  Serial.print ("-------------------------------- LEGGO CONFIGURAZIONE");
  File FileConf;
  FileConf=SD.open("Config.ini",FILE_READ);
  if(FileConf==false) {
    Serial.print ("Non Trovo il file Config.ini");
    return false;
  }
  // Parsed dei dati letti 
  char *readLine ="";
  if (FileConf = SD.open("Config.ini",O_READ) ) {
    Serial.println("...........ESISTE IL FILE.......");
  
    char c;
   
    while ( ( c=FileConf.read())>0) { // Cicla fino a quando non ha finito di leggere i dati da SD
      readLine +=  c; // inserisce un carattere alla volta in readLine
      if (c=='\n') {  // Quando trova un CR+LF chiude la riga
         Serial.print("Nuova Linea.............>");
         
         Serial.println(  readLine); 
         Kiave="";
         Kiave=strtok(readLine,"=");
         Valore=strtok(NULL,"=");
         Serial.print("Kiave=");
         Serial.println(Kiave);
         Serial.print("Valore=");
         Serial.println(Valore);       
         readLine="";
      }
     
    }  
  return true;
  }

}

void loop() {
  // put your main code here, to run repeatedly:
  sdReadConfig();
  while (-1) delay(1000);
}

e questo e' il risultato:

Initializing SD card...-------------------------------- LEGGO CONFIGURAZIONE...........ESISTE IL FILE.......
Nuova Linea.............>¹z¹ÿøºoð}û·§™ö» õ!<žicmí³øå—ë®^móÿXßG
]òoíî·†Ý{Ã�evŸú~îׯþwOñ»4¯ªìïU¹ÕY­¥?ìeTôIñÿÉ[XïÖ�ÿÿJÝÓsàßþ'oßm
Kiave=¹z¹ÿøºoð}û·§™ö» õ!<žicmí³øå—ë®^móÿXßG
]òoíî·†Ý{Ã�evŸú~îׯþwOñ»4¯ªìïU¹ÕY­¥?ìeTôIñÿÉ[XïÖ�ÿÿJÝÓsàßþ'oßm
Valore=
Nuova Linea.............>
Kiave=
Valore=
Nuova Linea.............>
Kiave=
Valore=
Nuova Linea.............>
Kiave=
Valore=
Nuova Linea.............>
Kiave=
Valore=
Nuova Linea.............>¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Kiave=¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Valore=
Nuova Linea.............>%ï+} Þ×þ‰|Wúø·o¸{oÕïý;g‹»¿\‡o÷åqüí„ÎÿÅoG0Xå¶ÎS†3kæß)ÿy¯ÿ4îTíþâJïò�¼¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Kiave=%ï+} Þ×þ‰|Wúø·o¸{oÕïý;g‹»¿\‡o÷åqüí„ÎÿÅoG0Xå¶ÎS†3kæß)ÿy¯ÿ4îTíþâJïò�¼¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Valore=
Nuova Linea.............>âöG¿ß÷NÜ)ŽæÿÚ|ý{ºîó/9Eá㮞۷£ê­û¶|Žì•Þ÷¯²«ÿõÿ¢w,ÿ§·Oezú¦Gü†ÿDëŸu4ÙäXSÿÿ¯¸OU•Öý–q÷&�þ_÷'’\kßûãØËæ±?O>i>Ô7þüªÿeëÍê¾ÿ>t_ŸÜ•ÇßýP¸ÔòïÖÏ6Í—ï˜ÿñ.?Ø9îתÌî¥ëÃñZÝO‚‡þù³£Ä;ç�/o9ïÇÛ‡¼¹Øè#jÞ-ä·¾C­ºt%ï+} Þ×þ‰|Wúø·o¸{oÕïý;g‹»¿\‡o÷åqüí„ÎÿÅoG0Xå¶ÎS†3kæß)ÿy¯ÿ4îTíþâJïò�¼¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Kiave=âöG¿ß÷NÜ)ŽæÿÚ|ý{ºîó/9Eá㮞۷£ê­û¶|Žì•Þ÷¯²«ÿõÿ¢w,ÿ§·Oezú¦Gü†ÿDëŸu4ÙäXSÿÿ¯¸OU•Öý–q÷&�þ_÷'’\kßûãØËæ±?O>i>Ô7þüªÿeëÍê¾ÿ>t_ŸÜ•ÇßýP¸ÔòïÖÏ6Í—ï˜ÿñ.?Ø9îתÌî¥ëÃñZÝO‚‡þù³£Ä;ç�/o9ïÇÛ‡¼¹Øè#jÞ-ä·¾C­ºt%ï+} Þ×þ‰|Wúø·o¸{oÕïý;g‹»¿\‡o÷åqüí„ÎÿÅoG0Xå¶ÎS†3kæß)ÿy¯ÿ4îTíþâJïò�¼¿xþðý8±~}øÜ·tR¼ÿ¿%*eÿ;–óó«Ú]ûÇó&ókÏ3{ðÂb׺·Ù}­ü:ÿü-ïÙgÍ^Îo;nœà{nåwl¿÷´¯-ÌÊçf{Yì/Ù»û{ï>E
Valore=

se tolgo la parte di conversione strtok() il valore della stringa readLine viene fuori giusto

chi mi puo' dire qualche cosa in merito?

Mi pare hai cannato praticamente tutto.
Quando vedi quei caratteri strani vuol dire che il puntatore punta alla cavolo in memoria.
L'uso di readline come pointer mi pare totalmente errato.
Un puntatore deve puntare a qualcosa e dietro a quello che punta ci deve essere un buffer di spazio libero.
Ad esempio ha la variabile/array buf di 200 elementi, usa quello per leggere una riga alla volta.

Queste non hanno senso:

char *readLine ="";
...
readLine +=  c; // inserisce un carattere alla volta in readLine

Sta aumentanto il valore del puntatore di una quantità che dipende dal valore del carattere letto.
Inoltre readline non punta a nulla. Potrebbe puntare a buf, allora un pò più di senso avrebbe.

readLine fallo diventare un numerico unsigned int, così lo usi da 0 a n e conta i caratteri (da azzerare a ogni nuova riga)
poi semplicemente

buf[readLine]=c;
buf[readLine+1]='\0';
readLine++;

E a questo punto la riga è dentro a buf e analizzi quello con strtok() :

//Kiave="";   eliminare sta riga!!
Kiave=strtok(buf,"=");
...vari pezzi ricerca
readLine=0;        // readLine="";

Sei stato chiarissimo ed ho risolto il problema grazie a te.
Buona giornata

ermenegildo:
Sei stato chiarissimo ed ho risolto il problema grazie a te.
Buona giornata

Prego. :slight_smile:

Eventualmente potevi usare readLine come puntatore, ma inizialmente e alla fine di lettura di una riga deve puntare a buf.

readLine=buf;   // readLine punta a inizio buf

A questo punto readLine punta buf e si usa lui invece dell'indice su buf tra quadre.

*readLine=c;        // scrivo alla memoria puntata da readLine
*(readLine+1)='\0';
readLine++;

La ricerca la fai comunque su buf, oppure se "azzeriamo" readLine come prima cosa, usando readLine stesso

//Kiave="";   eliminare sta riga!!
readLine=buf;        // readLine="";
Kiave=strtok(readLine,"=");
...vari pezzi ricerca