Go Down

Topic: Conversione da HEX a DEC (Read 2775 times) previous topic - next topic

marcus barnet

Jul 17, 2012, 04:37 pm Last Edit: Jul 17, 2012, 05:05 pm by marcus barnet Reason: 1
Vorrei capire come fare a convertire dei valori esadecimali in decimali.

Cerco di spiegarmi meglio: con un Xbee collegato ad un Arduino UNO invio un valore intero pari a 333 in questo modo:

Code: [Select]
 pin5 = analogRead(5);
 payload[0] = pin5 >> 8 & 0xff;
 payload[1] = pin5 & 0xff;


e lo ricevo in esadecimale sull'altro Arduino in questo formato:

Quote
payload [18] is 1
payload [19] is 4D


Infatti 14D in esadecimale è 333 in decimale.

Vorrei ricomporre il valore in Arduino e vorrei capire se effettuando questa operazione:

Code: [Select]
analogValue = payload [19] + (payload[18]*256);

ottengo effettivamente il valore 333 o se l'operazione è sbagliata.

Voi che dite?

marcus barnet

Più che altro ho dei dubbi sulla conversione del valore contenuto in payload[19] dato che comprende sia 4 che D.

Teoricamente, la conversione totale sarebbe: 1*16*2 + 4 * 16 + 13 ( = D) = 333 (DEC)

Solo che io 4D me lo ritrovo in payload[19]..

astrobeed


Cerco di spiegarmi meglio: con un Xbee collegato ad un Arduino UNO invio un valore intero pari a 333 in questo modo:
Code: [Select]
 
 pin5 = analogRead(5);
 payload[0] = pin5 >> 8 & 0xff;
 payload[1] = pin5 & 0xff;



Non serve la mascheratura perché il C fa il casting automaticamente.

Code: [Select]

 pin5 = analogRead(5);
 payload[0] = pin5 >> 8;   // high byte
 payload[1] = pin5;          // low byte


Quote

Vorrei ricomporre il valore in Arduino e vorrei capire se effettuando questa operazione:
Code: [Select]
analogValue = payload [19] + (payload[18]*256);


Per ricomporre il valore è necessario usare il casting esplicito in questo modo:

Code: [Select]

analogValue = payload [19]
analogValue += (int) payload[18] << 8;



Michele Menniti

Scusa se non ho risposto subito... per eliminare il vecchio Topic devi cliccare in basso a sinistra sulla voce "remove Topic", grazie.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

uwefed

Non stai facendo nessuna conversione HEX a decimale e viceversa. Quello che stai facendo é scomporre un numero a 16 bit in 2 da 8 bit e poi riunirli.
Ciao Uwe

marcus barnet

Quindi mi basta ricomporlo così:

Code: [Select]
analogValue = payload [19]
analogValue += (int) payload[18] << 8;


come suggerito da astrobeed per ottenere il valore inviato in origine?

Io comunque lo ricevo come esadecimale, o mi sbaglio? Forse non sto capendo bene..

astrobeed


Io comunque lo ricevo come esadecimale, o mi sbaglio? Forse non sto capendo bene..


Esadecimale, ottale, decimale, etc, sono solo rappresentazioni dello stesso numero in base diversa per noi esseri umani, per il microprocessore esiste solo il binario.

uwefed

Non lo ricevi in esadecimale.
Esadecimale o decimale é un modo per visualizzare un mumero per noi uomini.
Tu ricevi 2 Byte; una ha il peso basso e l' altro ha il peso alto.
Immaginai come se hai un numero decimale a 3 cifre e ti trasmetti una cifra alla volta. per ricomporre il numero devi moltiplicre ile centiania con 100, i decimi com 10 e gli uni con 1 e tutti tre li sommi.
È la sessa cosa con i byte solo che il multiplicatore non é 10 ma 256.
Ciao Uwe

Go Up