Autor Tema: Enviar una estructura desde un micro y recuperarla en la PC  (Leído 4923 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Enviar una estructura desde un micro y recuperarla en la PC
« en: 25 de Diciembre de 2013, 10:27:52 »
Hola, estoy tratando de armar una estructura de datos en un micro (ARM), enviarla por el puerto serie y recuperarla en C o C++ en una PC... Alguien tiene algún ejemplo o conoce algun documento donde leer sobre esto?

Saludos!
-
Leonardo Garberoglio

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #1 en: 25 de Diciembre de 2013, 11:38:27 »
Hola Garbe! Feliz Navidad!
Acá http://www.ucontrol.com.ar/forosmf/programacion-en-c/punteros-(duda-o-eso-creo)/
Encontré algo sobre el tema de enviar estructuras que explica muy bien Suky.
Saludos
          Jukinch

Cito a Suky:
"Creas una union, con el buffer para enviar por puerto serial y con las variables que manejas vos. Se hace de esta manera para que el código sea fácil de entender."
Código:
Código: C
  1. Código:
  2. union{
  3.     UINT8 Buffer[20];
  4.     struct{
  5.         UINT8 Temperatura;
  6.         UINT16 Presion;
  7.         UINT32 Contador;
  8.         .....
  9.     };
  10. }Data;
  11.  
  12. for(k=0;k<20;k++){WriteUart(Data.Buffer[k]);


"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #2 en: 25 de Diciembre de 2013, 15:26:40 »
Leo, como andas! Feliz navidad!

Perfecto, hasta ahí voy bien, el tema sería como hacer la otra parte, la del C o C++ o vb.net en la otra punta y definir la misma estructura y que cada cosa se reciva en su lugar...

Saludos!
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #3 en: 25 de Diciembre de 2013, 16:24:40 »
Hola Leos,

Felíz navidad a ambos.

Lo más normal y seguro sería empaquetar un poco los datos, no enviar sólo el buffer binario, ya que cualquier error en la comunicación haría muy dificil la resincronización de los datos.

En cuanto a recomponer los datos, más allá de que obviamente hay que tener en cuenta el tamaño de cada elemento de la estructura en ambos lados y el endian utilizado por cada una de las partes, dependerá un poco  del lenguaje de programación a utilizar.

Si utilizás C del lado de la PC, lo más sencillo podría ser directamente utilizar punteros para rellenar una estructura, aunque esto quedará sujeto a que los tipos de datos que se transmitan posean la mísma estructura interna (por ejemplo, un dato de tipo double en C18 es de 32 bits (limitaciones del compilador) mientras que en un compilador C como el GCC, es de 64 bits por lo que no sólo son distintos en estructura sino también en tamaño). Sino siempre tendrá que haber una adaptación de por medio. En C++ también podrías utilizar punteros, aunque técnicamente no sería la práctica correcta en C++, ya que no sería una implementación orientada a objetos. Podrías crear una clase deserializer que utilice el array de datos para rellenar tu estructura.
En VB .NET podrías o bien crear una clase similar a la que he mencionado en C++ (recordemos que VB .NET está orientado a objetos también) y podrías apoyarte en la clase BitConverter

Saludos.

« Última modificación: 25 de Diciembre de 2013, 16:29:24 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #4 en: 26 de Diciembre de 2013, 07:43:29 »
... aunque esto quedará sujeto a que los tipos de datos que se transmitan posean la mísma estructura interna (por ejemplo, un dato de tipo double en C18 es de 32 bits (limitaciones del compilador) mientras que en un compilador C como el GCC, es de 64 bits por lo que no sólo son distintos en estructura sino también en tamaño). Sino siempre tendrá que haber una adaptación de por medio.

Bruno! como andas?

Eso me temía, lo que yo quiero enviar son floats de ARM... si no son compatibles con los floats de un compilador para PC, entonces quizá me convenga simplificar todo y enviar una cadena separada por comas cada dato... hoy lo estoy haciendo así, armo una cadena con sprintf con los 9 floats que quiero enviar (corresponden a los items de una matriz de cosenos directores) y luego envío la cadena.... el tema es que a 57200bps enviar esa trama tarda 10-12mseg siendo que mi bucle de control tarda ese mismo tiempo, por ahora estoy enviando los datos a la pc cada 200ms para poder hacer debug, pero me gustaría poder enviar todos los ddatos... Estaba pensando quizá en grabar los datos de cada pasada por el bucle en la memoria I2C que trae la LPCXpresso, haciendo experimentos y luego al finalizar enviar todo a la PC.... no sé, aún estoy estudiando el tema... una estructura formada por 9 floats se enviaría mas rápido que 9 floats separados por coma?

Otra cosa, Bruno, despues voy a poner una consulta en ARM sobre interrupciones dentro de una interrupcion.... haber si me podes ayudar...

Saludos y felices fiestas!
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #5 en: 26 de Diciembre de 2013, 13:07:33 »
Eso me temía, lo que yo quiero enviar son floats de ARM... si no son compatibles con los floats de un compilador para PC, entonces quizá me convenga simplificar todo y enviar una cadena separada por comas cada dato... hoy lo estoy haciendo así, armo una cadena con sprintf con los 9 floats que quiero enviar (corresponden a los items de una matriz de cosenos directores) y luego envío la cadena.... el tema es que a 57200bps enviar esa trama tarda 10-12mseg siendo que mi bucle de control tarda ese mismo tiempo, por ahora estoy enviando los datos a la pc cada 200ms para poder hacer debug, pero me gustaría poder enviar todos los ddatos...

Es altamente probable que obtengas un 100% de compatibilidad usando la LPCXPresso con compilador GCC en los tipos de datos. Al menos en lenguajes como C, C++ y probablemente C# también.

No sé qué tanta precisión requerís, pero es casi seguro que será no sólo más rápido sino que también con valores mucho más precisos. De datos binarios tenés 9 * 4 = 36 bytes. Igualmente deberías agregar algún tipo de empaquetado como te mencionaba en mi mensaje previo. Al menos un byte que represente el SOF (Start Of Frame). Si necesitás fiabilidad de datos luego podés agregarle algún CRC o simil al final de cada paquete.

Si son 37 los bytes a enviar @57200 bauds, deberías poder enviarlos en poco menos de 6.5 mS.

Estaba pensando quizá en grabar los datos de cada pasada por el bucle en la memoria I2C que trae la LPCXpresso, haciendo experimentos y luego al finalizar enviar todo a la PC.... no sé, aún estoy estudiando el tema... una estructura formada por 9 floats se enviaría mas rápido que 9 floats separados por coma?

Con floats separados por coma te referís, me imagino, a strings con valores de tipo float? Es lo que resulta de hacer un sprintf, por eso lo asumo. Lo más rápido es seguramente enviar los datos binarios, sí. Por USB utilizando HID podrías enviar hasta 64 byte por milisegundo, sin sudar. Utilizando Isochronous podrías enviar hasta 1023 bytes por milisegundo (prácticamente 1MBps).

Otra cosa, Bruno, despues voy a poner una consulta en ARM sobre interrupciones dentro de una interrupcion.... haber si me podes ayudar...

Ahí veo que la posteaste. Sí, no hay problema. Te respondo por allá.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Enviar una estructura desde un micro y recuperarla en la PC
« Respuesta #6 en: 26 de Diciembre de 2013, 15:16:33 »
Bruno! impecable como siempre!!!

Voy a empezar a estudiar la aplicacion de la PC y ahi veré si encuentro alguna dificultad.

El tema de USB esta bueno para el debug en modo estático, pero el tema es que el proyecto es una controladora de vuelo para UAV y los datos los debería enviar de forma inalámbrica... en principio pensaba usar BT (para corto alcance) y despues ver algun modulo de RF. Todavia esta todo en estudio, recien estoy terminando de hacer funcionar la IMU formando y manteniendo la matriz DCM...

en fin, voy a empezar a probar de armar la estructura y ver si consigo rearmarla sin problemas en la PC.

Cualquier cosa te consulto!!

Saludos y gracias!
-
Leonardo Garberoglio