Problemi con l'uso di indexOf

Buongiorno a tutti,
questo è il mio primo post, spero di essere nella sezione giusta.
Sto preparando un software su ESP32 usando l'Arduino IDE, e ho un problema con l'uso della funzione indexOf che non riesco a comprendere.
In sostanza, ho due schede, una delle due è quella con l'ESP32 sulla quale lavoro, la seconda è la scheda di un cliente dalla quale posso ricevere dei dati chiedendoli tramite una parola chiave e una password.
Quando invio la parola chiave la scheda mi risponde con il msg "PASSWORD", fornendo la pwd ottengo i dati richiesti. Da questa scheda posso ricevere solo un altro messaggio che è "PASSWORD ERRATA", quindi devo discriminare i due casi.
Nella figura che allego è visibile la parte di codice incriminata, sotto c'è il serial monitor con il debug.
Si vede che il msg che ricevo dalla scheda è la parola attesa "PASSWORD", ma l'istruzione che fa capo alla variabile posizione1 contiene sempre -1, quindi la parola ricercata non viene riconosciuta.
Ho preparato uno sketch separato in cui assegno manualmente la parola "PASSWORD" ad una variabile String e in questo caso indexOf funziona regolarmente. In entrambi i casi le variabili sono Global.
E' come se quanto ottenuto da Serial1.readString() non fosse una stringa.
Avete qualche suggerimento da darmi ?
Grazie

[EDIT]

Correggo come richiesto togliendo la figura e mettendo il segmento di programma incriminato.

if (semaforo == 1) {
    if (Serial1.available()) {
      msg = Serial1.readString();
      Serial.println(" CHECK: " + msg);
      posizione1 = msg.indexOf("PASSWORD",offset);
      posizione2 = msg.indexOf("ERRATA",offset);
      Serial.println(posizione1);
      Serial.println(posizione2);

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: il codice, come da regolamento, va inserito in forma testuale (NON immagini) e racchiuso tra gli appositi tag CODE (con l'apposito bottone <code/> nella barra degli strumenti). Grazie.

Grazie mille, provvedo subito.
Nello specifico, penso che la figura sia meglio del codice intero, che è inutilmente lungo e dispersivo per la specificità del mio problema, inoltre così posso far vedere il mio debug che altrimenti non potrei mostrare.

Grazie
Stefano

... mi spiace, ma il codice è richiesto come TESTO, così che si possa facilmente leggere, scorrere, copiare, provare, ecc. ecc. ... per il debug, si fa copia/incolla di quanto si deve mostrare e si mette sempre dentro i tag CODE ... piuttosto semplice.

Guglielmo

1 Like

Salve, ho fatto quanto richiesto.
Visto che il paragrafo 16.11 del regolamento vieta la mia domanda, direi che potete cancellare tutto.
Saluti
Stefano

ESP32 è piattaforma che normalmente supportiamo visto che li usa Arduino stesso :grin:

Guglielmo

Grandioso, questa è un'ottima notizia ! :smiley:

Il problema di questo post è stato risolto (mi rimane un '\0' nel buffer seriale prima del messaggio atteso, e questo manda all'aria il funzionamento di indexOf ), magari torno all'assalto con i prossimi problemi che già vedo all'orizzonte... :zipper_mouth_face:

Grazie mille, a presto
Stefano

Bene che tu abbia risolto, ma come ti è stato detto ricorda che devi postare il codice come testo (racchiuso tra i tag "code") e non come immagine.

Questo per facilitare le cose a chi vuole cercare di aiutarti: non pretenderai mica che si metta a ridigitare tutto il tuo codice per poterlo provare e magari darti pezzi di codice da modificare, no? Inoltre il tuo problema potrebbe essere uguale o simile a quello di altri, per cui oltre a descrivere come lo hai risolto, postando il tuo codice e magari anche la tua soluzione, puoi a tua volta aiutare anche gli altri.

Il forum non è "a senso unico", tutti collaborano per aiutarci a vicenda. Per cui magari fai questa cosa anche qui, posta il tuo "nuovo" codice (nei tag "code" mi raccomando) e spiega come hai risolto.
Grazie.

1 Like

Risolto, in pratica ogni volta la stringa ricevuta iniziava con un carattere indesiderato che vedevo nel monitor seriale come un quadrato. Probabilmente era un '\0', causando l'uscita prematura di indexOf. Ho risolto come segue, introducendo la variabile Offset che mi permette di saltare il primo carattere della stringa se questo è, appunto, un '\0'.

if (semaforo == 1) {
    if (Serial1.available()) {
      msg = Serial1.readString();
      Serial.println(" CHECK: " + msg);
      posizione1 = msg.indexOf('\0');
      if (posizione1 == 0){
        offset = 1;
      }
      else {
        offset = 0;
      }
      posizione1 = msg.indexOf("PASSWORD",offset);
      posizione2 = msg.indexOf("ERRATA",offset);
      Serial.println(posizione1);
      Serial.println(posizione2);

Potevi anche fare così:

byte offset = 0;
if('\0'==msg[0])
{
  offset++;
}

Stesso risultato meno variabili e più performance :slight_smile:

Diciamo che hai corretto le conseguenze, non il problema, un po' come dire che ho una crepa sul muro e ci metto un quadro sopra...

Perché la readString() ti legge un carattere anomalo (per di più come primo carattere)? Cosa dovrebbe leggere, e da cosa viene generata la stringa seriale?
Perché non posti tutto il codice, così capiamo meglio e magari ti possiamo dare qualche indicazione migliore del perché hai una crepa sul muro? :wink:

La stringa arriva da una scheda di terzi che non può essere modificata.
Posso solo agire su quello che arriva una volta ricevuto.
Non posso mostrare niente, ho dei vincoli di riservatezza, ma grazie comunque.

[EDIT]
Ho verificato la stringa, arriva pulita senza alcun disturbo. Dando per scontato che le funzioni stringa che ho usato non facciano scherzi strani, mi viene da sospettare del driver 485 nel momento in cui si commuta la direzione di trasferimento dei dati. Verificherò.
Buon fine settimana.