Pages: [1]   Go Down
Author Topic: passar uma variavel float pela porta serie e reconstruir no VB  (Read 854 times)
0 Members and 1 Guest are viewing this topic.
Portugal
Offline Offline
Edison Member
*
Karma: 28
Posts: 1436
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas colegas
Estou a trabalhar num sistema de temperaturas com varios slaves e um master comunicando sobre RS485.Ele esta a funcionar mas tenho uma parte do codigo que penso estar menos correcta.
O slave esta ligado a um sensor da dallas ds18b20 que le a temperatura e armazena num float e que me escreve na porta serie o valor da temperatura,quando o master o solicita, parcialmente convertido num int (recorri ao float * 100 com um cast para int).Isto foi uma soluçao temporaria porque nao estou conseguindo passar os 4 bytes do float usando o serial.write[respetivo_byte_da_float] devido as variaveis float serem "encoded".
Alguem sabe um processo de "decoding" da float no lado do VB ou realBasic?
Apesar de estar a funcionar usando o metodo de converter num int penso nao ser a forma mais correcta pois eu queria calcular o CRC da mensagem e assim enviar os 4 bytes do float junto com o CRC.
Desta forma asseguro a segurança dos dados.


Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3115
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:

float var = 5.0f;

char my_float[5];
my_float[4] = '\0';

for (int i = 0; i<4; i++) {

my_float[i] = (char) (var >> (i*8)) &0xFF;

}


Algo assim não funciona?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Portugal
Offline Offline
Edison Member
*
Karma: 28
Posts: 1436
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ola colega
O meu problema nao é esse.O teu exemplo funcionara mas isso eu ja tenho implementado do lado do arduino.No meu caso tou a usar ponteiros onde assim imprimo o valor do array com o serial.write
Esse array é na verdade um ponteiro para a variavel float.Ate aqui tudo ok o problema vem depois.
No vb ou em outro soft que tenha a escuta no pc eu recebo os 4 bytes mas como apartir deles reconstruo a variavel float?
Se fossem apenas variaveis Int tudo se fazia com uns deslocamentos e com masc 0xff para recriar o Int mas no caso do float ele é "incoded" logo posso reconstruilo da mesma forma mas como depois resultado voltar a ser um float??
Exemplo:
Tenho no arduino um float com valor de 12.3
Se calcular o float convertido para hex dara algo como 0x4144cccd
Se usar Serial.write para cada byte irei receber no VB em hex 0x41,0x44,0xcc,0xcd(ordem pode estar trocada)
Supondo que armazenei todos estes valores num array como o retorno a float?
É isto que me esta a dificultar a vida

Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3115
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A ordem deverá ser a mesma a não ser que as duas máquinas tenham diferenças de endianness... e mesmo aí, não terei a certeza.

Não é fazendo a operação inversa?
Code:
For i=0 to i < 4 Step 1
   Var_float = (Var_float << (8*i)) & char[i];
Next


Eu não sou um perito em VB, mas deve funcionar. smiley
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Jump to: