Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-04-2006
cmurua71 cmurua71 is offline
Miembro
 
Registrado: nov 2005
Posts: 13
Poder: 0
cmurua71 Va por buen camino
Transformar un String[4] en un Real

Hola

Tengo un problema al recibir datos por el puerto serie. Tratare de ser organizado al respecto:

1- Los datos provienen de un dispositivo que me envia 4 bytes, estos bytes son los correspondientes a un REAL (IEEE, la representacion en 32 bits de un real).
2- Esos datos llegan a la PC, en la misma corro un programa en Delphi. En este programa utilizo un componente TDataPacket, asociado a un componente TComPort
3- El componente TDataPacket me sensa el encabezado de la cadena y lee los 4 bytes.
4- El problema es que el componente me entrega esos 4 bytes como 4 caracteres (un string en realidad), PERO EN REALIDAD SON UN REAL.
5- Por lo tanto... Como transformo esos 4 bytes en un REAL, que es lo que en realidad representan ??

Probe de varias formas con punteros, pero ninguna me funcionó

ALGUNA IDEA, AYUDA ?? Sera muyy bienvenida la ayudaa

Desde ya muchas gracias, UN ABRAZO

Carlos
Responder Con Cita
  #2  
Antiguo 24-04-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
En un principio parece te quedaría poner la coma a esa cadena y luego aplicar la función FloatToStr(X).

Cita:
Unit

Sysutils

Category

floating point conversion routines

function StrToFloat(const S: string): Extended;

Description

Use StrToFloat to convert a string, S, to a floating-point value. S must consist of an optional sign (+ or -), a string of digits with an optional decimal point, and an optional mantissa. The mantissa consists of 'E' or 'e' followed by an optional sign (+ or -) and a whole number. Leading and trailing blanks are ignored.

The DecimalSeparator global variable defines the character that must be used as a decimal point. Thousand separators and currency symbols are not allowed in the string. If S doesn't contain a valid value, StrToFloat raises an EConvertError exception.
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 24-04-2006
cmurua71 cmurua71 is offline
Miembro
 
Registrado: nov 2005
Posts: 13
Poder: 0
cmurua71 Va por buen camino
Interpretar 4 bytes como Real

Cita:
Empezado por marcoszorrilla
En un principio parece te quedaría poner la coma a esa cadena y luego aplicar la función FloatToStr(X).



Un Saludo.
Gracias por la ayuda, pero no es eso lo que ando necesitando, y explico por qué:

La funcion FloatToStr me convertiria un String como '53.5' en el Real 53.5
El problema que tengo es que en este caso los bytes que vienen no represntan (siguiendo el ejemplo) el caracter '5' ni el siguiente el '3' y asi sucesivamente.
Los bytes que me son enviados constituyen los cuatro juntos, la representacion en formato ANSI/IEEE 754-1985, el problema es que debo interpretar los bytes de ese modo y no como strings ni char.

Logro hacerme entender ?

UN abrazo

Carlos
Responder Con Cita
  #4  
Antiguo 24-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
http://en.wikipedia.org/wiki/IEEE_754

viene tanto la definición como un ejemplo.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 24-04-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bien, todo depende del orden en que te manden esos bytes. Me explico:

Tenemos, por ejemplo el numero:

-118.625

Cuya representacion en IEEE es:

11000010 11101101 01000000 00000000

Si te manda los bytes de derecha a izquierda, podemos hacer algo como esto:

Código Delphi [-]
function StrToSingle(Str: String): Single;
begin
  if length(Str) = 4 then
    Result:= PSingle(@Str[1])^
  else
    Result:= 0;
end;

Pero si por el contrario, te manda los bytes de izquierda a derecha tenemos que darles la vuelta primero

Código Delphi [-]
function StrToSingle2(Str: String): Single;
var
  i: integer;
  S: string;
begin
  if length(Str) = 4 then
  begin
    S:= '';
    for i:= 4 downto 1 do
      S:= S + Str[i];
    Result:= PSingle(@S[1])^
  end
  else
    Result:= 0;
end;

Por ultimo te dejo un ejemplo, para que pruebes la funcion:

Código Delphi [-]
var
  s: string;
begin
  // 11000010 11101101 01000000 00000000 = -118.625
  SetLength(s,4);
  s[4]:= #194; //11000010
  s[3]:= #237; //11101101
  s[2]:= #64;  //01000000 
  s[1]:= #0;   //00000000
  ShowMessage(FloatToStr(StrToSingle(s)));
end;

¿Era esto lo que buscabas?
Responder Con Cita
  #6  
Antiguo 24-04-2006
cmurua71 cmurua71 is offline
Miembro
 
Registrado: nov 2005
Posts: 13
Poder: 0
cmurua71 Va por buen camino
Si, era esto

Muchisimas gracias, esto es lo que andaba buscando

En el dia de hoy en cuanto pueda agarrar la maquina lo pruebo, y les estoy comentando el resultado

Un abrazo

Carlos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
transformar mdb a gdb armed Firebird e Interbase 3 20-07-2005 16:01:46
Transformar imagen Decker Gráficos 2 25-02-2005 18:38:54
Transformar texto en sonido Pablo Carlos Varios 3 10-10-2004 00:09:23
transformar HTML a XML jpcancino Internet 1 07-01-2004 14:48:38
real to string haffo Varios 5 12-11-2003 21:01:36


La franja horaria es GMT +2. Ahora son las 20:58:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi