Autor Tema: Manejo de cadenas de texto en MikroC  (Leído 10430 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado johnko63

  • PIC10
  • *
  • Mensajes: 4
Manejo de cadenas de texto en MikroC
« en: 13 de Diciembre de 2009, 08:50:20 »
Hola.

Soy nuevo en esto de la programacion en C para Pic, y aunque tengo algunas nociones muy basicas sobre C ando algo perdido.

Tengo una duda con un programa que estoy haciendo, basicamente es un programa que ejecuta una rutina simple de parpadeo de un led, esta rutina no es realmente funcional, solo la utilizo para ver que el programa en main() se ejectua siempre tras atender la interrupcion de la usart, si se activa interrupcion por recepcion de puerto serie para la ejecucion del programa principal, recoge los datos y los almcena en una cadena de char, tras esto se los pasa a una funcion que ha de identificar que le ha llegado y con esto ejecutar una funcion (de momento lo que hace es devolver por el puerto serie una cadena de texto).

Los datos que le llega por el puerto serie pueden ser los siguientes:

-  :GS#
-  :F+# , :F-# .... etc, los que se ven en el codigo que compara.

Con lo cual lo que hago en la funcion es primero comparar el bit a continuacion  de los dos puntos, si es G devuelvo el mensaje, si no es G entonces en las siguientes comparo el siguiente caracter, ya que en ese caso el siguiente a los dos puntos s no es G siempre sera F, con lo cual comparamos el siguiente caracter para ver que nos ha devuelto, el terminador siempre es # .

El problema es que esta funcion no me compara bien los datos que le llegan, y sea lo que sea siempre ejecuta el primer "if" para ver si es :GS# y lo da como bueno, devolviendome la cadena de esa comparacion, aunque lo que le estoy enviando no sea eso.

A ver si me podeis ayudar un poco, ya que ando bastante perdido con esto, os pego el codigo y gracias por todo.

Código: [Seleccionar]
char output[10];  //Declaramos variables para almacenar datos serie


void ChequeoRecepcion(char *Cadena)
     {

       if (Cadena[1] = 'G') Uart1_Write_Text("Devuelve Hora");
       else if (Cadena[0] = '+') Uart1_Write_Text("Foco adentro");
       else if (Cadena[0] = '-') Uart1_Write_Text("Foco afuera");
       else if (Cadena[0] = 'Q') Uart1_Write_Text("Paro enfoque");
       else if (Cadena[0] = 'F') Uart1_Write_Text("Maxima Velocidad");
       else if (Cadena[0] = 'S') Uart1_Write_Text("Minima velocidad");
       else if (Cadena[0] = '1') Uart1_Write_Text("Velocidad 1");
       else if (Cadena[0] = '2') Uart1_Write_Text("Velocidad 1");
       else if (Cadena[0] = '3') Uart1_Write_Text("Velocidad 3");
       else if (Cadena[0] = '4') Uart1_Write_Text("Velocidad 4");

}

void interrupt(){
if (UART1_Data_Ready() == 1) {  //Comprobamos que hay datos en el buffer serie
     UART1_Read_Text(output, "#", 10); //Lee texto hasta que encuentra "#"
     //Delay_ms(2000);                   //Retardo para comprobar func.interrupcion
     ChequeoRecepcion(output);  //Devolvemos datos recibidos excepto terminador "#"

}
}




void main() {

UART1_Init(9600);  //Inicializa el Uart seleccionado a 9600 baudios
Delay_ms(100);     //Retardo para que de tiempo a inicializar el pto.serie
trisa = 0;        //puerto a configurado como salida
PIE1.RCIE = 1;    //Habilitamos interrupcion por recepcion serie
INTCON = 0XC0;    //Habilitamos GIE=int.globales y PIE=int.perifericos

while(1){         //bucle para comprobar funcionamiento de interrupciones

PORTA.F0 = 1;         //PORTA.0=1
Delay_ms(500);        //Retardo de 500ms
PORTA.F0 = 0;         //PORTA.0=0
Delay_ms(500);        //Retardo de 500ms
}
//
}


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo de cadenas de texto en MikroC
« Respuesta #1 en: 13 de Diciembre de 2009, 10:50:29 »
Hola johnko63!

Cuando haces la evaluación de una condición el igual es ==, revisa el manual del compilador. Después si recibes una cierta cantidad de caracteres fijos, veo que recibes 4, puedes esperar a recibir :, almacenar los siguientes 2 y salir al recibir #.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado johnko63

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo de cadenas de texto en MikroC
« Respuesta #2 en: 13 de Diciembre de 2009, 13:16:46 »
Hola johnko63!

Cuando haces la evaluación de una condición el igual es ==, revisa el manual del compilador. Después si recibes una cierta cantidad de caracteres fijos, veo que recibes 4, puedes esperar a recibir :, almacenar los siguientes 2 y salir al recibir #.


Saludos!

Hola Suky.

En primer lugar gracias por la ayuda, no habia caido en lo del ==, cosas de novato....jeje, por otra parte cambiando esa parte del programa ya efectivamente me evalua las condiciones pero no consigo que evalue mas que la primera, ya que las siguientes si le digo que evalue Cadena[0] nunca me responde, si le digo que evalue Cadena[1] si que responde siempre que le envie una secuencia manipulada, es decir, si es :F+# no se entera si le mano :++# si que evalua el primer +, con lo cual no se como modificar para que evalue justo la parte final, el ultimo caracter.

Gracias por la ayuda.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Manejo de cadenas de texto en MikroC
« Respuesta #3 en: 13 de Diciembre de 2009, 13:56:01 »
Puedes esperar a recibir :, y después guardar los siguientes 2 caracteres:

  • Recibí ':' ? Si, lo indico con una variable (Control) para que los siguientes los almacene, si no sigo esperando.
  • Dependiendo de la variable Control guardo en carácter 1 u 2.
  • Ya recibí los 2? Reseteo control y quedo en espera de otros, pero indico mediante un flag que hay una trama para comparar.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado johnko63

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo de cadenas de texto en MikroC
« Respuesta #4 en: 14 de Diciembre de 2009, 04:05:14 »
Fallo tonto!!!!

Revisando el manual vi que las selecciones de cadenas de variables se hacen de izquierda a derecha!!!! yo daba por supuesto que era al reves, con lo cual el caracter o era siempre ":" , he cambiado la rutina de comparacion para que mire el caracter [2] y ha funcionado.

Ahora toca implementar el control del motor paso a paso, me pongo con ello esta semana, a ver que sale.

Lo de modificar la rutina para que espera a los ":" , almacene 2 caracteres e ignore el resto sera en la version 1.1 ...... jeje, de momento quiero que sea mas o menos funcional y despues ya me pondre a depurar codigo.

Gracias.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Manejo de cadenas de texto en MikroC
« Respuesta #5 en: 17 de Diciembre de 2009, 20:10:30 »
Supongo que para este caso es mejor que utilices un switch case, ya que es un poco más compacto y mas eficaz.

Código: [Seleccionar]
if (Cadena[1] = 'G') Uart1_Write_Text("Devuelve Hora");
else{
   switch case cadena[2]{
       case '+': Uart1_Write_Text("Foco adentro");break;
       case '-': Uart1_Write_Text("Foco afuera");break;
       case 'Q': Uart1_Write_Text("Paro enfoque");break;
       case 'F': Uart1_Write_Text("Maxima Velocidad");break;
       case 'S': Uart1_Write_Text("Minima velocidad");break;
       case '1': Uart1_Write_Text("Velocidad 1");break;
       case '2': Uart1_Write_Text("Velocidad 1");break;
       case '3': Uart1_Write_Text("Velocidad 3");break;
       case '4': Uart1_Write_Text("Velocidad 4");}}
« Última modificación: 17 de Diciembre de 2009, 20:18:37 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado johnko63

  • PIC10
  • *
  • Mensajes: 4
Re: Manejo de cadenas de texto en MikroC
« Respuesta #6 en: 21 de Diciembre de 2009, 08:42:28 »
Supongo que para este caso es mejor que utilices un switch case, ya que es un poco más compacto y mas eficaz.

Código: [Seleccionar]
if (Cadena[1] = 'G') Uart1_Write_Text("Devuelve Hora");
else{
   switch case cadena[2]{
       case '+': Uart1_Write_Text("Foco adentro");break;
       case '-': Uart1_Write_Text("Foco afuera");break;
       case 'Q': Uart1_Write_Text("Paro enfoque");break;
       case 'F': Uart1_Write_Text("Maxima Velocidad");break;
       case 'S': Uart1_Write_Text("Minima velocidad");break;
       case '1': Uart1_Write_Text("Velocidad 1");break;
       case '2': Uart1_Write_Text("Velocidad 1");break;
       case '3': Uart1_Write_Text("Velocidad 3");break;
       case '4': Uart1_Write_Text("Velocidad 4");}}

Muchas gracias, voy a probar tal y como comentas a ver que tal funciona, ya te comento.

Saludos.