Ciao ragazzi, per il mio progetto domotico ho bisogno di memorizzare in un array una sequenza di byte che mi invia un altro arduino. Ho googlato un po' ma non ho capito come posso fare di preciso:
Con il Serial.aviable posso sapere che il buffer è vuoto o se ci sono 1 2 3 ... byte, e questo ok, con Serial flush posso svuotare il buffer ma non capisco come posso andare a leggere i vari byte del buffer ... usando Serial.read leggo solo l'ultimo byte ricevuto giusto ?
Io ricevo dei comandi composti da 8 byte che cominciano e finiscono sempre con un byte fisso di "inizio" e "fine trasmissione"
Facciamo un esempio se il byte di inizio trasmissione è EE e il byte di fine trasmissione è EF, come faccio a memorizzare nell'array EE 00 11 22 33 44 55 EF se mi arriva una trasmissione di questo tipo: AA BB CC 12 34 EE 00 11 22 33 44 55 EF 55 66 DD ...
allora, i dati arrivano all'arduino e vengono messi in un buffer FIFO, ovvero il primo elemento messo nel buffer sarà anche il primo ad essere tolto attraverso una Serial.read(). Quini per ora il flush() non ti serve, farebbe solo perdere dati.
Prima di tutto ti serve un simbolo byte che significherà l'inizio dell'invio dell'array, e un simbolo che significherà la fine della cella dell'array.
Se conosci a priori la grandezza dell'array, ti basta leggere i dati e metterli nell'array.
Se non conosci a priori la grandezza dell'array, allora il primo elemento sarà la lunghezza dell'array, seguito dal solito metodo.
esempio, devi inviare l'array di interi:
[0] -> 12
[1] -> 11
[2] -> 7
il carattere di inizio array poniamolo a '@', quelli di fine cella '-', e la grandezza dell'array non è conosciuta a priori. La stringa di caratteri in uscita sarà @3-12-11-7- //notare che saranno inviati 9 byte, uno per ogni carattere
per conoscere il valore in byte di ogni singolo carattere basta usare la tabella ASCII, questo è molto comodo perchè qualsiasi valore, sia int che char o float o altro viene già inviato via serale codificato in questo modo, ed evita che il carattere scelto (ad esempio '@') non venga per errore inviato come altro segnale.
ad esempio se hai il byte 01000000 che corrisponde al carattere @, per saperlo con arduino basta fare
if (byteLetto=='@'){
//il carattere è @
}else{
//il carattere NON è @
}
edit: corretto un'errore sulla stringa di uscita, ovvero aggiunto la lunghezza dell'array come primo valore
ogni loop fai un while, finché ci son dati disponibili leggi l'array. devi considerare che potrebbero essere necessari più di un loop per leggere l'array, e che nel loop in cui finisci di leggere l'array potresti iniziare a leggerne un altro. Se per valori successivi invece intendi altri valori che con l'array non centrano niente, allora devi usare altri caratteri speciali tipo '@' per segnalare l'arrivo di tali valori e la fine di essi
p.s. ho corretto un'errore nel mio post precedente, nella stringa di esempio non era presente la grandezza dell'array come primo dato
Ok, risolto, posto il codice nel caso che servisse a qualcuno.
Il mio scopo era ricevere messaggi di 8 byte che iniziano sempre con un determinato caratte (in questo esempio il carattere ascii '1')
in questo esempio faccio accendere il led sul piedino 13 se ricevo una sequenza 12345678 e lo faccio spegnere se ricevo 10000000, infatti se inviamo con il serial monitor 547851234567854687 si accende il led se invece inviamo 24578965100000002453 il led si spegne. Gli altri numeri non sottolineati sono dei byte a caso che servono a dimostrare che i numeri prima del '1' e dopo l'ottavo byte non vengono considerati.