problemi con seriale

Salve a tutti, sto facendo degli esperimenti con dei moduli TX/rx rf433Mhz.
Sto trasmettendo due stringhe “X1234” e “X4321”
questo è il codice:

#include <SoftwareSerial.h>

int  car[3] ;
int carattere;

void setup(){
Serial.begin(2400);

}


void loop(){
  riprova:
  for (int i = 0; i < 4; i++) {
      car[i] = 0;
  }
  if (Serial.available()){
    if (char(Serial.read()) != 'X'){
        goto riprova;
    }
    if (char(Serial.read()) != '1'){
        goto riprova;
    }
    car[0] = Serial.read(); // Then: Get them. 
    car[1] = Serial.read(); // Then: Get them. 
    car[2] = Serial.read(); // Then: Get them. 
    Serial.print(char(car[0]));
    Serial.print(char(car[1]));
    Serial.println(char(car[2]));
    }
  }

Se cancello la seconda if tutto funziona, se la mantengo non funziona.
Ho provato con una funzione, ad associare ad un’altra variabile, ma niente… avete qualche suggerimento???
Saluti e grazie Jimi Dini

da ignorante.. Perchè verifichi la diversità rispetto ad '1'? Diverso da x lo capisco.. Poi, non ti conviene svuotare il buffer nel caso le condizioni non siano vere? Perchè altrimenti ti tocca leggere tutta la stringa e poi ricomincia.. Credo!

    if (char(Serial.read()) != '1'){
        goto riprova;
    }

A parte l'uso dei goto, che mi crea scompensi ormonali ;) Se verifichi l'esistenza di "1" e non di "4" dovrebbe passare solo al prima delle 2 stringhe che ti servono. Sempre che una delle X1234 o X4321 passi ;)

rubino25: da ignorante.. Perchè verifichi la diversità rispetto ad '1'? Diverso da x lo capisco.. Poi, non ti conviene svuotare il buffer nel caso le condizioni non siano vere? Perchè altrimenti ti tocca leggere tutta la stringa e poi ricomincia.. Credo!

mi serve come discriminante per una funzione futura, del tipo se arriva 1 fai questo, se arriva 2 etc... al momento la trasmissione è fissa per pura comodità... Perchè dici che devo leggere tutta la stringa??? in realtà io vedo se il primo carattere è "x" e vado avanti altrimenti ricomincio subito con la lettura, poi identifico il secondo carattere e se è corretto proseguo con la lettura altrimenti ricomincio... leggo tutto solo se le prime due condizioni sono valide... saluti e grazie Jimi Dini

Stilgar:     if (char(Serial.read()) != '1'){         goto riprova;     }

A parte l'uso dei goto, che mi crea scompensi ormonali ;) Se verifichi l'esistenza di "1" e non di "4" dovrebbe passare solo al prima delle 2 stringhe che ti servono. Sempre che una delle X1234 o X4321 passi ;)

In realtà la X mi serve per identificare l'inizio del comando, il secondo carattere il gruppo, e gli ultimi tre un valore... la cosa che non capisco, è perchè non funzionano insieme, ho anche provato a fare la if solo sul secondo carattere, e funziona, ma se metto entrambe le if non fa niente... Grazie e saluti Jimi Dini

Vediamo se ho capito.

void loop()
{
  char commandHeader = 0;
  char commandGroup  = 0;
  char data[3];
  
  if (Serial.available())
  {
    for (int i = 0; i < 3; i++) 
    {
      data[i] = 0;
    }
    commandHeader = Serial.read();
    if (commandHeader =='X')
    {
      commandGroup  = Serial.read();
      if (commandGroup == '1') 
      {
        data[0] = Serial.read(); // Then: Get them. 
        data[1] = Serial.read(); // Then: Get them. 
        data[2] = Serial.read(); // Then: Get them. 
        Serial.print(char(data[0]));
        Serial.print(char(data[1]));
        Serial.println(char(data[2]));
      }
    }
  }
}

Stilgar: Vediamo se ho capito.

Hai capito perfettamente e ti ringrazio molto.... ma.... non funziona... stesso problema di prima, se tolgo il secondo giro, per intenderci il commandgroup, funziona tutto bene, se lo lascio non fa niente... Grazie mille e saluti Jimi Dini

Ma i caratteri ... vengono letti correttamente? Da dove capisci che non fa nulla? Dal fatto che non vedi nulla sulla console della seriale?

Al momento i caratteri non vengono letti bene, ma quello non è un gran problema è solo la conversione in ascii, non mi preoccupa molto. Sulla console seriale, se togli la if della commandgroup funziona tutto e si vedono i caratteri, se la lasci... non si vede nulla... Non riesco a spiegarmi questa cosa... in fondo sono due if... ho cercato anche di leggere i primi due caratteri e fare il confronto con le due if congiungendole con && ma niente.. sembra quasi che non accetti una doppia if, ma mi sembra veramente assurdo.. Ho pensato anche che la scrittura sulla seriale potesse creare problemi alla lettura dal modulo radio ed ho messo un led di test giusto per vedere se l'esecuzione arrivava fino alla lettura degli ultimi tre caratteri... ma niente... Grazie e saluti Jimi dini

Fatti stampare a console cosa legge la seconda volta :D

Stilgar: Fatti stampare a console cosa legge la seconda volta :D

in che senso??? la stampa della lettura con entrambe le if è nulla, non si accende neanche il led sulla scheda per la ricezione. Se invece ne tolgo una si accende il led e sulla console appaiono i caratteri... Grazie e saluti Jimi Dini

commandHeader = Serial.read();
Serial.println((int)commandHeader);

commandGroup  = Serial.read();
Serial.println((int)commandGroup  );

Così vedi il codice numerico del carattere, senza che venga interpretato dalla console ;)

Stilgar: Così vedi il codice numerico del carattere, senza che venga interpretato dalla console ;)

Dopo aver provato e provato più volte sono finalmente riuscito a farlo funzionare... il codice è il tuo, l'unica differenza è sull'available invece che chiedere true/false ho impostato > 4. Tanti saluti e grazie mille per l'aiuto. Jimi Dini

Il check dovrebbe essere Serial.available()>0 perché basta infatti verificare che ci sia qualche carattere disponibile.

Di nulla jimidini

leo72: Il check dovrebbe essere Serial.available()>0 perché basta infatti verificare che ci sia qualche carattere disponibile.

deve essere >4, altrimenti se ci sono meno di 4 caratteri, una o più delle read ritorna -1 (nessun carattere disponibile nel buffer), e -1 nella tabella ascii...

lesto: deve essere >4, altrimenti se ci sono meno di 4 caratteri, una o più delle read ritorna -1 (nessun carattere disponibile nel buffer), e -1 nella tabella ascii...

Giustissimo... Grazie per la precisazione. Saluti Jimi Dini

hihi -1 nella tabella ascii diventa 0xFF, quindi (a seconda del Code Page, avendo superato il 127esimo carattere) hai un carattere "speciale" ;) Credo un secondo "spazio" in quasi tutte le tabelle :D Sai che casino poi :D :grin: XD