nel senso interrompe il ciclo loop anche se è all'interno di un ciclo for , o aspetta che finisce il for e poi esegue le funzioni all'interno del serialEvent()?
per cui viene fatto un controllo presenza elementi buffer ad ogni termine di ciclo loop... se è presente qualcosa viene attivata la routine di gestione serialEvent()... dopo di che riattiva il ciclo loop dopo aver eseguito le funzioni presenti nella routine...
secondo me dovrebbero postare sul sito arduino sotto la voce serialEvent(), all'interno delle spiegazioni il codice da te postato...
giusto per rendere le cose molto più chiare
MatteoDerrico:
secondo me dovrebbero postare sul sito arduino sotto la voce serialEvent(), all'interno delle spiegazioni il codice da te postato...
In realtà anche tu hai quel codice ...
... è semplicemente estratto dal "core" di Arduino .. che trovi dentro l'IDE, nel main.cpp: "/hardware/arduino/avr/cores/arduino/main.cpp"
Buongiorno, sto muovendo i miei primi passi con Arduino Uno e ho trovato questo topic molto utile per rispondere anche alle mie domande su come funziona la seriale.
A questo proposito ho fatto un test sulla base del codice di esempio riportato nella pagina tutorials della serialEvent e l'ho modificato come segue:
void serialEvent() {
Serial.println("Sono in serialEvent");
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
Serial.print("Ho ricevuto: ");
Serial.println(inChar);
// add it to the inputString:
inputString += inChar;
Serial.println(inputString);
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
Serial.println("ho finito");
stringComplete = true;
}
}
}
L'output che ho ricevuto immettendo la parola "Arduino" sul monitor seriale (impostando il terminatore a NL nell'apposito menu a tendina) è stato il seguente:
Sono in serialEvent
Ho ricevuto: A
A
Sono in serialEvent
Ho ricevuto: r
Ar
Ho ricevuto: d
Ard
Ho ricevuto: u
Ardu
Ho ricevuto: i
Ardui
Ho ricevuto: n
Arduin
Ho ricevuto: o
Arduino
Ho ricevuto:
Arduino
ho finito
Quello che non riesco a spiegarmi è perchè il codice entra due volte nella serialEvent, e non una sola. In pratica è come se la Serial.Available ritorni a False subito dopo aver letto il primo carattere, anche se il buffer è ancora pieno, per poi ritornare e rimanere a True alla seconda chiamata della serialEvent, per tutta la lunghezza della stringa. Ho ottenuto lo stesso risultato per qualsiasi stringa immessa. In questo modo a mio avviso la zona di codice tra la serialEvent e la Serial.Available diventa un po' "a rischio" se non si conosce questo segreto. Ringrazio chiunque possa svelarmelo.
Ciao.
A.
@AntonioRuocco: essendo il tuo primo post, ti chiederei cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.
Quando invii qualcosa sulla seriale impiega tempo, nel tuo caso il primo serialEvent rileva che è arrivato un carattere e escr ma nel frattempo arrivano altri caratteri e quindi riesci a completare l'operazione con il sucessivo evento.
Ciao!
No, no, non sono io che lo faccio stampare 2 volte. L'unico modo per stampare il messaggio "Sono in serialEvent" è quello di uscire dalla serialEvent e rientrarci una seconda volta. Non ci sono altri modi, e una volta che il buffer è pieno il programma fa il suo corso senza ulteriore controllo da parte mia. Si, posso dare ragione a vbextreme, mi sembra l'unica spiegazione plausibile al momento, anche se ho ancora l'impressione che sia usa sorta di "difetto" che ti fa perdere leggermente il controllo del flusso di programma che ti aspetteresti normalmente. Bisognerebbe sniffare sulla seriale con un oscilloscopio per averne la prova... ad ogni modo sarebbe possibile aggirare il problema secondo voi aumentando la velocità di trasmissione? Potrebbe essere una dimostrazione indiretta per il problema ipotizzato... o sbaglio? Cmq proverò così e vi terrò informati.
Grazie mille a tutti!
Antonio
aumenta la velocità è metti un delay(1000) nel loop() così dovresti avere la certezza.
Comunque in questo caso togli il while(serial.available) e ci metti
if (Serial.available() == strlen("Arduino"))
o ancora meglio accantoni l'inutile serialEvent che crea solo confusione
Ciao!
Dopo aver sperimentato un po' con questo codice concordo pienamente con vbextreme nell'accantonare la serialEvent, in quanto ho constatato che non solo il numero di passaggi nella funzione dipende dal connubio più o meno azzeccato tra velocità e delay, ma anche dal numero di caratteri immessi in ingresso sulla seriale. Si potrebbe quindi concludere questo topic sulla serialEvent consigliandone un uso molto parsimonioso, se non limitato a casi particolari. Vorrei però estendere leggermente il finale con quello che è stato lo scopo ultimo dei miei esperimenti, cioè quello di trovare un codice semplice ed efficace per acquisire una generica stringa da seriale di lunghezza incognita con Arduino. Il risultato è stato il seguente codice:
Ovviamente le varianti sono numerose. Si potrebbe usare il passaggio del puntatore a stringa alla funzione anzichè usare una stringa definita come globale, piuttosto che usare un ciclo while anzichè il do-while. Consiglio cmq di non scendere sotto un delay minimo di 2 msec, altrimenti la funzione necessiterà di più passaggi per acquisire la stringa completa. Questo comportamento è analogo a quello della serialEvent, ma almeno, se non si altera il delay, questo codice rimane estremamente affidabile e soprattutto indipendente dal numero di caratteri in ingresso.
Spero di non aver reinventato la ruota ma di aver contribuito a suggerire un punto di partenza ai novizi come me per un codice di base di uso comune su cui ognuno poi può sviluppare le proprie modifiche in base alle necessità più disparate.