Pages: [1]   Go Down
Author Topic: Conversione da HEX a DEC  (Read 1936 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
 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:
analogValue = payload [19] + (payload[18]*256);

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

Voi che dite?
 
« Last Edit: July 17, 2012, 10:05:41 am by marcus barnet » Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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]..
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Code:
 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:
analogValue = payload [19] + (payload[18]*256);

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

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

Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 411
Posts: 11986
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa se non ho risposto subito... per eliminare il vecchio Topic devi cliccare in basso a sinistra sulla voce "remove Topic", grazie.
Logged

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20199
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quindi mi basta ricomporlo così:

Code:
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..
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20199
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: