per farla breve ho u ESP8266 precaricato in STANDALONE, a cui ho detto di mandarmi una stringa sulla serial1.
Ad esempio "Pulsante 1 =" ed i valore del Pulsante che potrebbe essere all'infinito(per esagerare).
Ora mi ritrovo che leggo correttamente sulla Serial di Arduino la stringa. questo va bene se devo usare pochi valori del Pulsante...ad es... if(Pulsante==1){FAI QUESTO;}... if(Pulsante==5){FAI ALTRO;}...ect ect.
Ora però vorrei eliminare dalla Stringa che leggo sulla Serial, tutta la dicitura e mantener solo il valore finale.
Se sull'ESP hai caricato il programma che invia la stringa composta come hai dichiarata e devi cambiare la stringa da inviare è necessario riprogrammare l'ESP per non inviare le informazioni non necessarie.
Se invece il caricare il canale di trasmissione con informazioni innutili non è un problema ma la sola valutazione di quanto è in arrivo allora creando un piccolo parser puoi scomporre la stringa in sottostringe da analizzare ovvero se le stringe sono:
Sapendo che la prima parte è sempre e comunque pulsante cerchi la posizione del carattere '=' e prelevi la parte di stringa compresa tra la fine della parola fissa Pulsante e la posizione del carattere '='. Stessa cosa per interpretare i valori, estrapoli quello che viene dopo il carattere '='.
Ho indicato stringhe ma per chiarezza non intendo la classe String ma array di caratteri da manipolare con le apposite funzioni c
Ho capito la tua esigenza oppure no?
Si TU hai capito la mia esigenza, ma IO con ho capito cosa mi hai detto .
In pratica su ESP ho detto di prendere una serie di CHAR, che contengono una scritta tra virgolette tipo"...ciao bello1=" ed un valore ..tipo Valore e concatenarle in una STRING.
Poi su Arduino mi scrive la STRING, che appare cosi...ciao bello1=valore(che può essere all'infinito per esagerare).....
Io vorrei eliminare ..."ciao bello1="... e mantenere solo il valore.
Allora se riprogrammi l'ESP cambi il protocollo di trasmissione e se a posto, ovvero invece di mandare
Pulsante1=10
Pulsante2=33
Pulsante3=7
invii solo il necessario Es.
1=10
2=33
3=7
In ricezione dividi numero del pulsante dal valore ad esempio eando la funzione strtok che al primo impatto non è semplicissima da capire ma in realtà è semplice, studiandola qualche minuto si capisce come usarla
Se invece, come hai richiesto nel primo post, NON vuoi riprogrammare l'ESP allora non ti resta che trattare le stringhe in arrivo per escludere tutte le informazioni che non ti servono (Nel tuo caso la stringa Pulsante che precede il numero)
Se non ho capito male il i tuoi invii sono sempre del tipo
Pulsante1=10
Pulsante2=33
Pulsante3=7
Quindi devi copiarti parte della stringa in arrivo dalla seriale in un altro array di char andando ad escludere la prima parte (Pulsante). Questo lo fai con la funzione strncpy, leggiti, anzi meglio, studiati anche questo che è proprio il tuo caso.
Alla fine avrai una stringa che conterrà solo solo il numero del pulsante, l'uguale e il valore.
A questo punto procederai come indicato in precedenza con la strtok per perarare numero del pulsante e valore e a usare le due informazioni per fare ciò che desideri.
Avendo a quel punto due strighe con numero del pulsante e valore puoi convertirli da array di char a numerico (interi, float, long dipende dai valori che possono assumere) con le funzoni apposite (Es. atoi, atof, ecc.).
Insomma se non hai ancora affrontato la manipolazione delle stringhe qui hai l'ocasione di imparare avendo messo un bel po' di carne al fuoco
In realtà è più difficile del previsto, (prove fatte senza modificare ESP in STANDALONE).
Il problema è che usando un Joystik Virtuale, nella stringa leggo ad esempio"PULS_1=106PULS_2=57"
Ricapitolando:
-Se uso un solo pulsante e ricopio la stringa in un array sembra funzionare(mi è bastato leggere L'array
escludendo le caselle"PULS_1="...quindi mi leggo il valore e me lo copio in una variabile.
-Ma usando un Joystik Virtuale mi ritrovo il"PULS_2=57", quindi se" PULS_1=ha meno di 3 cifre", il puntatore dell'array,mi legge comunque 3 postazioni.
Mi spiego meglio,ipotizzando che PULS_1= sia uguale ad 7.......ed escludendo PULS_1=, mi torna 7PU.
Usa la logica luke! quando i dati non sono fissi mai ipotizzare una lughezza determinata (2,3 cifre) perché il fallimento è dietro l'angolo.
Ti ho suggerito si usare la strtok per dividere la stringa cercando il carattere '=' se inviavi 1=12, 2=33, ecc. oppure la combinazione delle funzioni per escludere pulsante all'inizio della stringa, hai un altro carattere che si ripete che ti separa il pulsante dal suo indice? Se si usalo per separare la stringa completa in sottostighe da elaborare cercando l'uguale e eliminando eventuali parti non desiderata all'inizio o alla fine (Es. la stringa pulsante), pensaci hai un carattere a parte l'uguale con cui puoi suddividere la stringa?
Oddio, ma perché programmate dei protocolli di comunicazione che servono a dei PROGRAMMI come se fossero per un UMANO?
Ti basta buttare giù un semplice protocollino fatto così, ossia 3 byte:
Pnv
Il primo carattere "P" indica "Pulsante premuto" (in futuro puoi estendere questo protocollo per includere altri eventi), il byte successivo "n" contiene il numero pulsante (hai fino a 255 pulsanti definibili) e "v" il valore (anche questo in un byte se ti basta da 0 a 255, altrimenti ne prevedi due e puoi arrivare a 65535).
In questo modo in base al tipo di evento (in questo caso solo "P") la lunghezza del messaggio è nota e fissa, ed eviti tutte le palle legate a reinterpretare cose che sono chiare per un umano ma una seccatura per un programma...
Io consiglio strchr() (e/o eventualmente strrchr()) invece di strtok(), però serve prima capire come funzionano le stringhe C. Metti da parte tutti i progetti e investi un po' di tempo a fare esperimenti in questo senso.
Puso:
Gia fatto.....infatti usavo la P se era al puntatore 0 per mettere a 0 una variabile.....poi usavo = per mettere ad 1 la variabile. e con la variabile mi leggevo l'array di copia.
Scusa ma non ho capito bene cosa intendi. Perché non posti il tuo codice, così vediamo di capire meglio?