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);
}
è 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!
Uso stringhe stile C array di char
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
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;
}
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;
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