Da Serial.read a variabile

Ciao ragazzi, ho un problema che non riesco a risolvere, praticamente da un arduino UNO invio tramite seriale ad un NANO dei valori

es:11:10:00;connesso;ready

Questi valori poi li leggo tramite SerialS.read() sul NANO, fin qui tutto ok; ora questi valori li vorrei scomporre così:
var ora= 11:10:00
var stato= connesso ecc ecc

So come fare il parsing di una stringa, ma assegnando ad una variabile il valore SerialS.read() mi viene fuori un intero.

Sicuramente mi sfugge qualcosa!! Vi allego il codice che utilizzo sul nano per leggere la seriale inviata da UNO.

#include <SoftwareSerial.h>

#define SOFTTX 10
#define SOFTRX 11

SoftwareSerial SerialS(SOFTRX, SOFTTX);

void setup() {  

  pinMode(SOFTTX, OUTPUT);
  pinMode(SOFTRX, INPUT);

  delay(3000);
  
  Serial.begin(9600);
    Serial.println("Sono il nano!");
  Serial.println("Pronto a ricevere da arduino 1");
  
  SerialS.begin(9600);
}

void loop() {
  if (SerialS.available()){

    Serial.write(SerialS.read());
    
  }

delay(100);
}

Un intero o un byte?

Per quello che vuoi fare, ti basta trasmettere - e ricevere - 5 byte:

byte ora;
byte minuti;
byte secondi;
byte connesso;
byte ready;

è inutile andare a trasmettere "connesso" e poi andarlo a ricevere ricreandoti la stringa, a cosa ti serve?

A dire il vero, connesso e ready possono essere due boolean che potresti incorporare in un singolo byte ed usarne così soltanto quattro. ora - minuti - secondi - status.

Anche ora - minuti - secondi potrebbero essere compattate..

Tutti i dati che invii da seriale li puoi considerare una stringa!

  1. Uso stringhe stile C array di char
  2. Leggo tutta la stringa dati da seriale e la salvo in un array di char, ci sono esempi "come leggere stringa
    da seriale"

3)Scompongo la stringa nelle mie sottostringhe, nei dati che voglio ottenere.

Per fare questo ci sono diversi metodi

Se le sottostringhe hanno la stessa lunghezza, allora so con esattezza dove iniziano e dove finiscono.
Quindi potrei usare la funzione strncpy(), trovi esempi online sul suo utilizzo, dovrai passare il puntatore
al primo carattere della sottostringa.

Se le sottostringhe hanno lunghezza diversa, mi posso creare una funzione che scorre l'array fino ai punto e virgola usati come separatori, e salvarle in altrettanti array.

Le soluzioni ci sono bisogna vedere se hai abbastanza conoscenze per implementarle :wink:

Esempio in linguaggio C puro, non arduino....

#include <stdio.h>
 
int main(void) {
	// your code goes here
	char string[]="11:10:00;connesso;ready";
	char uno[20];
	char due[20];
	char tre[20];
	int i=0,j=0;
	for(i=0,j=0;string[i]!=';';i++,j++)
	     uno[j]=string[i];
	uno[j] =0;  
	for(i=i+1,j=0;string[i]!=';';i++,j++)
	     due[j]=string[i];
	due[j] =0; 
	for(i=i+1,j=0;string[i]!='\0';i++,j++)
	     tre[j]=string[i];
	tre[j] =0; 
	puts(uno);
	puts(due);
	puts(tre);
	return 0;
}

Però come ti hanno detto è inutile inviare comandi sotto forma di parole :slight_smile: Ti basta un byte e ottieni lo stesso risultato. Per arduino è indifferente :wink:

Segui i consigli che ti hanno dato.
In sintesi tutto quello che hai spedito viene mandato "carattere" per carattere, quindi 11 non è cifra 11 ma "1" e poi "1" ovvero il carattere numero 49 e poi di nuovo 49

Poi, anche la ora+min+sec come pensi di memorizzarla in una sola var ??
sta roba mica viene accettata dal C var ora= 11:10:00
O fai 3 variabili (spezzi le 3 componenti) oppure fai una moltiplicazione , ovvero
long ora=111045; dove l'ora è moltiplicato per 10000L e minuti per 100
long ora=1110000L+11100+45;

Ciao ragazzi, grazie per i tanti input! Ci ho lavorato un pò ma non sono riuscito a fare molti progressi...

Al momento sono riuscito a convertire la char in una stringa, ma visualizzo sono due caratteri per volta, non so il motivo; vi allego il codice:

#include <SoftwareSerial.h>
#define SOFTTX 10
#define SOFTRX 11

SoftwareSerial SerialS(SOFTRX, SOFTTX);
char incomingByte;
String miastringa;

void setup() {  

  pinMode(SOFTTX, OUTPUT);
  pinMode(SOFTRX, INPUT);
   Serial.println("Sono il nano!");
  Serial.println("Pronto a ricevere da arduino 1");

  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
  SerialS.begin(9600); // opens serial port, sets data rate to 9600 bps
}


void loop() {

if (SerialS.available() > 0) {

incomingByte = SerialS.read(); // read the incoming byte:

Serial.write(incomingByte);
 miastringa = String(incomingByte);
    Serial.println(miastringa);
delay(500);

}

}

Per quanto riguarda il fatto di passare le variabili testuali, avete ragione non serve a nulla! Quindi passo avanti!!

Per il resto potreste farmi altri esempi?

A che ti serve una String ? Da solo problemi !!

MrBrownIT:
So come fare il parsing di una stringa, ma assegnando ad una variabile il valore SerialS.read() mi viene fuori un intero.

In che linguaggio lo sai fare ?
La Serial.read() di Arduino legge 1 UN carattere alla volta, mica tutta la frase spedita !
Devi aggiungere il carattere singolo alla stringa, quando finito analizzi la stringa.
Meglio se metti nella spedizione al fondo un carattere noto, esempio @ cosi dove ricevi sai quando lo leggi che hai finito di leggere.

P.S. stringa intendo vettore di char (classico del C) non quella schifezza di String

Qualcosa del tipo (ometto la setup):

char buf[51];
int quanti=0;

void loop() { 
  if (SerialS.available() > 0)
  { incomingByte = SerialS.read(); // read the incoming byte
    // Serial.write(incomingByte);
    buf[quanti]=incomingByte;
    quanti=quanti+1;
    buf[quanti]=0;   // fine stringa
    if(quanti>50) quanti=0;
    if(incomingByte==64)  // arrivato carattere @  
    { // qui buf contiene la stringa   
      quanti=0;
    }
  }
}

Giusto, nid, preciso come sempre.
Ma a me piace di più così:

    buf[quanti++] = SerialS.read(); // read the incoming byte
    buf[quanti]=0;   // fine stringa

@docdoc, evito di metter insieme più istruzioni alla C, per non "confondere" un utente che mi pare alle prime armi :slight_smile: