Pages: 1 [2]   Go Down
Author Topic: comando corretto per pulire la seriale su arduino uno ide 101  (Read 1281 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per quello potrebbe provare a spegnere la seriale alla fine del loop e riaccenderla all' con un Serial.end e un Serial.begin no?

La serial.begin non mi pare azzeri i puntatori del buffer, se non è cambiato qualcosa nell'ultima versione dell'IDE si limita a settare i registri macchina dell'UART per il baud rate richieste e ad attivarla.
La serial.end non ho mai controllato cosa fa esattamente pertanto no so se azzera i puntatori del buffer seriale, è da verificare, se lo fa diventa il sistema più semplice e rapido.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ci vuole un comando (a comando) 

Non ti complicare inutilmente la vita, semplicemente svuoti la seriale un attimo prima del uso uso reale se hai il dubbio che potrebbe aver ricevuto nel frattempo dei byte che a te non servono.
Di solito non serve svuotare il buffer di ricezione della seriale perché in un sistema fatto bene c'è sempre un protocollo di comunicazione che previene gli errori e gli invii spuri, nulla di complicato, nei casi più semplici basta far precedere i dati utili da un carattere ben preciso ed univoco, solitamente si usa "@", e terminarli allo stesso modo con un carattere diverso, p.e. "#", tutto quello che arriva al di fuori di questo contesto è spazzatura e la butti via.
Se aggiungi un time out e un semplice cheksum sei ancora più tranquillo e riduci notevolmente le possibilità di errore.
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
void HardwareSerial::end()
{
  // wait for transmission of outgoing data
  while (_tx_buffer->head != _tx_buffer->tail)
    ;

  cbi(*_ucsrb, _rxen);
  cbi(*_ucsrb, _txen);
  cbi(*_ucsrb, _rxcie); 
  cbi(*_ucsrb, _udrie);
 
  // clear any received data
  _rx_buffer->head = _rx_buffer->tail;
}
smiley-wink
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

In pratica basta utilizzare solo questa riga di codice per azzerare il buffer di ricezione senza disattivare per forza la seriale.

Code:
// clear any received data
  _rx_buffer->head = _rx_buffer->tail;

Il codice non fa altro che porre allo stesso valore il puntatore della testa del buffer con quello della coda azzerando di fatto la disponibilità di byte non ancora letti.
Da verificare se è necessario fare qualche dichiarazione specifica per utilizzare all'interno dello sketch quei puntatori, molto probabilmente tocca ridichiararli come extern come per il reset da sketch della millis().
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nell'header sono private
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

nell'header sono private

Vero, a questo punto si fa prima ad usare direttamente la serial.end seguita da una serial.begin, da un punto di vista cicli macchina richiede sicuramente meno tempo della while anche se il buffer è già vuoto.
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

che è più o meno quello che dicevo all'inizio smiley
per quello potrebbe provare a spegnere la seriale alla fine del loop e riaccenderla all' con un Serial.end e un Serial.begin no?

Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e se facesse un vichinghissimo
Code:
  UCSR0B &= ~(1<<TXEN0);  //disabilita TX   
  UCSR0B &= ~(1<<RXEN0);  //disabilita  RX   
  UCSR0B |= (1<<RXEN0);   //abilita RX
  UCSR0B |= (1<<TXEN0);  //abilita TX   
??
lo spegnimento di tx/rx dovrebbe azzerare il buffer
« Last Edit: October 18, 2012, 05:37:49 am by BrainBooster » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

lo spegnimento di tx/rx dovrebbe azzerare il buffer

No perché è gestito a software tramite i due indici rx_buffer->head  e _rx_buffer->tail, se non intervieni su questi il buffer rimane inalterato.
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tiriammo le somme   smiley-twist 
per noi niubbi  la cosa piu veloce ....   e questa?


if ( digitalRead (11)==LOW)  serial.end ;

if ( digitalRead (11)==LOW)  serial.begin (9600) ;

spenge e riaccende se un pin va basso
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yess
Logged

Pages: 1 [2]   Go Up
Jump to: