Autor Tema: Ayuda con función para enviar por TX datos de distintos tipos.  (Leído 1409 veces)

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

Desconectado gustavoheras

  • PIC10
  • *
  • Mensajes: 10
Ayuda con función para enviar por TX datos de distintos tipos.
« en: 03 de Julio de 2018, 19:28:22 »
Saludos amigetes, espero estén genial. Necesito ayuda de los mas experimentados en lo siguiente. Estoy jugando con un PIC18F4550, específicamente con la comunicación serie del modulo EUSART.
Tengo una función que mando a llamar para imprimir un carácter (enviar por Tx y lo visualizo en Putty) de tipo char, llamada,  printSerial(char c), por lo mismo si la llamo para imprimir un int o un float, el compilador XC8 me manda error, lo cual es lógico puesto que la función espera un char. ¿La solución?: escribí una función printSerial_int(int i) que funciona únicamente con argumentos de tipo int. Ahora, yo no quisiera escribir una función para cada tipo de dato y que todas se llamen diferente. Desgraciadamente xc8 corre bajo el C standar C99 que no permite sobrecarga de funciones tal como el C11 o C++.
Conocen alguna forma, técnica, conjuro o ritual para lograrlo?

Gracias de antemano.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con función para enviar por TX datos de distintos tipos.
« Respuesta #1 en: 03 de Julio de 2018, 21:03:28 »
Tenes distinto acercamientos, el mas comun es el siguiente.
Primero podrias usar sprintf para imprimir sobre un array, y luego enviar por ese array
Tu printSerial deberia enviar un string, ya que un float tiene varios numeros, no uno solo.

Código: C
  1. float var1 = 1.234;
  2. char txt[10];
  3.  
  4. sprintf(txt,"%f",&var1);
  5. printSerial(txt);               // Imprime varios char


Como vos decis no existe forma de recrear un "overload" de funciones como posee C++.
Podrias usar un puntero a void, pero necesitarias si o si identificar el tipo de argumento que pasas:

Código: C
  1. void funcion(void * data, enum tipo_t tipo)
  2. {
  3.   switch(tipo)
  4.   {
  5.     case INT:
  6.         funcion_int((int *)data);
  7.         break;
  8.     case FLOAT:
  9.         funcion_float((int *)data);
  10.         break;
  11.   }
  12. }

De esa forma segun el tipo podrias hacer una cosa u otra. Aun asi, tanto en C como C++ tenes que escribir cada una de las funciones. Pero ojo que podes pasar un char y ponerle tipo FLOAT, teniendo todos los posibles problemas que pueden existir.

La otra opcion que vi es crear tu propio printf, y a medida que se va enviando el texto que uno le pasa, va llamando a cada una de las variables... pero los float es un dolor de cabeza computacional para el micro. Tambien es lidiar con funciones con numeros de argumentos variables. Y como decia a medida que se van enviando las letras al detectar un % se fija la proxima letra para saber como tomar el valor que uno le pasa (si float,int, etc)

La otra es usar una libreria:
https://github.com/mpaland/printf