Salve, è possibile realizzare il polling su Arduino ?
Mi spiego meglio, ho un solo Arduino che dovrebbe gestire i dati provenienti da due fonti differenti. Una fonte è la porta seriale (USB) che collega arduino al pc e l'altra sono i dati provenienti da uno shield collegato ad arduino.
Avevo pensato di inserire le due funzioni all'interno del loop utilizzando la funzione millis(), potrebbe essere una buona idea ?
centurione_agrippa:
Avevo pensato di inserire le due funzioni all'interno del loop utilizzando la funzione millis(), potrebbe essere una buona idea ?
Certo, puoi semplicemente controllare con il metodo available() se c'è qualche cosa sulla seriale (e se c'è agire di conseguenza) e, con millis(), temporizzare la chiamata alla funzione che legge lo shield.
Guglielmo
gpb01:
Certo, puoi semplicemente controllare con il metodo available() se c'è qualche cosa sulla seriale (e se c'è agire di conseguenza) e, con millis(), temporizzare la chiamata alla funzione che legge lo shield.
centurione_agrippa:
Una fonte è la porta seriale (USB) che collega arduino al pc e l'altra sono i dati provenienti da uno shield collegato ad arduino.
Avevo pensato di inserire le due funzioni all'interno del loop utilizzando la funzione millis(), potrebbe essere una buona idea ?
Non mi è chiaro quali siano questi "dati provenienti da uno shield", comunque in linea di massima direi "si può fare!" (cit.).
Io ad esempio ho "unificato" gli input da seriale o da Bluetooth (che è una seriale comunque ma diversa dall'altra) per accettare comandi da una o dall'altra indifferentemente (ma una per volta nel mio caso) con una funzione del tipo:
void inputCheck() {
char c = 0;
if ( Serial.available() )
c = Serial.read();
if ( bt.available() )
c = bt.read();
if ( c > 0 ) {
if ( c == '\n' || pBuf == MAXBUF) {
// Fine comando
if ( pBuf > 0 )
execCommand();
pBuf = 0;
showPrompt();
}
else if ( c != '\r' && pBuf < MAXBUF ) {
inputBuf[pBuf++] = c;
inputBuf[pBuf] = 0;
}
}
}
Quindi nel loop() chiamo semplicemente "inputCheck()".
Ma se vuoi maggiori indicazioni o più precise, descrivi meglio cosa vuoi fare e cosa sono questi "dati provenienti da uno shield".
Ciao Docdoc, l'idea è quella di unire due sketch, uno che legge i dati dalla seriale e li invia allo shield e l'altro legge i dati dalla rete allo shield. Le due cose dovrebbero avvenire contemporaneamente e come confermato da gpb01 è utile usare la funzione millis, ho fatto cosi:
Io farei come ha fatto docdoc, ma su due variabili distinte in modo da permettere il parallelismo.
E magari penserei anche ad un sistema di timeout nel caso una trasmissione venisse interrotta brutalmente senza riconoscere un terminatore, cioè dopo un tot di tempo resetto il buffer del comando, o meglio, se arriva una nuova trasmissione troppo distante dalla precedente, riparto con buffer pulito.
A parte questo timeout, non serve temporizzazione, ad ogni giro di loop basta vedere se c'è qualcosa da leggere e leggerlo.
Nel suo caso, dice uno alla volta, perchè altrimenti i comandi, se su più byte, si possono mescolare.
Comunque, valuterei comunque la condizione di comandi simultanei perchè si rischia incoerenza applicativa.
Ovviamente, dipende da cosa rappresentano questi comandi.
Tale controllo andrebbe fatto anche con singola sorgente, quindi, magari, hai già previsto tutto.