Salve ragazzi, vengo a porvi una domanda di carattere generale, rivolta in particolar modo a chi conosce bene la scheda UNO , ( molto meglio di me che la utilizzo da poco).
Ho trovato un codice dove tramite loop e una funzione esterna, viene continuamente abilitata e disabilitata la porta seriale.
Lo schema è piu o meno questo.
SETUP : Serial.begin
LOOP: Se seriale riceve un certo valore ----> Disabilita Seriale ( Serial.end) + Chiama FUNZIONE
FUNZIONE: esegue una serie di istruzioni + Riabilita Seriale ( Serial.begin)
in pratica simula il comportamente dei più famosi noInterrupts() e interrupts().
Ora , la domanda puramente teorica che vi pongo è : questo comportamento può a lungo andare causare dei danni alla scheda?
Intanto grazie a tutti
x Uwe
In pratica in questo sketch il programma riceve un carattere da seriale , e se il carattere è uno specifico (ad esempio "A", ora non ce l'ho sottomano ) accende un LED/Relè/ qualcosa di simile per un determinato periodo di tempo(mettiamo 3 secondi) e poi lo spegne . In un commento spiega che lui , ogni volta che riceve A, spegne la seriale, aziona il led/relè/blabla , e poi la riabilita quando il led si spegne, in questo modo evita di ricevere un "A" mentre il led è gia acceso, cosa che provocherebbe , allo spegnimento del led, un'ulteriore accensione non desiderata.
( Poi appena lo ritrovo lo posto eh)
Io sono un ciufolotto con la programmazione, ma non basterebbe inserire nel codice una cosa del tipo: se il led è acceso e se ricevi dati via seriale allora non fare nulla. Oppure, se il led è acceso ed arriva il dato "A" via seriale fregatene...
Insomma, anziché disabilitare la seriale, semplicemente non la ascolti, non prendi in considerazione gli "A" ma magari i "B" in modo da poter accendere un altro led...
khriss75:
Io sono un ciufolotto con la programmazione, ma non basterebbe inserire nel codice una cosa del tipo: se il led è acceso e se ricevi dati via seriale allora non fare nulla. Oppure, se il led è acceso ed arriva il dato "A" via seriale fregatene...
Insomma, anziché disabilitare la seriale, semplicemente non la ascolti, non prendi in considerazione gli "A" ma magari i "B" in modo da poter accendere un altro led...
é quello che ho pensato anch'io inizialmente, quando ho preso quel codice per riusarlo ai miei scopi, il problema che ho riscontrato è che anche se lo ignori, il secondo " A" resta sul buffer seriale e quindi al successivo Serial.read() , lui legge nuovamente A, anche se tu magari hai mandato il comando "B".( che viene salvato nella posizione successiva). Siccome la funzione flush() non svuota più il buffer, non mi vengono in mente altre soluzioni su seriale ( è la prima volta che la uso e ci sto prendendo confidenza)
@ khriss75 : consiglio di inserire almeno un delay di 1 msec :
byte a;
while (Serial.available()) {
a=Serial.read();
delay(1)
}
Magari non è questo il caso, perché state parlando di UN solo carattere, ma ...
... immagina tu ne stia ricevendo più di uno. La velocità di quel loop stretto (while) è sicuramente superiore al tempo che impiegano gli 8 bit del carattere ad essere ricevuti (... a 9600 baud, un carattere impiega circa 1 msec ad arrivare) e quindi rischieresti di uscire dal loop perché la Serial.available() diventerebbe false ... per essere di nuovo true ... un millisecondo dopo la tua uscita
Grazie Khriss e Guglielmo. Devo dire che avevo letto anch'io la cosa , ma implementandola avevo avuto dei comportamenti strani, credo proprio quelli a cui si riferisce Guglielmo. Ora provo a riscriverlo con questa lettura per svuotare il buffer
byte a;
while (Serial.available()) {
a=Serial.read();
delay(1)
}
UPDATE: con il delay suggerito da Guglielmo tutto funziona senza andare ad accendere e spegnere quella povera seriale, a volte basta proprio un dettaglio per fare la differenza
nicostak:
UPDATE: con il delay suggerito da Guglielmo tutto funziona senza andare ad accendere e spegnere quella povera seriale, a volte basta proprio un dettaglio per fare la differenza