Datos flotantes de GUI del microcontrolador

Estoy construyendo un marco para un sistema de adquisición de datos donde el controlador envía datos (entero/flotante) a la GUI. Realicé algunos trabajos preliminares sobre tipos de datos y compiladores y descubrí que cada número entero/flotante ocupa 2/4 bytes cada uno.

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

Esta es una parte de la programación de GUI en la que confío, pero toda la comunicación de datos enviaba datos en bytes y luego los aporreaba y los mostraba como float/int.

por ejemplo, caso:

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

Necesito más claridad en el paso 4 .

Entonces, si necesitamos un número flotante/entero en la GUI, ¿cómo debemos agrupar los datos provenientes de los puertos de comunicación (USB/uart)?

Esto sería útil para construir mi comprensión y despejar mis dudas, si sugiere sus opiniones.

El paso 4 es un problema de software.
Como comentario al margen. Usaste la etiqueta PIC. Y los PIC (quizás no sean los más recientes) no tienen soporte de coma flotante en el hardware. Cualquier cálculo que use float necesita muchos ciclos para ejecutarse. ¿Estás seguro de que el punto decimal fijo no es suficiente aquí? Sería mucho más eficiente en este caso.
Asumiendo que estás usando C, el término relevante aquí es union. Desea unir una matriz de caracteres y su flotador.
Hola, les agradezco a todos por sus aportes. No tengo problemas para enviar los datos a través del USB del controlador pic y están en bytes... y 64 bytes en un formato. Así que confío en que la interfaz gráfica de usuario debe categorizar los datos en 4 bytes y reconstruir el número. ¿El controlador pic es little endian?.

Respuestas (4)

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 establecido en 1985.

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

En el lado de la PC/GUI, puede tener recursos/bibliotecas adicionales que lo ayuden con la secuencia de bytes para escribir conversiones. Independientemente de cómo realice la conversión, solo tiene que asegurarse de que utiliza las mismas reglas/estándar.

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

i = 1000

La representación little endian sería

0xE8 0x03

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

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

por cierto: ¿A qué tipo de GUI/lenguaje te refieres? Por ejemplo, C#/.NET proporciona amplios mecanismos para conversiones de tipo utilizando la clase BitConverter.

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

Suponiendo que su microcontrolador usa little endian (como todos los (?) controladores atmel, por ejemplo), podría convertir los bytes dados del ejemplo int sin firmar de 16 bits anterior usando:

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

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

por lo que necesita saber el tipo endian en el software, ¿verdad? Bueno, estoy usando Visual Studio C Sharp.
Sí, vea mi EDICIÓN a la respuesta. Incluí un ejemplo usando C#.
¿No se representaría 1000 en little endian como 0x03 0xE8? El 0xE8 está en la dirección inferior, ya que es el byte menos significativo.
Little endian significa que el byte menos significativo se almacena en la dirección de MEMORIA más pequeña. Piense en un diseño de memoria secuencial donde el primer byte reside en una dirección más baja que el siguiente. Entonces, el byte que viene primero se encuentra en la dirección inferior.

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

  • solo fracción de 8 bits x su valor sería x/255
  • Entero x de 8 bits con fracción y de 8 bits y su valor x+y/255
  • fracción de 8 bits x por 2 a la potencia del entero de 8 bits y, (x/255)*2^y
  • fracción de 8 bits x por 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

consulte esta aplicación de biblioteca https://www.allegro.cc/manual/4/api/fixed-point-math-routines/

otra forma es usar el punto flotante IEEE

flotante IEEE de 32 bits

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

Hex, int, float son representaciones. Por lo tanto, 4 bytes se pueden representar como:

  • un entero sin signo de 0 a 4294967295
  • un entero 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 armar y listo. No hay necesidad de convertir nada. 4 bytes son 4 bytes.

Pero, debe decirle a su compilador que la variable que contiene los 4 bytes debe interpretarse en un flotante. (No especificó qué idioma está usando. Por lo tanto, asumiré "C"). Tienes que hacer un casting para flotar en tu variable.

Además, existen múltiples formatos de punto fijo que se pueden representar en 4 bytes.

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

Obviamente, además de los datos, necesita enviar información sobre el tipo de datos. Por ejemplo: si se recibe el byte A, el siguiente byte será el byte B (datos) y luego se recibirá el byte C (datos)...