Stavo provando a ricevere un messaggio via serial, "appenderlo" a una stringa e ritornare la stringa via serial; solo che non funziona.
Il codice che ho scritto è questo e di fianco a ogni comando di reinvio al pc ho scritto il risultato che esce sulla console.
Quello che ho notato è che se uso il write il testo ritorna tale e quale mentre se uso il print/println il testo mi viene restituito come codificato in ASCII (es. 1-->49) tuttavia se uso Serial.print(1) quello che mi esce a video è 1 e non 49.
Allo stesso modo se dichiaro una variabile già con un valore mi verrà restituito giusto mentre se la "aggiorno tramite il Serial.read()" poi me lo restituirà in ASCII
es.
int a=13
Serial.println(a) // restituisce 13
int b=Serial.read()
Serial.println(b) // restituisce--> valore immesso in ASCII
A me sembrano uguali...
Avete qualche consiglio? che le pagine di referenza per read() print() ecc. non mi sono state troppo di aiuto
Francesco
ho sperimentato molto e sono riuscito a capire abbastanza bene dove era l'errore, che penso di poter ricondurre a come leggevo il read(), infatti mi sembra di aver capito che usando int a=Serial.read se inviavo ad es. 1 a diventava uguale a 49 e quindi l'errore era già li, mentre io pensavo che a sarebbe stata uguale a 1 e che poi l'errore fosse nel print()
aggiungendo println(Serial.available()) che da quello che ho letto nelle referenze dovrebbe restituire il numero di bytes disponibili da leggere mi esce(con lo stesso input di prima) sempre 1 invece di 4...3...2...1...interruzione.
è possibile che l'errore con il ciclo while sia causato da questo problema? come posso risolverlo?
Francesco
ho risolto da solo mettendo un delay di 10 ms, forse basta anche meno, da quello che ho capito una volta che il while finiva e ricontrollava il numero di byte disponibili il byte successivo non era ancora arrivato e quindi il while pensava di aver finito.
è giusta come idea o sbaglio? 8)
Esiste un buffer di ricezione, è un array in cui vengono memorizzati i caratteri man mano che arrivano dalla seriale.
Serial.available() restituisce i caratteri presenti e Serial.read() estrae il primo disponibile.
Mettiamo che stiano arrivando 2 caratteri, se tu ne prelevi uno e leggi subito dopo lo stato del buffer prima che arrivi il 2°, sicuramente il buffer lo troverai vuoto ed il ciclo uscirà. Aumentando la velocità di spedizione, forse riesci a far arrivare entrambi i caratteri prima che venga letta la disponibilità dopo il prelevamento del 1°.
Sono test che devi condurre. Prova a mettere 57600 (sia su trasmettitore che su Arduino) e guarda un po'.