TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Jummi en 24 de Noviembre de 2010, 21:00:42

Título: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 24 de Noviembre de 2010, 21:00:42
Vamos a ver que me estoy liando con un programita que intento hacer.
Yo recibo los datos del puerto serie y los guardo en un array. Por ejemplo tendria e array datos con dos posiciones. En Dato[0] = "F" y Dato[1]="1".
Bien quiero pasar eses dos datos del array a una variable te tendria el valor "f1".

Alguien me podria decir la forma mas facil de hacer esto?
Estube intentandolo con srtcat y strcpy y no consegui que funcionara.

Si alguien me puede pegar un ejemplo lo agradeceria.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Suky en 24 de Noviembre de 2010, 21:18:38
Convendría que hagas lo siguiente:

Código: C
  1. #INCLUDE <stdlib.h>
  2.  
  3.  
  4.  
  5. char Data[3];
  6. char Value;
  7.  
  8. Data[0]='F';Data[1]='1';Data[2]='\0';
  9. Value=atoi(Data);


Saludos!
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: RICHI777 en 24 de Noviembre de 2010, 21:19:44
Hola la función que realiza eso es atoi, pero primero debes tratar a tu array en un string C, es decir Array[2] = 0;

Saludos !
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: RICHI777 en 24 de Noviembre de 2010, 21:20:29
jejeje vos Suky sos el gran hermano de TodoPic estas en todas !

Saludos !
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Suky en 24 de Noviembre de 2010, 21:24:08
jejeje vos Suky sos el gran hermano de TodoPic estas en todas !

Saludos !
:D :D


Saludos!  ;-)

PD: Odio ese programa  :mrgreen:
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 25 de Noviembre de 2010, 05:15:42
Agradecido a todos por la ayuda.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 25 de Noviembre de 2010, 07:58:22
Continuo chocando con el codigo. Os pego lo que intento hacer :
do{
  
  if(!control){  //llego un byte al puerto serie
    for(conta2 = 0; conta2 < LongBuffer; conta2++){
       printf("Buffer[%d]:  %c  ",conta2,Buffer[conta2]);
      
    }      
      DatoRecibido=atoi(Buffer);
      printf("\n\rResultado:  %s\n\r\0",DatoRecibido);
      control=1;
  }  

   } while (TRUE);

Bien, aqui cuando me llegan los datos del buffer los trato con atoi como me indicais. El ultimo caracter del buffer debia ser el \0. Luego reenvio la trama con prinftf mediante %s que debia enviarme la variable completa que estaba en el array Buffer. Os envio una captura de pantalla del terminal virtual del proteus y la variable Datorecibido esta vacia, verificada parando el programa y mirando esas posiciones de memoria.

El F1 que esta al principio es el dato que mando desde el terminal virtual hacia el pic.

¿ Que estoy haciendo mal ?

Agradeciendoles de nuevo su ayuda.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: bmfranky en 25 de Noviembre de 2010, 09:51:18
Hola Jummi, cuando conviertes a int, ya no es una cadena, erraste el indicador de tipo en el printf,mira;
Citar
do{
 
  if(!control){  //llego un byte al puerto serie
    for(conta2 = 0; conta2 < LongBuffer; conta2++){
       printf("Buffer[%d]:  %c  ",conta2,Buffer[conta2]);
     
    }     
      DatoRecibido=atoi(Buffer);
      printf("\n\rResultado:  %X\n\r\0",DatoRecibido);// pusiste %s , que es strin has de poner %X, en exadecimal mayúsculas o %x en minúsculas.
      control=1;
  } 

   } while (TRUE);

Prueba y me comentas como te fue.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 25 de Noviembre de 2010, 10:11:15
Tienes razon bmfranky, pero lo que hace atoi entonces no es lo que yo buscaba.

El tema es que yo tengo los datos recibidos en un array como ya esplique y quiero tratarlos todos juntos, es decir, si tengo en Buffer[0]="F" y Buffer[1]="1", yo quiero meter esas dos casillas en una sola variable que tendria el contenido "F1". Vamos que lo que quiero es concatenar el contenido de las posiciones del Buffer (F + 1 = F1).

Por eso al final quiero imprimir la variable DatoRecibido con el %s, por que ahi deberia estar la concatenacion de las casillas del array.

No se si me estais entendiendo. :-(

Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Suky en 25 de Noviembre de 2010, 11:17:47
Una sola variable no puede contener "F1", porque es codificación ascii y necesitas de 2 Bytes para almacenar eso. O sea, en Data ya tienes lo que necesitas, y con atoi lo conviertes a un valor numérico.


Saludos!
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: bmfranky en 25 de Noviembre de 2010, 11:23:33
Me pisaste Suky, iba a responder algo parecido, de todas formas, Jummi, lo que tratas son caracteres, (abcd..ikl...z123...) o números Hexadecimales (123...9ab...f), si son números al pasarlos a hex los contienes en un Byte, si no ,explica mejor que quieres conseguir, pues si son dos letras juntas , puedes crear tu propio tipo de variable y probar;
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 25 de Noviembre de 2010, 12:45:13
A ver, lo que quiero es que a traves del puerto serie me llegen unos datos, en concreto que pulsan por ejemplo la tecla F11. Mando por el rs232 una trama de 4 bytes con la F,1,1,\0. Lo que queria hacer es meter todas todos los caracteres en una sola variable para despues con un Switch decirle si es F1 ... haz esto, si es F2 haz lo otro, etc.

Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Suky en 25 de Noviembre de 2010, 12:49:45
No se puede... Lo que te conviene es codificar tu sistema, o sea, si se presiona F1 enviar 0x10, hasta F12 en donde se enviaría 0x1B. Por ejemplo, y ahi si puedes utilizar switch.


Saludos!
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Jummi en 25 de Noviembre de 2010, 13:05:55
Ah, entiendo. Intentare hacer lo que me dices.

Gracias.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 07 de Septiembre de 2011, 19:04:27
Disculpen que traiga al "presente lo pasado" (el hilo es del año pasado) pero tengo el mismo problema, es decir, mi programa almacena en un array una cadena de caracteres proveniente del USB CDC en realidad espero recibir una trama con cabecera, Nbytes, data, checksum y tengo que seccionar toda la trama recibida en partes y luego comparar con otras cadenas fijas en mi programa.

Por ejemplo al inicio declaro:
unsigned char flag_compara;
char LeerBuffer[64];
char cadena_ok[7]="INICIO";

luego en el main lineas mas abajo hago esto:
flag_compara=memcmp(LeerBuffer,cadena_ok,6);//Comparo los primeros 6 bytes entre lo que ha llegado en "LeerBuffer" con la cadena "INICIO" pero al compilar me sale Warning [2054] suspicious pointer conversion

... que puede ser? quiero comparar parte de la cadena recibida en "LeerBuffer" con otra cadena fija "INICIO", quiero comparar los 6 primeros caracteres.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: AngelGris en 07 de Septiembre de 2011, 19:51:10
  ¿Qué compilador estás usando? Yo en HiTech usé la función strcmp() para comparar dos strings.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 07 de Septiembre de 2011, 19:52:41
uso C18. En el help de microchip dice:

signed char memcmp(
const void * buf1,
const void * buf2,
size_t memsize );

He querido declarar const void *LeerBuffer[64] pero sale error.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: MerLiNz en 08 de Septiembre de 2011, 14:01:15
tienes varias opciones, desde punteros, hasta uniones. Por la facilidad te recomiendo las uniones, te pongo un ejemplo:


union {
   int dato16;
   char dato8[2];
} nombre;

ahora, si pones:

nombre.dato16=0xAAEE;

se guarda en la misma situacion de memoria que ambos char dato8, es decir dato8[0] y [1] contendra:
dato8[0]=EE;
dato8[1]=AA;

mirate las uniones, son muy utiles para estos casos, ademas hay mil formas de convinarlas.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 08 de Septiembre de 2011, 14:47:06
Pero eso es para 2 caracteres, y en realidad yo necesito comparar 2 cadenas, la primera cadena me llega con longitud variable que en el peor caso me llegan 64 caracteres, pero pueden llegar a veces 5 caracteres como a veces llegan 13 o 52 caracteres, y cuando llega la cadena necesito analizar la cadena recibida, e ir analizando, por ejemplo la cabecera es fija y de 5 caracteres por ejemplo "FORMA" entonces tengo que comparar los primeros 5 caracteres de la cadena 1 con la cadena 2 = "FORMA" y si eso es verdad paso ahora a analizar la cadena formada por los bytes 6 y 7 que contienen el opcode y lo comparo con la cadena 2 = "10" y si es verdad tomo una acción, sino, lo comparo con cadena 2 = "11" y si es verdad tomo otra acción.

Al parecer no esta permitido hacer: cadena2="FORMA", pero creo que si esta permitido hacer: cadena2[5]="FORMA" lo cual tengo entendido se le llama array, esta ultima expresión lo veo mejor porque se ve mas simple pero como lo defino?
char cadena2[5]="FORMA" ? o int, short long? y como comparo? pensaba usar algo como:

flag_compara = memcmp(cadena1,cadena2,5);//comparo los 5 primeros caracteres de cadena1 con los 5 primeros caracteres de cadena2.

pero no me funciona.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: MerLiNz en 08 de Septiembre de 2011, 14:55:36
no no, eso es para los caracteres que quieras, en vez de [2] pones [64] si es tu maximo.

De todas formas, segun veo lo que vas es recibiendo caracteres, pues muy facil.

char buf[64]; //aki vas guardando los caracteres ke recibes


if(!strcmp(&buf,"COMPARAR")) {
   lacadenaesigual;
}

el strcmp lo tienes en string.h, este devuelve 0 si la cadena es identica (hasta llegar a un 0), tambien puedes usar strncmp que es igual solo que en el 3er parametros debes especificar el NUMERO DE CARACTERES A COMPARAR.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 08 de Septiembre de 2011, 18:09:53
A ver, tengo declarado #include <string.h> al inicio del programa, luego:

char LeerBuffer[64];
despues mas adelante hago:

if(strcmp(&LeerBuffer,"AVG30")==0)
{LATBbits.LATB5=1;}
else
{LATBbits.LATB5=0;}

y me sale el error:
...\main.c:221: Warning [2054] suspicious pointer conversion
...\main.c:221: Warning [2066] type qualifier mismatch in assignment

voy probando miles de formas y me salen errores similares de compilación. Voy a probar con un for a ver si por ahi lo hago.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: MerLiNz en 08 de Septiembre de 2011, 18:17:45
no es un error, es un warning, utilizas C18 o CSS?

En C18 puede que no te funcione porque este mete las strings constantes como rom y no ram, para solucionarlo hazlo asi:

ram char avg[]="AVG30"; y haces strcmp(&LeerBuffer,&avg);

si usas CSS creo que no tendrias problemas, pero pruebalo antes de nada.

Aun asi, no te olvides de que puedes usar el strNcmp por si leerbuffer pone algo mas de AVG30, por ejemplo AVG30XAS, asi solo comparas las 5 primeras letras, se quedaria en strncmp(&LerrBuffer,&avg,5);
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 08 de Septiembre de 2011, 18:50:50
Por fin funcionó gracias Merlinz, lo hize en estas dos formas:

ram char cadena_ok[]="caja";
int flag_compara;

forma1:
if(strncmp(LeerBuffer,cadena_ok,2)==0)//solo espero la cadena "ca"
   {LATBbits.LATB5=1;}
   else
   {LATBbits.LATB5=0;}

forma2:
flag_compara=strncmp(LeerBuffer,cadena_ok,4);//espero la cadena "caja"
if(flag_compara==0)//bien
   {LATBbits.LATB5=1;}
   else
   {LATBbits.LATB5=0;}

gracias, disculpen si vuelvo a molestar hasta que me acostumbre al c.
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: Suky en 08 de Septiembre de 2011, 19:27:16
Puedes revisar en hlpC18Lib ubicado en C:\MCC18\doc.

En C18 para comparar un string en RAM con un string en Memoria de Programa tienes:

Código: C
  1. if(strcmppgm2ram(&Buffer[0],"Hola")==0){
  2.  
  3. }

Saludos!
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: MerLiNz en 09 de Septiembre de 2011, 14:26:52
Puedes revisar en hlpC18Lib ubicado en C:\MCC18\doc.

En C18 para comparar un string en RAM con un string en Memoria de Programa tienes:

Código: C
  1. if(strcmppgm2ram(&Buffer[0],"Hola")==0){
  2.  
  3. }

Saludos!

esa funcion desconocia que existiese xD pero si, es mejor asi no ocupas ram
Título: Re: Pregunta de novato: "Pasar de un array a una variable"
Publicado por: jorgejg en 09 de Septiembre de 2011, 17:51:57
Probe esa función pero me salió error, uhm bueno igual digamos de la forma anterior si compila, pero ahora tengo el inconveniente para enviar un arreglo de caracteres con putUSBUSART(cadena_ok,3), es decir envio a la pc los caracateres que recibo de la pc (eco) pero no funciona bien, despues de enviarle muchas cadenas recien responde y encima mal. Cree un hilo para esto, disculpen si hablo de eso en este hilo.