Ho Arduino UNO che chiamiamo A che mi invia dei dati letti sugli ING A0; A1; ed A2.
I dati vengono trasmessi e ricevuti via radio utilizzando la libreria VirtualWire su un Arduino UNO che chiameremo B.
Invio tre pacchetti distinti: Lettura di A0, lettura A1 e lettura di A2.
Il loop di ricezione su Arduino UNO "B" è:
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{ int i;
digitalWrite(ledPin, true); // Flash a light to show received good message
digitalWrite(ledPin2, true); // Flash a light to show received good message
Serial.print("Got: ");
// Message with a good checksum received, dump it.
for (i = 0; i < buflen; i++)
{
if (buf[i]==255)
{
lcd.setCursor(0,1);
}
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
lcd.print((char)(int)buf[i]);
Serial.println((char)(int)buf[i]);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
}
}
}
Nel caso non mi arrivi un dato, o mi arrivi incompleto, c'è modo di visualizzare un messaggio di errore tipo KO?
Grazie
Il modo più corretto per verificare un dato è ... assieme ad esso far viaggiare un codice di controllo come può essere un CRC (se fai delle ricerche qui sul forum ci sono anche dei piccoli SW per il calcolo sia del CRC8 che del CRC16 e CRC32).
Inoltre, in caso di assenza totale di dato .. potresti implementare un meccanismo di timeout ... aspetti un tempo X e se non ricevi nulla qualche cosa è andata storta.
Si, quelli sono due moduli, uno ti permette di calcolare il CRC16 e l'altro il CRC32 di un insieme di bytes ...
Volendo fare le cose fatte bene, in una trasmissione seriale "controllata", si inseriscono anche dei caratteri che danno delle informazioni sul contenuto, creando un "protocollo". Esempio semplice, semplice :
Chi trasmette :
STX, blocco_dati, ETX, CRC, EOT
Chi riceve :
Se il CRC, che normalmente nel calcolo NON include lo STX, ma include lo ETX, è valido risponde con ACK e chi trasmette sa che il blocco di dati è arrivato bene e passa al prossimo
Se il CRC non è valido, risponde con NAK e chi trasmette sa che deve ritrasmettere il tutto.
Di solito si aggiunge anche un contatore di NAK ... se dopo X tentativi non riesci a ricevere correttamente ... c'è un problema serio ed è inutile che continui. E si aggiunge anche un timer per il timeout ... mica vorrai stare li ad aspettare in eterno se la trasmissione a metà si interrompe ...
Per inciso, STX, ETX, EOT, ACK e NAK ... sono singoli caratteri che fanno parte dello standard ASCII e che trovi nelle normali tabelle ASCII. Comunque ... STX = 0x02, ETX = 0x03, EOT = 0x04, ACK = 0x06, NAK = 0x15
Spero di averti dato qualche spunto ... ora a te lavorarci sopra
elvis:
Ho il presentimento che dovrò dedicarci un bel po' di tempo...
Mah, sai ... dipende quanto deve essere affidabile la trasmissione ... altrimenti esistono sicuramente strade ancora più semplici ...
... es. trasmettere un blocco di caratteri e per ultimo un carattere che è il XOR dei precedenti ... non è il massimo dell'affidabilità, ma un minimo di controllo lo dà ...
Con lo sketch che sto usando, può succedere che allontanandomi con l'RX dal TX al limite della portata radio ( circa 500mt), invece di ricevere tre dati ne ricevo solo uno o due. Lo capisco in quanto sul display non vedo più tre dati ma solo due... ovviamente...
Quindi, mi riavvicino al TX, spengo e riaccendo l'RX e riprendo a ricevere tutti i dati bene.
Mi piacerebbe solo poter capire se sono arrivati i tre pacchetti ed in caso negativo mi piacerebbe visualizzare un messaggio di errore.