C/Visual C - Comunicacion Serie

 
Vista:
sin imagen de perfil

Comunicacion Serie

Publicado por alfredo (4 intervenciones) el 02/08/2012 16:49:27
Hola, buenas tardes...
Tengo un problema que no logro solucionar desde hace muchooo tiempo y no se que mas hacer...
la cuestion es que tengo un programa cliente y un servidor el cual esta conectado a un microcontrolador de 8 BITS Amel 1280 Arduino mega. El problema es que tengo que recibir datos desd el micro al servidor y luego desde este al cliente. La cuestion que esos datos son tipo float pero la memoria del micro es de 8 bits por lo tanto solo envia byte a byte. estos datos los recibe el servidor, entonces la cuestion es como hago para que los interprete como un float es decir si el micro envia 4 bytes que se suponen que son un numero real tipo float , entonces como hago para que el servidor coja esos cuatro bytes y los interpreque todos como un numero real de 4 bytes?. el codigo esta en C y es para una API DE 32 bits. GRACIAS
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Comunicacion Serie

Publicado por Capitan Kirk (97 intervenciones) el 03/08/2012 08:31:20
Dado que envías/recibes los datos carácter a carácter, mediante un buffer, tendríamos un par de soluciones:

- Mediante una unión:

1
2
3
4
5
union BufferDatos
{
  char Byte[4];
  float ValorFloat;
}


La transferencia de datos la realizas empleando BufferDatos.Byte, y el procesado de los datos como float mediante BufferDatos.ValorFloat.

- Mediante punteros:

1
2
3
4
5
6
char Datos[4];
float *ptrFloat;
float x;
 
ptrFloat = (float *)Datos;   // ptrFloat apunta a un float cuyos bytes individuales están en Datos
x = *ptrFloat;


Ten en cuenta el orden en que los procesadores tratan la información. Hay procesadores que guardan los datos comenzando por el byte menos significativo y terminando por el más significativo (INTEL, por ejemplo), y otros que los guardan comenzando por el más significativo y terminando por el menos significativo. Esto es para tipos simples de más de un byte de tamaño (int, float, etc), pero las cadenas de caracteres, estructuras y arreglos se almacenan en su orden normal (aunque sí es aplicable para los elementos individuales de cada uno). Comprueba cómo guarda los datos tu microcontrolador y, en su caso, invierte el orden de los bytes antes de tratar el dato como float.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comunicacion Serie

Publicado por Alfredo (4 intervenciones) el 06/08/2012 17:23:10
Hola Capitán...

agradecerte de antemano el interés mostrado y la ayuda recibida por tu parte....

Aunque no han salido las cosas del todo como esperaba.

La cuestión es que la transferencia y recepcion de datos desde el micro y hacia el micro es correcta.

El problema surge al interpretar los datos como float, es decir, byte a byte o char a char he comprobado que los datos son recibidos y transmitidos correctamente, y almacenados en la union en la variable correspondiente a BufferDatos. Byte[4]; Pero para mi sorpresa cuando quiero acceder a los mismos desde la variable float de la union (que se supone que deberia de imprimir el valor interpretado como float), pues no los puede leer, lo único que me sale es un valor de :
BufferDatos.ValorFloat=0.00

¿que estoy haciendo mal?, si byte a byte los leo perfectamente y se encuentran almacenados en la union y puedo acceder a ellos desde la variable BufferDatos.Bytes[4].

He intentado las dos posibilidades que me sugeristes y llego a la misma conclusion..

Se que es un quebradero de cabeza pero esque estoy bloqueao ahora mismo y no se como solucionarlo, de todas maneras agradecerte una vez mas la ayuda prestada.

Recibe un cordial saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comunicacion Serie

Publicado por Capitan Kirk (97 intervenciones) el 24/08/2012 12:23:06
No he contestado antes porque he estado de viaje.

Para ver qué está pasando, lo más fácil sería ver qué datos son los que se reciben. Si aún estás con ese tema, postea algunos de los datos recibidos como valores individuales de los bytes, a ver si se me ocurre qué puede estar pasando (o, si lo prefieres, envíamelo por email).

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar