Datos flotantes de Gui desde el microcontrolador

2

Estoy creando un marco para un sistema de adquisición de datos donde el controlador envía datos (enteros / flotantes) a la GUI. He hecho algunos trabajos básicos sobre compiladores y tipos de datos y descubrí que cada entero / float toma 2/4 bytes cada uno.

Mi duda es que cómo agrupar este entero / byte flotante en uno y mostrarlos como el valor entero / flotante real en la GUI.

Confío en esta parte de la programación de la GUI, pero todas las comunicaciones de datos enviaban los datos en bytes y luego los agrupaban y mostraban como float / int.

por ejemplo, caso:

  • paso1: el controlador envía datos flotantes a la GUI.
  • paso2: el controlador y el compilador dividen los datos en 4 bytes.
  • paso 3: Gui recibe 4 bytes.
  • paso 4: Gui convierte 4 bytes recibidos para flotar y los muestra en la GUI.

Necesito más claridad sobre paso 4 .

Entonces, si necesitamos un float / integer en la GUI, ¿cómo deberíamos agrupar los datos provenientes de los puertos de comunicación (USB / uart)?

Esto sería útil para aumentar mi comprensión y aclarar mis dudas, si sugieres tus opiniones.

    
pregunta Rookie91

4 respuestas

2

La forma en que se representan los tipos de valor en la memoria depende de la arquitectura (little / big endian, por ejemplo) y de los estándares que cumple.

Ejemplo: El estándar IEEE para aritmética de punto flotante (IEEE 754) es un estándar técnico para el cálculo de punto flotante establecida en 1985.

Desde la perspectiva de un microcontrolador, la forma más sencilla de enviar este tipo de datos es enviarlos en esta representación nativa (en memoria) mediante punteros o uniones.

En el lado de la PC / GUI, es posible que tenga recursos / bibliotecas adicionales que lo ayuden con la secuencia de bytes para escribir conversiones. Sin embargo, si realiza la conversión, debe asegurarse de que utiliza las mismas reglas / estándares.

Permite tomar un entero ´i´ sin signo de 16 bits con el valor asignado de 1000 por ejemplo:

i = 1000

La pequeña representación endiana sería

0xE8 0x03

en la memoria. Entonces, cuando desee enviar este valor como un flujo de bytes en serie, simplemente convierta "i" a "byte" y envíe dos bytes a partir de esa dirección.

Su software GUI podría realizar el lanzamiento en la otra dirección, dado que usa el mismo estándar para la representación de tipo. Si usa big endian, es posible que tenga que intercambiar primero el orden de bytes.

btw: ¿A qué tipo de GUI / idioma te refieres? Por ejemplo, C # / .NET proporciona mecanismos extensos para conversiones de tipo usando la clase BitConverter.

EDIT Como el autor mencionó que usa C #, aquí hay información adicional:
Tenga en cuenta que C # en sí no define la endianidad. La endianness es decidida por el hardware. Sin embargo, la mayoría de las plataformas que usan .NET son LITTLE endian. Si quiere estar seguro, puede verificar la endianness del sistema con el campo ´BitConverter.IsLittleEndian´ para decirle cómo se comportará.

Suponiendo que su microcontrolador utiliza little endian (como todos los controladores de atmel (?), por ejemplo), puede convertir los bytes del ejemplo sin firmar de 16 bits sin firmar utilizando:

    UInt16 value = BitConverter.ToUInt16(new byte[] { 0xE8, 0x03 }, 0);

De lo contrario, es posible que primero tenga que revertir el orden de los bytes.

    
respondido por el Rev1.0
1

es posible que desee considerar los números de punto fijo de muchas maneras, dependiendo de los datos que espera tratar en su aplicación

  • solo una fracción de 8 bits x su valor sería x / 255
  • Entero de 8 bits x con fracción de 8 bits y su valor x + y / 255
  • Fracción de 8 bits x veces 2 a la potencia del entero de 8 bits y, (x / 255) * 2 ^ y
  • fracción de 8 bits x veces 10 a la potencia del entero de 8 bits y, (x / 255) * 10 ^ y
  • todo lo anterior pero con 16 bits para x e y

comprueba esta aplicación de biblioteca enlace

Otra forma es usar el punto flotante IEEE

    
respondido por el muayyad alsadi
0

No hay elementos como "conversión" porque "byte" no es una representación numérica.

Hex, int, float son representaciones. Así, 4 bytes se pueden representar como:

  • un entero sin signo de 0 a 4294967295
  • un indicador interno firmado desde - −2147483648 hasta +2147483647
  • un flotador

Por lo tanto, si tiene un flotador de 4 bytes y envía esos cuatro bytes. Luego los vuelves a juntar y eso es todo. No hay necesidad de convertir nada. 4 bytes son 4 bytes.

Pero, tienes que decirle a tu compilador, que la variable que contiene los 4 bytes tiene que ser interpuesta en un flotador. (No especificó qué idioma está utilizando. Por lo tanto, asumiré "C"). Tienes que hacer un casting para flotar en tu variable.

    
respondido por el Blup1980
0

Puede enviar cualquier tipo de datos a través de la línea serie. Al recibir los datos, todos serán un conjunto de bits empaquetados en paquetes (según el protocolo). La tarea del software en el lado receptor es interpretar correctamente los datos recibidos.

Obviamente, aparte de los datos que necesita para enviar información sobre el tipo de datos. Por ejemplo: si se recibe el byte A, el byte siguiente será el byte B (datos) y, a continuación, se recibirá el byte C (datos) ...

    
respondido por el kolibri

Lea otras preguntas en las etiquetas