problema lettura seriale

buona sera a tutti…
non riesco proprio a capire dov’è il problema!!!
DEvo semplicemente leggere un numero inserito nel serial monitor e ristamparlo sul monitor stesso.
Una volta su 3 quando inserisco un numero con più di una cifra, mi legge solo la prima,
il ciclo while finisce dopo aver letto il primo carattere!!
lo sketch:

#define serial_req_sz 10

char serial_req[serial_req_sz];
int index=0;
int token=0;

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

void loop() {
  Serial.println(token);
}

void serialEvent() {
  while (Serial.available()) {   
    char inChar = (char)Serial.read();
    serial_req[index]= inChar;
    index++;
    }
    index=0;
    token=atoi(serial_req);
    for (int i = 0; i < serial_req_sz; i++) {
      serial_req[i] = '\0';
    }
}

forse è necessario qualche delay ??

grazie…

toreg:
buona sera a tutti…
non riesco proprio a capire dov’è il problema!!!
DEvo semplicemente leggere un numero inserito nel serial monitor e ristamparlo sul monitor stesso.
Una volta su 3 quando inserisco un numero con più di una cifra, mi legge solo la prima,
il ciclo while finisce dopo aver letto il primo carattere!!
lo sketch:

#define serial_req_sz 10

char serial_req[serial_req_sz];
int index=0;
int token=0;

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

void loop() {
  Serial.println(token);
}

void serialEvent() {
  while (Serial.available()) { 
    char inChar = (char)Serial.read();
    serial_req[index]= inChar;
    index++;
    }
    index=0;
    token=atoi(serial_req);
    for (int i = 0; i < serial_req_sz; i++) {
      serial_req[i] = ‘\0’;
    }
}




forse è necessario qualche delay ??

grazie..

stò utilizzando un Arduino Uno…

Stesso problema del post problema con Serial.available() - Software - Arduino Forum. Serial.available restituisce il numero di byte già arrivati, non di quelli ancora in viaggio :wink:

buongiorno
grazie Claudio, hai confermato il mio sospetto sulla “lentezza” del seriale.
Ho inserito un delay di 50ms nella funzione e sembra funzionare benissimo!!
Anch’io come Deltone avevo inserito dei Serial.print per il debug ed ero arrivato al punto
che il serial.available desse “0” o “1” e non il numero di byte da leggere :slight_smile:
grazie mille…

void serialEvent() {
  delay(50);
  while (Serial.available()) {   
    char inChar = (char)Serial.read();
    serial_req[index]= inChar;
    index++;
    }
    index=0;
    token=atoi(serial_req);
    for (int i = 0; i < serial_req_sz; i++) {
      serial_req[i] = '\0';
    }
}

Funziona solo perché:

  • non è una trasmissione dati continua
  • i dati completi arrivano sempre entro 50ms dal primo byte
  • al resto del programma quei 50ms di ritardo non danno fastidio

PS: per azzerare una stringa C basta mettere \0 nella prima posizione, il resto viene ignorato.

Claudio_FF:
Funziona solo perché:

  • non è una trasmissione dati continua
  • i dati completi arrivano sempre entro 50ms dal primo byte
  • al resto del programma quei 50ms di ritardo non danno fastidio

PS: per azzerare una stringa C basta mettere \0 nella prima posizione, il resto viene ignorato.

\0…solo nella prima posizione!!!
ho imparato un altra cosa…
grazie mille!

Claudio_FF:
Funziona solo perché:

  • non è una trasmissione dati continua
  • i dati completi arrivano sempre entro 50ms dal primo byte
  • al resto del programma quei 50ms di ritardo non danno fastidio

PS: per azzerare una stringa C basta mettere \0 nella prima posizione, il resto viene ignorato.

scusa Claudio ho provato ad azzerare la stringa con
serial_req[0] = '\0';
ma se la riscrivo con una stringa più corta della precedente, riescono fuori i vecchi caratteri non sovrascritti!
Che faccio?

ma quando riscrivi la stringa più corta ci aggiungi il carattere di fine stringa '\0' ? :wink:

Patrick_M:
ma quando riscrivi la stringa più corta ci aggiungi il carattere di fine stringa '\0' ? :wink:

e no!! come puoi vedere nello sketch che ho postato, per azzerare la stringa scrivo \0 in tutte le posizioni della stringa, così poi viene in automatico :slight_smile:

troppo barbaro come metodo?!

siccome il terminatore di stringa è il \0, non serve scriverlo in tutte le posizioni... lo scrivi alla fine della stringa
e quindi per azzerare la stringa lo scrivi in posizione zero
e per le altre stringhe lo aggiungi alla fine
molto più pratico :smiley:

così facendo in realtà non devi nemmeno azzerare la stringa in quanto se è più corta della precedente il nuovo terminatore farà da "termine"... scusa il bisticcio.
se la nuova stringa è più lunga, il vecchio terminatore verrà sovrascritto
per cui in ogni caso non ti dovrai preoccupare di quello che c'era scritto prima... :wink:

Una sequenza di caratteri senza il \0 finale NON è una stringa C valida :wink: Se dai byte ricevuti via seriale non c'è modo di riconoscere la fine, allora si, ha senso azzerare preventivamente tutte le posizioni (e in un array da 10 elementi ci possono stare 9 caratteri validi).

capito…dovrò adeguare tutti i miei sketch alla sintassi corretta :confused: grrrr
grazie ad entrambi