Autor Tema: Reconocer Comandos Rs232  (Leído 4777 veces)

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

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Reconocer Comandos Rs232
« 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.

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: Reconocer Comandos Rs232
« Respuesta #1 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.
« Última modificación: 01 de Diciembre de 2010, 12:19:22 por dolphin_96 »
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Reconocer Comandos Rs232
« Respuesta #3 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.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Reconocer Comandos Rs232
« Respuesta #4 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.   }

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: Reconocer Comandos Rs232
« Respuesta #5 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
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Reconocer Comandos Rs232
« Respuesta #6 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);
}

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Reconocer Comandos Rs232
« Respuesta #7 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);
}

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Reconocer Comandos Rs232
« Respuesta #8 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... ;-)
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.


 

anything