Serial.read() di stringhe

Salva a tutti !
Ho bisogno di leggere dei valori di due joystick che invio tramite seriale. Siccome di conseguenza ho 4 valori(xleft,yleft,xright,yright)
devo riuscire a riconoscere a quale asse appartiene il valore.
Es.:
xl:250
yr:30
Come faccio quindi a leggere le stringhe dal seriale e successivamente confrontarle conseiderando che la lunghezza è variabile ?
Ho pensato ad un codice del genere che potrei memorizzare ogni carattere in un array ma come dicevo prima la lunghezza è variabile.
Consigli ?

Prova una cosa del genere:

Serial.begin(9600); //inizializzazione della comunicazione seriale
String testo = ""; //creazione di una stringa vuota

while ( Serial.available() ) 
{
      testo = testo + (char)Serial.read(); //concatenazione del nuovo carattere con i precedenti
}

La trasmissione seriale comunica ad ogni lettura un carattere, e quindi un char, ma se vengono inviati più caratteri, questi rimarranno nel buffer di trasmissione, e quindi la connessione seriale sarà ancora disponibile dopo l'inivio del primo carattere, questo significa che ad una seconda lettura da seriale, otterrai il secondo carattere da concatenare al primo nella stringa del testo... e così via fino all'ultimo...

seppe

seppe:
Prova una cosa del genere:

Serial.begin(9600); //inizializzazione della comunicazione seriale

String testo = ""; //creazione di una stringa vuota

while ( Serial.available() )
{
      testo = testo + (char)Serial.read(); //concatenazione del nuovo carattere con i precedenti
}




La trasmissione seriale comunica ad ogni lettura un carattere, e quindi un char, ma se vengono inviati più caratteri, questi rimarranno nel buffer di trasmissione, e quindi la connessione seriale sarà ancora disponibile dopo l'inivio del primo carattere, questo significa che ad una seconda lettura da seriale, otterrai il secondo carattere da concatenare al primo nella stringa del testo... e così via fino all'ultimo...

seppe

Grande, funziona :smiley:
Una cosa.. non c'è modo di aprire il monitor seriale mentre lo sta usando il python vero ?

Ciao,

Una cosa.. non c'è modo di aprire il monitor seriale mentre lo sta usando il python vero ?

Puoi utilizzare un software per il monitotaggio delle porte seriali (cerca serial monitor o serial sniffer in Google) come, ad esempio, questi:

Vi e' anche una versione piu' recente (DMS).

Poi hanno fatto la versione a pagamento Serial Port Monitor - COM port sniffer & analyzer

Puoi sempre utilizzare anche le trial edition che forniscono quasi tutte le software house (in genere per un 30gg).

Controlla prima se possono funzionare con la versione di Windows che hai.

Prima devi avviare il serial monitor e poi apri la comunicazione da Python o altro software.

Ciao,
Marco.

Sembra funzionare, anche se ancora devo smanettarci :smiley:

Comunque adesso ho un altro problema.I valori che mando sul seriale sono del genere:
stick: 80,80,80,70
stick:30,80,80,75
e siccome sono quasi in trasmissione continua devo stoppare il ciclo while che mi aveva postato seppe per salvare la prima "ondata" di valori e fare i miei calcoli.
Di conseguenza alla fine di ogni print sul seriale metto un ';' quindi: stick: 80,80,80,70;
in modo da intercettare la fine della stringa con il seguente codice:

String lettura="";
  while(Serial.available() && (char)Serial.read() !=';' ){
    lettura+=(char)Serial.read();
  }
  Serial.println(lettura);

Ma qualcosa va storto.. mi salta dei pezzi di stringa all'inizio e a volte non ferma il ciclo e le stringhe si concatenano !

prova ad usare una altro carattere per il fine stringa, come ad esempio # e dicci come va ...

seppe

il codice è errato.

String lettura="";
while(Serial.available() && (char)Serial.read() !=';' ){
lettura+=(char)Serial.read();
}
Serial.println(lettura);

con la prima Serial.read nel while leggi un carattere e controlli che NON sia ;
poi con l'altra Serial.read leggi UN ALTRO carattere e lo aggiungi a lettura...

si risolve così:

String lettura="";
  char lettera= Serial.read();
  while(lettera!=';' ){
    lettura+=lettera;
    while (Serial.avaiable <= 0)
      ;//attende che sia pronta almeno una nuova lettera via seriale
    lettera= Serial.read();
  }
  Serial.println(lettura);