Invio float VirtualWire

Salve, non riesco a inviare correttamente dati float o double con la libreria VirtualWire, a momenti arrivano poi sto a guardare un ora il serial monitor senza niente per poi arrivare di nuovo…

Ecco parte del codice

Trasmettitore

z[0] = T;
z[1] = ALTITUDE;
z[2] = P;
z[3] = p0;
luceon();
int vartemp = (int)z[0];
int vartemp2 = (int)((z[0] - vartemp)*100);
int vartemp3 = (int)z[1]; 
int vartemp4 = (int)((z[1] - vartemp3)*100);
int vartemp5 = (int)z[2];
int vartemp6 = (int)((z[2] - vartemp5)*100);
int vartemp7 = (int)z[3];
int vartemp8 = (int)((z[3] - vartemp7)*100);
char zv[25] = {};
sprintf(zv,"%d,%d,%d,%d,%d,%d,%d,%d", vartemp,vartemp2,vartemp3,vartemp4,vartemp5,vartemp6,vartemp7,vartemp8);
vw_send((uint8_t *)zv , strlen(zv));
vw_wait_tx();

Ricevitore

uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
        int i ;
        for (i=0;i <buflen; i++){
          StringReceived[i] = char(buf[i]);
        }
      sscanf(StringReceived, "%d,%d,%d,%d,%d,%d,%d,%d", &Sensor1Data, &Sensor2Data,&Sensor3Data,&Sensor4Data,&Sensor5Data, &Sensor6Data,&Sensor7Data,&Sensor8Data);
      scrivival();
      valori();
      
        }
  memset(StringReceived,0,sizeof( StringReceived));

Questo metodo l’ho trovato su internet, ho ancora alcuni problemi ma senza riuscire a fare debug dei dati non ho possibilità di correggerli, grazie!

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Infatti il tuo codice verso la fine diventa stile italico e si è perso un pezzetto

correggo subito, comunque non è italiano, sono richiami a procedure ... dato che sono procedure con solo degli output seriali non li ho inseriti... ora edito..

AdrianoD: correggo subito, comunque non è italiano, sono richiami a procedure ... dato che sono procedure con solo degli output seriali non li ho inseriti... ora edito..

ehm, quando vedi i caratteri obliqui... si chiama font italico

C'entra poco con il problema, 2 consigli: 1. queste apri e chiudi graffe non servono a un tubo:

char zv[25] = {};
  1. invece di sprintf() usa la snprintf() a cui passi la dimensione di zv, è più sicura.
snprintf(zv,25,"%d,%d,.... etc.

mea culpa, non avevo inteso ciò che dicevi perchè avevo già editato :3 Grazie per il consiglio, ora si aspetta qualcuno che abbia la risposta fondamentale :p

Scusa, ma 1.dici di non riuscire a inviare float/double, ma tu spedisci degli int, cosa c'entrano i float ? Li spezzi in 2 e poi li ricomponi ? Ma al ricevente converti i vari pezzi con char, quindi -127+128 ti bastano come cifre ? Mi paiono poche, che tipo di valori sono T, Altitude, P, P0 ?

2.spiega meglio il "sintomo". Il primo spedisce di continuo ma il ricevente riceve per un pò e poi si "blocca" per poi riprendersi ? Prova a spedire come primo valore invece del sensore un contatore che aumenti di 1 e basta. Così vedi se al ricevente i vari msg si accodano oppure li perde proprio.

Sulla prima parte hai ragione, quello di cui ho bisogno io è di inviare i dati raccolti da un BMP180 quindi temperatura, pressione rel e ass e altitudine al ricevitore che li scrive su lcd... Io vorrei inviare spezzandoli in parte intera e decimale per poi ricomporli di la come float o direttamente scriverli come char, in effetti non avevo pensato al range del tipo che sto inviando, io però sto prendendo solo le prime 2 cifre dopo la virgola moltiplicando e spezzando in quel modo no? Ho un po' di confusione in testa, mi rendo conto e te ne chiedo scusa..

Sulla seconda parte:

Uno trasmette ogni x secondi l'altro riceve sempre ma sembra che riceva una volta su 1000... Ogni tanto prende 3 valori di seguito li scrive quasi correttamente (solo problemi di visualizzazione su lcd che risolverò io..) ogni tanto invece non riceve nulla e anche riavviando varie volte entrambe le schede non succede nulla, senza toccare nulla caricando i codici di esempio di virtualwire però vanno subito entrambi quindi ho escluso i problemi hardwere...

Ho scritto un programma di ricezione e trasmissione uguale ma senza la raccolta di dati dal BMP180 (quindi inviando float inseriti di partenza), appena torno a casa provo con quello così capisco se il problema si crea nella parte di acquisizione dati che magari inceppa tutto il processo per qualche motivo.

Grazie per la tua pazienza, riaggiorno appena scopro qualcosa...

Saluti, Adriano

Per lo spezzare: tu poi riconverti da char la parte intera e quella decimale. I decimali sono solo 2 cifre quindi un char ti basta. Non mi convince la parte intera. Sono numeri inferiori a 100 ? Esempio 99.99 ?

In effetti no, solo la temperatura è da 2 cifre (grazie a Dio) …
Come dovrei fare? Non avevo proprio pensato al massimo range di char, devo spezzare anche la parte intera in 2 parti? (Il massimo sono 4 cifre)