Go Down

Topic: 4 char to 1 float---- problema concat char in stringa (Read 1 time) previous topic - next topic

aureliusss

Jan 29, 2013, 12:40 pm Last Edit: Jan 30, 2013, 03:45 pm by aureliusss Reason: 1
ciao a tutti,
ho già scritto nel forum riguardo il mio progetto per la tesi di usare arduino come ponte di comunicazione fra un TDR e un altro terminale di comunicazione.
cmq sono riuscito ad attivare la comunicazione fra il monitor seriale e lo strumento, ora però mi sono bloccato perchè non riesco a far interpretare i dati da arduino:

se allo strumento invio un comando che mi permette di acquisire una waveform esso mi restituisce questo tipo di stringa:
Code: [Select]

comando inviato -> :GWAV35
risposta ricevuta -> :#GWAV [byte1][byte2][byte3][byte4]...[byte n-esimo]


ora dovrei leggere 4 byte alla volta e accorparli per avere un float in formato standard ieee754(così me li trasmette lo strumento).

come faccio a fare un'operazione del genere?
che tipo di codifica usa arduino per i float?

ho tentato con un programma di test se potessi riuscire ad accorpare 4 byte in un'unica informazione di tipo float ma non ci sono riuscito:
questo il codice di prova che ho usato:
Code: [Select]
void setup(){
 Serial.begin(9600);
 float a = '?'; // bin =    00111111
 float b = 0x00;// bin = 00000000
 float c = 0x00;// bin = 00000000
 float d = 0x00;// bin = 00000000
 
 // accorpando in 4 bytes in formato ieee754 risulta:
 // bin(00111111|00000000|00000000|00000000) = float(0.5)
 
 float a1 = a<<24; //in teoria (00111111) 00000000 00000000 00000000
 float b1 = b<<16; //in teoria  00000000 (00000000) 00000000 00000000
 float c1 = c<<8;  //in teoria  00000000  00000000 (00000000) 00000000
 float d1 = d;     //in teoria  00000000  00000000 00000000 (00000000)
 
 float risultato = a1 | b1 | c1 | d1
 //bitwise or fra i 4 float per ottenere il float "finale"
 
 Serial.println(risultato);
 
}
void loop(){
}


ma il l'operazione di bitwise mi da errore di compilazione.
mi potete aiutare?

astrobeed


ma il l'operazione di bitwise mi da errore di compilazione.
mi potete aiutare?


Il problema non è l'errore di compilazione, è la logica che usi ad assere totalmente sbagliata, per via della natura esponenziale dei float non puoi ricostruirli shiftando i singoli byte, questo è applicabile solo per gli interi.
Puoi ricostruirlo con solo due modi, tramite puntatori o tramite una union, argomento che abbiamo trattato molte volte nel forum.

lesto

scusa astro ma se i dati in arrivo sono un float "smontato" in byte tramite bitshift (come nel suo caso) dovrebbe essere possibile riscotsruirlo.. magri un pò di magia tipo
Code: [Select]

byte numero[4]={0x3f, 0x00, 0x00, 0x00}; //0x3f = B00111111
float *num;
num=numero;
float val = *nun;


ahhhh ora ho capito il suo errore, "a, b, c, d" li ha dichiarati come float e non come byte... quindi quel 0x3F era convertito nella sua rappresentazione float che non è quella che ci aspettiamo.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


scusa astro ma se i dati in arrivo sono un float "smontato" in byte tramite bitshift (come nel suo caso) dovrebbe essere possibile riscotsruirlo.. magri un pò di magia tipo


E io che ho detto ? Devi usare i puntatori o una union.

lesto

sisi, è che mi aspetto che funzioni questo:

Code: [Select]

long a = 0x3f<<24; // bin =    00111111
long b = 0x00<<16;// bin = 00000000
long c = 0x00<<8;// bin = 00000000
long d = 0x00;// bin = 00000000

float ris = a|b|c|d;
ù

come al solito sono al lavoro, quindi codice non testato

edit: ah ok, forse non funziona propio perchè questo valore viene tentato di essere convertito in notazione ieee754
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up