TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ferorts en 01 de Diciembre de 2010, 11:10:40

Título: Reconocer Comandos Rs232
Publicado por: ferorts en 01 de Diciembre de 2010, 11:10:40
Hola, estoy haciendo un programita que reconozca los comandos introducidos por rs232, de momento tengo bien hecha,simulada y comprobada la comunicacion por rs232, lo que pasa es que necesito mediante if (anidados) que me reconozca  por ejemplo (frec 100) seria comando de 4caracteres un espacion en blanco y luego el valor o argumento, y asi mediante if anidados entraria dentro de la funcion frecuencia y me generaria una señal de 100 hz, mi duda es saber con que comando puedo realizar esto,¿tendria que recorrer el vector con un bucle for para poder hacer la seleccion de comando?, yo habia pensado en hacer un vector de 4 caracteres para los comandos de cuatro caracteres y otra variable de tipo entero com el int frecuencia,que os parece?
tipo --> if (opcion[1]=='f'){
                if(opcion[2]=='r'){
                    if(opcion[3]=='e'){
                        if(opcion[4]=='c'){
                             frecuencia(); //Llamada a la funcion
                          }
                          }
                          }
                          }
Si ha alguien se le ocurre otra idea,decirmela xf.

Gracias.
Título: Re: Reconocer Comandos Rs232
Publicado por: dolphin_96 en 01 de Diciembre de 2010, 12:16:09
Si estas usando CCS te recomiendo que hagas la funcion "strncmp()" la cual compara dos cadenas de caracteres

"strncmp  (s1, s2, n)  Compara s1 con s2 (n bytes)"
 
yo lo que hago es declarar las cadenas que voy a comparar con lo que entra en por rs-232 por ejemplo aqui pongo dos cadenas "funcion y enter" y otra (bufer[]) para almacenar lo que entra por rs-232

char funcion[8]= "CMD_FCN";
char enter[8]= "CMD_ENT";
char buffer[45];

luego cuando mando esas cadenas desde la pc termino con un caracter identificador de final en mi caso "0x0A" por ejemplo en visual basic lo envio de esta manera:
Mscomm1.Output = "CMD_FCN" & Chr (&h0A)
entonces en el PIC leo y almaceno en un buffer[]  asi:

      while(buffer!=0x0A){     // mientras que buffer sea diferente de 0x0A
         buffer=getc();
         ++i;
      }

y por ultimo lo comparo asi:

if(strncmp(buffer,funcion, 7)==0) {
   //si son iguales aqui haces lo que quieras
}
en esto ultimo lo que hace la funcion es comparar los primeros 7 bytes de "buffer" y "funcion" y si son iguales me regresa un "0" de lo contrario me regresa un "1"
para ello debes declarar la libreria:    #include <stdlib.h>

saludos.
Título: Re: Reconocer Comandos Rs232
Publicado por: RedPic en 01 de Diciembre de 2010, 12:16:19
El botón de Buscar en el Foro hace maravillas.

Recibiendo del RS232 sobre un Buffer y procesandolo posteriormente. (http://www.todopic.com.ar/foros/index.php?topic=4573.0)
Desde el PC a una EEPROM I2C y viseversa a través de mi PIC (http://www.todopic.com.ar/foros/index.php?topic=4783.0)
Teoría y praxis de las comunicaciones serie TTL con los PIC's 16F/18F en CCS C (http://www.todopic.com.ar/foros/index.php?topic=23222.0)

... por poner un ejemplo.
Título: Re: Reconocer Comandos Rs232
Publicado por: bmfranky en 01 de Diciembre de 2010, 12:33:52
Hola,ferorts, los comandos siempre miden lo mismo?.

si es asi, asignandolos a una cadena por ejemplo cadena[4], lo puedes compara asi.
char Comparar(void);

Comparar(void)
{
         if(cadena="frec")// si cadena =al comando "frec"
             {
              frecuencia();
              return(0x00); // esto no es necesario, pero te permite controlar si ha recibido un comando correcto o erroneo
              }

          if(cadena="peri")/// si cadena = al comando "peri"
              {
               periodo();
               return(0x00);
               }

                       /// así para todos los comandos asignados
return(0x01);// el comando no era valido
}

lo único que tienes que hacer es separar de la cadena de entrada, el comando y el operador.

por ejemplo enviar por puerto serie esto frec=100'\n';

cuando recibes el ultimo carácter '\n'

lees lo recibido asta el '=' y lo asignas a comando, lees hasta el '\n' y lo asignas a operador y lo conviertes a numero, después entras a comparar en el bucle y realizas lo que tengas que hacer.
Título: Re: Reconocer Comandos Rs232
Publicado por: RedPic en 13 de Diciembre de 2010, 17:57:10
Uffff, bmfranky, .....

En todos los C's del mundo se compara con == y se asigna con = por lo que creo que tus if(cadena="xxx") no compararía sino que asignaría "xxx· a la variable cadena.

Y al menos en CCSC, hasta donde se, creo que tampoco funcionaría aunque lo escribieses en la forma

Código: C#
  1. if(cadena=="xxx"){
  2.     //Haztalcosa
  3.   }

ya que no está implementada la comparación directa de strings.

E incluso si lo implementases con la función de comparación de strings, que en CCS C es strcmp(), en la forma de

Código: C#
  1. if(strcmp(cadena,"xxx")==0){
  2.     //Haztalcosa
  3.   }

tampoco funcionaría porque strcmp() solo compara variables ...

Así que sospecho, creo, intuyo, supongo que la forma correcta de comparar dos strings en CCS C es:

Código: C#
  1. comando[]="XXX";
  2.   if(strcmp(cadena,comando)==0){
  3.     //Haztalcosa
  4.   }

Título: Re: Reconocer Comandos Rs232
Publicado por: dolphin_96 en 14 de Diciembre de 2010, 13:09:53
y por ultimo lo comparo asi:

if(strncmp(buffer,funcion, 7)==0) {
   //si son iguales aqui haces lo que quieras
}
en esto ultimo lo que hace la funcion es comparar los primeros 7 bytes de "buffer" y "funcion" y si son iguales me regresa un "0" de lo contrario me regresa un "1"
para ello debes declarar la libreria:    #include <stdlib.h>

saludos.


Claro asi si funciona yo lo manejo mucho para leer un scaner de codigos de barras en el cual escaneo etiquetas que son comandos y los interpreta el PIC. saludos
Título: Re: Reconocer Comandos Rs232
Publicado por: ferorts en 19 de Diciembre de 2010, 17:10:19
Así que sospecho, creo, intuyo, supongo que la forma correcta de comparar dos strings en CCS C es:

  comando[]="XXX";
  if(strcmp(cadena,comando)==0){
    //Haztalcosa
  }

En primer lugar gracias a todos, por responder, he estado liado con la pcb(ya que si no conseguia que funcionase poco iba a hacer el pic)pero ya esta funcionando, :),he estado probando las diferentes soluciones y mirando los comandos del manual del compilador, pero mi problema que a la hora de simular con el proteus he introducir los comandos por el teclado usando una conexion vitual con el Virtual serial port simulator, no consigo que me funcione, ya que al introducir el comando en cuanto introduzco dos caracteres me sale el mensage de  vualva a introducir comando o no hace nada o me salen los textos de todas las opciones una tras otra, he probado usar delay detras de gets(cadena) y nada o se keda bloqueado y no hace nada,tambien he probado con la primera opcion de "frec" definir como constante antes del main(por si sonaba la flauta)pero nada, la verdad es que ya no se que probar ni ke estoy haciendo mal, lo unico que quiero hacer de momento es que reconozca los comandos que le introduzco por el teclado via rs232, si alquien me pueda hechar una mano, un millon de gracias.

Gracias.


#include <16F886.h>

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232


int opc;
char *opcion="frec";
//char *opcion2="onr1";
//char *opcion3="ofr1";

char *s2;



void main(){

//do{

printf("\r\n Introduzca Comando y Pulse Intro :");
gets(cadena);
delay_ms(1000);

comando[]="frec";
comando2[]="onr1";
comando3[]="ofr1";

if(strcmp(cadena,opcion)==0)
      {   
      printf("Frecuencia");
      }
else
      {
        if(strcmp(cadena,comando2)==0)
            {
            printf("Encender Rele 1");
            }
        else
            {
            if(strcmp(cadena,comando3)==0)
                {
                printf("Apagar Rele 1");
                }
            else
                {
                printf("Vuelva A Introducir comando:");;
                }
            }
        }
//}
}
while(1);
}
Título: Re: Reconocer Comandos Rs232
Publicado por: ferorts en 20 de Diciembre de 2010, 05:22:06
Esta mañana me he puesto con ello y no se si seria el hyperterminal, el proteus o el virtual port, o windows, o la almohada, pero lo cierto que esta mañana me funciona, eso si si igual uno de cada 15 o menos se ralla, lo probare en el micro a ver si me pasa lo mismo.

Gracias.

Aqui esta el codigo por si le sirve a alguien.

#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES NOWRT //Program memory not write protected
#include <string.h>
#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232

encendido_laser();
frecuencia();

void main()
{
char s2[8]; //Creamos una varible de intercambio
//char s1[8]; //Creamos una varible de intercambio
char *opcion="frec";
char *opcion2="onr1";
char *opcion3="ofr1";
char *opcion4="onla";

//int iresult;
printf("\f");

do{



printf("\r\n Comando :");
fgets(s2);
printf("\r\n Comando introducido es ");
puts(s2);

delay_ms(10);

if(strcmp(s2,opcion)==0)
      {   
      printf("\r\n Frecuencia");
      frecuencia();
      }
else
      {
        if(strcmp(s2,opcion2)==0)
            {
            printf("\r\n Encender Rele 1");
            }
        else
            {
            if(strcmp(s2,opcion3)==0)
                {
                printf("\r\n Apagar Rele 1");
                }
            else
                {
                if(strcmp(s2,opcion4)==0)
                {
                printf("\r\n Encendido Laser");
                encendido_laser();
                }
                else
                {
                printf("\r\n Vuelva A Introducir comando:");;
                }
            }
        }


}
}
while(1);
}


char encendido_laser(){
char on_la;
printf("\n\r Encendido Laser\n\r");
//return(0x00);
}
char frecuencia(){
char frec;
printf("\n\r Frecuencia Programable\n\r");
//return(0x00);
}
Título: Re: Reconocer Comandos Rs232
Publicado por: bmfranky en 16 de Abril de 2011, 13:18:11
Uffff, bmfranky, .....

En todos los C's del mundo se compara con == y se asigna con = por lo que creo que tus if(cadena="xxx") no compararía sino que asignaría "xxx· a la variable cadena.

Y al menos en CCSC, hasta donde se, creo que tampoco funcionaría aunque lo escribieses en la forma

Código: C#
  1. if(cadena=="xxx"){
  2.     //Haztalcosa
  3.   }

ya que no está implementada la comparación directa de strings.

E incluso si lo implementases con la función de comparación de strings, que en CCS C es strcmp(), en la forma de

Código: C#
  1. if(strcmp(cadena,"xxx")==0){
  2.     //Haztalcosa
  3.   }

tampoco funcionaría porque strcmp() solo compara variables ...

Así que sospecho, creo, intuyo, supongo que la forma correcta de comparar dos strings en CCS C es:

Código: C#
  1. comando[]="XXX";
  2.   if(strcmp(cadena,comando)==0){
  3.     //Haztalcosa
  4.   }



Hola chicos , que bien estar otra vez aquí después de tanto tiempo,  sin poder pasar un rato leyendo sobre lo que me gusta.

Hola RedPic, las prisas es lo que tienen  :oops:, tienes toda la razón , me comí un "=", el problema es que estoy acostumbrado a escribir en c++ builder que soporta sobrecarga de operadores, entonces salvo el error de poner "=" en vez de "==", el código de antes si funciona y hace la comparación como yo lo indicaba, siento haber confundido mas a ferorts, solo quería aportar ideas... ;-)