[RISOLTO] Concatenare valori "INT" letti da Serial.read()

Ciao a tutti... sto usando questi display della Nextion.
Usare le loro librerie sembra più complesso che andare su Marte a piedi, anche perchè purtroppo la documentazione che hanno prodotto è molto scarna.

Comunque sia, comunicando via seriale, questo non è un dramma (almeno visto l'applicazione che devo fare), almeno per il momento!

Con questo codice:

int incomingByte;

void setup() {
        Serial2.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

        // send data only when you receive data:
        if (Serial2.available() > 0) {
                // read the incoming byte:
                delay(100);
                incomingByte = Serial2.read();
                // say what you got:

                Serial.println(incomingByte);

        }

}

ottengo questo risultato dal monitor seriale:

101
1
4
1
255
255
255

come posso "concatenare" questi valori per avere una stringa del tipo

101141255255255

non sarà elegante, ma corrisponde alla lettura HEX del pulsante premuto. Se riuscissi a metterli in una stringa, potrei poi fare comparazioni con if....else e quindi poter proseguire!

grazie mille!! :slight_smile:

La stessa cosa che si fa con un webserver, se vuoi una stringa, purchè non sia troppo lunga

string readString="";  //non metterla pubblica, ma privata

while ((c = client.read())>0){
           readString += (char)c;
            // if((char)c=='\n') readString="";        
       }
//-------------------------
      Serial.println(readString); // debug
//   qui codice di confronto
//--------------------------

readString è una stringa, quello che hai tu "int incomingByte;" sono singoli interi

Ciao e grazie per la risposta!

Il problema è che se uso serial.readString, chiaramente "incomingByte" dovrà essere una String e non un int. Bene, non so per quale oscura ragione, se uso String e non int su "incomingByte", dal serial monitor ad ogni pressione di touchscreen ho una serie di simboli senza senso alcuno....... ho provato di tutto, va solo con INT.

Con questo codice:

char incomingByte = 0;

void setup() {
        Serial2.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

        // send data only when you receive data:
        if (Serial2.available() > 0) {
                // read the incoming byte:
                delay(100);
                incomingByte = Serial2.read();
                // say what you got:
                Serial.println(incomingByte, HEX);
        }

}

Il risultato è questo:

65
1
4
1
FFFFFFFF
FFFFFFFF
FFFFFFFF

quindi ora anche con il tipo char, HEX riesco ad ottenere qualcosa.
Solo vorrei concatenare tutte queste singole letture in una stringa, per poterla usare per le dichiarazioni if....else.

Premessa da seriale leggi solo "una sequenza di caratteri", se scrivi 11 o AA , sono sempre caratteri inviati uno alla volta.
Se vuoi un numero, ricevi una stringa con caratteri numerici e poi la trasformi in un numero intero.
Puoi usare un oggetto string e relativi metodi o usare stringhe stile linguaggio C, array di char.

Esempio invio numero intero da seriale. Da serial monitor impostare il terminatore riga newline \n
per sapere quando si è terminato la stringa, dovrebbe essere in basso a destra del serial monitor

char c = 0;
char Numero[20];
int i=0;

void setup() {
        Serial2.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

        
        if (Serial2.available() > 0) {
                do{
                        if(Serial2.aviable())
                                c = Serial2.read();
                        if(c!='\n')
                                 Numero[i++]=c;
                 }while(c!='\n');

                 Numero[i]='\0';  //terminatore stringa stile C

                 i=0;   // Azzero variabile per successiva lettura
              
        }

        // Qui posso confrontare la stringa mediante la funzione C strcmp()

       if(strcmp(Numero,"2345")==0) //il confronto è tra stringhe "2345" è una stringa con caratteri numerici
               digitalWrite(led,HIGH);//faccio qualcosa

}

Ciao e grazie per la risposta! Ho provato con il codice così modificato per fare dei test:

char c = 0;
char Numero[20];
int i=0;

void setup()
{
        Serial2.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

        
        if (Serial2.available() > 0) {
                do{
                        if(Serial2.available())
                        c = Serial2.read();
                        if(c!='\n')
                        Numero[i++]=c;
                   }
                   
                 while(c!='\n');
                 Numero[i]='\0';  //terminatore stringa stile C
                 
                 Serial.print(Numero[i]);
                 i=0;   // Azzero variabile per successiva lettura
              
        }

ma il serial monitor mi rimane vuoto..... non capisco perchè.

tu stampi Numero un singolo carattere,IL CARATTERE TERMINATORE che è un carattere non stampabile, quindi non lo vedi nel serial monitor....
prova a verificare alla fine, ricordati di selezionare il terminatore nel serial monitor, in basso a destra
newline o '\n' fine riga, altrimenti non funziona...
```
*void setup() {
        Serial2.begin(9600);    // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

if (Serial2.available() > 0) {
                do{
                        if(Serial2.aviable())
                                c = Serial2.read();
                        if(c!='\n')
                                Numero[i++]=c;
                }while(c!='\n');

Numero[i]='\0';  //terminatore stringa stile C

i=0;  // Azzero variabile per successiva lettura
             
        }

// Qui ha finito di ricevere e puoi inviare al serial monitor ciò che hai letto
        Serial2.println(Numero);

}*
```

Nulla....

char c = 0;
char Numero[20];
int i=0;

void setup() {
        Serial2.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.begin(9600);
}

void loop() {

        
        if (Serial2.available() > 0) {
                do{
                        if(Serial2.available())
                                c = Serial2.read();
                        if(c!='\n')
                                 Numero[i++]=c;
                 }while(c!='\n');

                 Numero[i]='\0';  //terminatore stringa stile C

                 i=0;   // Azzero variabile per successiva lettura
              
        }

        // Qui ha finito di ricevere e puoi inviare al serial monitor ciò che hai letto
        Serial.println(Numero);

       

}

Il serial monitor rimane bianco. Ovviamente ho selezionato SCORRIMENTO AUTOMATICO e A CAPO (NL)...

Prova a mettere un delay(2000); dopo aver stampato la riga.

Serial.println(Numero); o Serial2.println(Numero);

Io ho solo arduino UNO e Provato funziona, fammi sapere...

Scusa ma come fai a prendere dei char dalla seriale e metterli dentro un INT?
tra l'altro ci sono caratteri che non vedi tipo \n e \r ma che hanno un peso e non sono dei numeri.
che risultato potrai ottenere?
Superi anche il limite di overflow dell'INT mettendo dentro numeri a caso
Inoltre INT se non specificato unsigned va da -32,768 to 32,767 è il numero massimo che può contenere
Se invece lo metti unsigned va da 0 a 65535 ... se tu mi ci metti 11 45 60 sei già in overflow tralasciamo \n\r che non ho idea di come lo piazza nell'int

Hai detto che vuoi una stringa?

int numero = 65000 è un numero intero
string mystring = "111589421" è una stringa

Vuoi concatenare i char in arrivo dalla seriale su una stringa?
ti ho dato il pezzo è solo quello non c'è altro
A meno che non vuoi mettere il tutto in un array di char che è una procedura diversa, ma se devi confrontare 2 stringhe poi l'array va comunque convertito in string

spiega meglio cosa vuoi fare

Scusami pablos, hai ragione....

Allora, io ho questo display Nextion che comunica con l'Arduino MEGA via seriale.

Ogni qualvolta premo un tasto, il display invia una serie di dati ad Arduino. Io devo leggere questi dati e confrontarli con altri dati che avrò impostato in cicli di if....else, in modo da far "riconoscere" i comandi ad Arduino.

Quindi premo freccia su (sul display) -> evento su arduino
freccia giù (sul display) -> evento su arduino

e così via....

"2 stringhe poi l'array va comunque convertito in string"

NON è VERO!

da seriale arrivano solo byte quindi caratteri o il loro codice ascii , devi comunque ricevere una stringa, sia questa composta da caratteri alfabetici o caratteri numerici, poi se ti necessita un numero, devi convertire tramite metodo della classe string, o tramite funzione atoi() del C.
per confrontare due stringhe in stile C, si usa la funzione strcmp(), come ho mostrato da esempio, senza bisogno di convertire NIENTE!!!!.

Come detto più volte, su un microcontrollore è meglio usare array di char piuttosto che oggetti string.

Se si ha bisogno di un intero, inserisci una stringa di caratteri numerici che possa essere contenuto in un int, e poi lo trasformi con atoi() in un int.

L' esempio SE SI FA UN COPIA E INCOLLA, SI COPI l'esempio appropriato... dall'esempio postato da qualcuno, si fa riferimento alla classe client e visto che ha il metodo read == a serial, non esiste nessuna conversione di una stringa in un numero, quindi l'esempio è utile solo per "COME CONCATENARE UN CARATTERE A UNA VARIABILE STRING"

Il problema credo sia nell'uso di Serial2, devi usare solo Serial con monitor seriale, non so il perché dovresti documentarti tu, quindi sostituire tutti Serial2 con Serial, e tutto dovrebbe funzionare...

Come detto il codice che ti ho postato funziona perché l'ho testato, quindi il problema non è nel codice di esempio ma da ricercare altrove, presumo forse sull'uso di Serial2

void setup() {
        
        Serial.begin(9600);
}

void loop() {

        
        if (Serial.available() > 0) {
                do{
                        if(Serial.available())
                                c = Serial.read();
                        if(c!='\n')
                                 Numero[i++]=c;
                 }while(c!='\n');

                 Numero[i]='\0';  //terminatore stringa stile C

                 i=0;   // Azzero variabile per successiva lettura
              
        }

        // Qui ha finito di ricevere e puoi inviare al serial monitor ciò che hai letto
        Serial.println(Numero);

       if(strcmp(Numero,"12344")==0)// confronto tra array char tramite funzione strcmp()

            ; //faccio quello che devo fare ricevendo il comando numerico

}

torn24 intanto non ti agitare e non scrivere in modo imperativo con maiuscole e punti esclamativi, di la tua se devi dirla ma non fare la voce grossa...poi, sono 8 caratteri e ha una MEGA santa pazienza ... dal titolo leggo concatenare, dal testo una stringa, comunque va bene, fallo con i char, fagli confrontare gli array ecc ecc, spiegaglielo bene con puntatori e tutto io sto a guardare.

Ma pensa te questo!

ciao

Non volevo essere scortese e tantomeno arrogante , casomai mi scuso :slight_smile:

Va bene ti perdono .... ahahhahahah

Ciao ragazzi e grazie per l'aiuto che state provando a darmi... è la prima volta che mi avventuro con questi display e sono un pò in difficoltà....

Allora, ho provato anche disabilitando la serial2 e connettendo il display alla serial del MEGA (TX1 - RX1). Il motivo per cui usavo la serial2 è il debug.

A me in pratica serve leggere i valori della serial2, in modo tale da poter fare un confronto fra i char che mi arrivano dalla seriale e dei char che imposterò nel codice. Questo in modo da poter ricollegare la pressione di un pulsante sul touch ad una funzione (variare una PWM in questo caso).

Ora devo capire una cosa: questi char che mi arrivano dalla seriale, come già inserito nei precedenti post:

65
1
4
1
FFFFFFFF
FFFFFFFF
FFFFFFFF

sono, deduco, formattati in questo modo:

65\n
1\n
4\n
1\n
FFFFFFFF\n
FFFFFFFF\n
FFFFFFFF\n

a me serve averli in un'unica stringa (che è chiaramente una variabile, visto che il contenuto della stringa varia e va poi confrontato). Come posso fare? Grazie mille e scusatemi.....

Perdona dokke ... ma ti sei studiato tutti i tutorials che si trovano nella sezione del loro blog dedicata al collegamento con Arduino ed all'uso della libreria ? ? ?

"NEXTION TUTORIAL-BASED ON NEXTION ARDUINO LIBRARY" ... c'è veramente di tutto e di più, inclusi un bel po' di esempi ...

Guglielmo

Ciao Guglielmo, ho letto i loro tutorial ma mi sembrano fatti con i piedi.

Il codice non è commentato, è sbattuto là per un copia e incolla pedestre (e non mi serve copiare e incollare, io vorrei capire). Inoltre io non sto usando le loro librerie, perchè mi sembra che complichino il programma in maniera eccessiva...

Alla fine devo fare una cosa tutto sommato "semplice" (per chi lo sa fare!), ovvero leggere dei dati dalla seriale (e in questo sono riuscito) e confrontarli con dei dati pre-impostati nel programma.

A me quel codice sembra incasini le cose, piuttosto che semplificarle.....

Alla fine la parte della lettura l'ho risolta....

Eliminando il serial.println ed eliminando LN dalla console, i dati arrivano già in "treni".

Ora proverò a confrontare i dati letti dalla seriale con quelli impostati, e vi farò sapere. A me sembra molto più intelligibile, comunque, usare la seriale nuda e cruda piuttosto che le loro librerie....