2014-09-09 2 views
2

J'ai des difficultés à convertir deux octets en température. J'ai une unité de contrôle (capteur de température) où j'obtiens le message de température avec deux octets.Conversion de température 2 octets

1) Exemple:

message: [ 40 ][ 25 ] 
LSBYTE : [ 40 ] 
MSBYTE : [ 25 ] 
0.03125 C/bit 
temperature: 25C° (seen from the display of the control unit) 

2) Exemple:

message: [ 40 ][ 26 ] 
LSBYTE : [ 40 ] 
MSBYTE : [ 26 ] 
0.03125 C/bit 
temperature: 30C° (seen from the display of the control unit) 

3) Exemple:

message: [ 20 ][ 26 ] 
LSBYTE : [ 20 ] 
MSBYTE : [ 26 ] 
0.03125 C/bit 
temperature: 32C° (seen from the display of the control unit) 

4) Exemple:

message: [ c0 ][ 25 ] 
LSBYTE : [ c0 ] 
MSBYTE : [ 26 ] 
0.03125 C/bit 
temperature: 29C° (seen from the display of the control unit) 

Je ne sais pas comment convertir le message en température.

Je demande votre soutien. qui peut me donner une solution, il peut collaborer dans mon projet (créer une application android pour recevoir des messages de l'unité de contrôle)

Répondre

0

la solution est: si j'ai un exemple de message: [20] [26 ] et la température est 32C ° la fomula est: 2620 en décimal est 9760 (9760 * 0.03125) -273.15 = 31.85 = 32C °

0

Il semble être de vous donner toute la température dans l'octet supérieur, et la fraction dans le octet inférieur. Ce serait 25.15625 (25 + 40/256).

Je ne sais pas d'où vient le 0.03125 C/bit. Cela signifierait 16 bits = 0.5C. On dirait un non-sens. L'autre explication possible est que 0,03125 * total = degrés C. Si MSB est 25 et LSB est 40, le total est de 201,25 degrés. donc ... probablement pas juste.

EDIT: 0,03125 = 1/32

aucun de vos points utiliser les 5 derniers bits. c'est un composant fractionnaire. Prenez l'octet supérieur, l'octet inférieur et décalez 5 bits à droite, puis soustrayez 273 (pour la conversion kelvin en C).

+0

merci pour votre réponse, mais ce n'est pas la bonne formule, car prendre un autre message: '[40] [26] température est de 30 C ° –

+0

A croire une fiche technique pour votre module serait utile ici. – Jitsu

+0

vos données n'a pas de sens. Ce n'est même pas linéaire. cependant, il est proche d'un montant de kelvin si vous prenez le nombre entier de 2 octets et multipliez par 0,03125. –

0

Il s'agit simplement de l'ordre des octets Little endian. Votre octet le plus important serait le MSB. On dirait que c'est nativement en Celsius. Donc, il suffit de lire comme ça (s'il vous plaît excuser le pseudo-code):

var msbyte = read() // whatever you need to get the value 
var lsbyte = read() // whatever you need to get the value 

var temperature = msbyte 
temperature += (lsbyte/100) 

Dans votre cas, la simple 25.40C °

+0

merci pour votre réponse, mais ce n'est pas la bonne formule, car prendre un autre message: [40] [26] la température est de 30 C ° –