Go Down

Topic: comando corretto per pulire la seriale su arduino uno ide 101 (Read 2171 times) previous topic - next topic

astrobeed


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.

astrobeed


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.

BrainBooster

Code: [Select]

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;
}

;)

astrobeed

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

Code: [Select]

// 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().

BrainBooster


astrobeed


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.

BrainBooster

che è più o meno quello che dicevo all'inizio :)

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


BrainBooster

#22
Oct 18, 2012, 12:35 pm Last Edit: Oct 18, 2012, 12:37 pm by BrainBooster Reason: 1
e se facesse un vichinghissimo
Code: [Select]

  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

astrobeed


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.

gingardu

tiriammo le somme   ]:D 
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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

BrainBooster


Go Up