Autor Tema: igualar CHAR  (Leído 4188 veces)

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

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
igualar CHAR
« en: 30 de Enero de 2007, 14:57:28 »
Buenas tengo un problemilla con unos char en el CCS.

Tengo una rutina BT_busqueda() que deberia devolver un char y quiero hacer lo siguiente:

char datos[50];

datos=BT_busqueda();

pero me da error (Expecting LVALUE such as a variable name or *expression).

el codigo de la rutina es este:

//Busqueda de 1 dispositivos bluetooth

char BT_busqueda(){

   char data_in[50],data[50];
   int8 i;
   
   for(i=0;i<54;i++){
      data_in=" ";
      data=" ";
   }
   
   printf("ATDI,1,00000000\r");
   
   for(i=0;i<40;i++){
      data_in=fgetc(BLUETOOTH); 
      if(data_in[9]=='D'){
         data[1]="N";
         goto salir;
      }
   }
   
   for(i=9;i<53;i++){
      if(data_in==13){
        break;
      }
      data[i-9]=data_in;
   }
 
 salir:
   return data;
}

La rutina la he probado y funciona bien, el problema es que no me deja hacer datos=BT_busqueda();
BitPIC

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: igualar CHAR
« Respuesta #1 en: 30 de Enero de 2007, 15:19:13 »
Debes pasar un parámetro a la función, ten en cuenta que el dato que devuelves es en una variable local y no en una global, pasale una variable a la función:
Código: C
  1. char BT_busqueda(char *data){

o de esta forma
Código: C
  1. char BT_busqueda(char data[50]){

Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: igualar CHAR
« Respuesta #2 en: 30 de Enero de 2007, 15:20:45 »
char datos[50];

datos=BT_busqueda();


datos es un arreglo de 50 chars, y tu estas asignandole un simple char.

Debieras hacer algo así como datos[0] = BT_busqueda();

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: igualar CHAR
« Respuesta #3 en: 30 de Enero de 2007, 15:44:56 »
OK tenias razon no me acordaba que se hacia poniendo datos[0] = BT_busqueda();

Pero ahora tengo otro porblema. NO devuleve lo que tendira que devolver.

Tengo una pantalla LCD y antes de hacer el return data; imprimo en la pantalla el data y sale bien, pero en el programa principal no lo devuelve.

Que puede ser??

Hago esto:

datos[0] = BT_busqueda();
gclcd_gotoxy(5,35);
printf(gclcd_putc,"%S"datos);

Uso exactamente la misma instruccion para imprimir en un lado y en otro.
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: igualar CHAR
« Respuesta #4 en: 30 de Enero de 2007, 19:11:27 »
¿Podrías ser más ejemplificador aclarando que esperas que te devuelva y que te devuelve?

No he revisado el código de la función buscar ya que habías dicho anteriomente que funcionaba bien.

Cómo indicio fíjate lo siguiente

Código: C
  1. char BT_busqueda(){
  2.  
  3.    char data_in[50],data[50];
  4.    int8 i;

No es bueno hacer una declaración de 2 variables de 50 bytes dentro de una función.  Esto hace (en general) que tu compilador ubique dichas variables en el stack para que luego dichas posiciones de memoria queden libres al salir de la rutina. 

Tal vez con ese manejo tengas algún problema de overflow de stack.  Es solo una sugerencia, tal vez simplemente la lógica de la función está mal hecha.

« Última modificación: 30 de Enero de 2007, 19:13:18 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: igualar CHAR
« Respuesta #5 en: 30 de Enero de 2007, 19:46:35 »
El tema esta en que en la rutina se hace una comuncacion con un modulo bluetooth con comandos AT, el bluetooth le devuelve al PIC unos caracteres ("\n\rOK\n\r\n\r000982737283823,002002902,Nombre\n\rDONE\n\r") los del parentesis me los he inventado, ahora mismo no se cuales son de memoria pero es algo asi. La cuestion es que lo descarto todo menos 000982737283823,002002902,Nombre que es lo que guardo en el data[50].

Antes de llegar al return los saco por la pantalla para ver si han llegado bien, hasta aqui todo bien, se imprimen correctamente en la pantalla. Justo despues de esto hago un return data; para volver al programa principal donde se ha llamado a esta rutina. En el programa principal llamo a la rutina de esta manera:

datos[0]=BT_busqueda();

y a continuacion vuelvo a imprimir esta vez datos una linea mas abajo, con lo cual se deberian imprimir las mismas cosas en una linea y en otra. Lo que pasa es que en la linea de abajo se escriben unos pocos caracteres y no tienen nada que ver con los que deberian ser.

Por cierto en el programa que he puesto en el primer mensaje no sale la parte de imprimir en pantalla.

Os paso el nuevo codigo:

char data_in[50],data[50];

char BT_busqueda(){
   int8 i;
   
   for(i=0;i<50;i++){
      data_in=" ";
      data=" ";
   }
   
   printf("ATDI,1,00000000\r");
   
   for(i=0;i<50;i++){
      data_in=fgetc(BLUETOOTH); 
      if(data_in=='D'){
         if(data_in[i-1]==10){
            break;
         }
      } 
   }
     
   for(i=9;i<50;i++){
      if(data_in==13){
        break;
      }
      data[i-9]=data_in;
   }
   gclcd_gotoxy(5,35);       
   printf(gclcd_putc,"%S"data);  // imprimo en pantalla, hasta aqui todo bien
   return data; 
}
« Última modificación: 30 de Enero de 2007, 19:52:39 por bitpic »
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: igualar CHAR
« Respuesta #6 en: 30 de Enero de 2007, 20:00:05 »
buenas acabo de arreglarlo de una manera un poco chapuzas. A ver que os parece

He declarado los char fuera de la rutina para que sean variables publicas y en el programa principal he hecho lo siguiente:

      BT_busqueda();
      gclcd_gotoxy(5,45);
      printf(gclcd_putc,data);
     
con buenos resultados.

No se si es una buena manera de hacerlo, pero es una alternativa. ¿Que opinais?¿Puede causar algun tipo de error?
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: igualar CHAR
« Respuesta #7 en: 30 de Enero de 2007, 20:30:20 »
Declarar variables globales hace que las mismas estén siendo ocupadas durante toda la ejecución del programa.  Esa es la desventaja, después de eso, no hay perjuicios.

De hecho, en los pics y mundo embedded no es frecuente declarar muchas variables locales, ya que esto hace que ocupen espacio del stack y hace que la ejecución del soft sea más lenta.   
Cada aplicación es un mundo aparte.  En algunas será conveniente usar variables locales y en otras no.

Cuando lo que prima es la velocidad de ejecución siempre conviene variables globales. 

También, cada compilador de C tiene sus trucos, aunque hay reglas generales que se aplican a cualquier lenguaje C.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: igualar CHAR
« Respuesta #8 en: 30 de Enero de 2007, 20:56:32 »
Muchas gracias Maunix, la verdad es que cada vez que me sumejo mas en esto del C para microcontroladores PIC me doy cuenta de los obstaculos que tienes que ir sorteando en el compilador ejej :D

Ya como punto final, ¿Que procesadores, microcontroladores, dsp, dispositivos emmbeded, etc. me recomendais a la hora de hacer aplicaciones "guapas"? Es que ultimamente los PIC me estan cansando un poco y me gustaria explorar algun mundillo un poco mas profesional o robusto  :mrgreen:

Gracias a todos.
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: igualar CHAR
« Respuesta #9 en: 30 de Enero de 2007, 22:23:51 »
Muchas gracias Maunix, la verdad es que cada vez que me sumejo mas en esto del C para microcontroladores PIC me doy cuenta de los obstaculos que tienes que ir sorteando en el compilador ejej :D

Ya como punto final, ¿Que procesadores, microcontroladores, dsp, dispositivos emmbeded, etc. me recomendais a la hora de hacer aplicaciones "guapas"? Es que ultimamente los PIC me estan cansando un poco y me gustaria explorar algun mundillo un poco mas profesional o robusto  :mrgreen:

Gracias a todos.

Los pics son perfectamente profesionales y robustos.

Si te cansaron los 16F , puedes ir a los 18F, 24F o dsPIC.

Si aún así te quedan chicos, puedes irte a un ARM9. 

Si aún quieres más que eso, algún MIPS... de 32 bits o 64 bits.  También los hay de 64 bits multicore...

Si quieres más siempre hay chances, el tema es cuánto dinero quieres gastar!

 :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: igualar CHAR
« Respuesta #10 en: 31 de Enero de 2007, 07:22:06 »
Lo decia mas que nada porque siempre se encuentran problemas en los compiladores y cosas que no acaban de ir muy bein, pero supongo que eso tambien pasara en dispositivos de otros fabricantes.

¿no?  :D
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: igualar CHAR
« Respuesta #11 en: 31 de Enero de 2007, 08:38:11 »
Lo decia mas que nada porque siempre se encuentran problemas en los compiladores y cosas que no acaban de ir muy bein, pero supongo que eso tambien pasara en dispositivos de otros fabricantes.

¿no?  :D

Sí, todos tienen sus cosas. 

Realmente comparar un microcontrolador con otro no es tan simple y todos al final de cuentas se terminan pareciendo en cuanto a potencia y hardware extra.

La ventaja que tienen los pics es que son más simples de migrar de uno a otro que micros de otras familias donde de un modelo a otro las diferencias son más que importantes, incluso dentro de una misma familia.

Acá es un foro prácticamente 90% de pics pero no por eso son la única opción ni mucho menos.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)