Autor Tema: como lidear con el caracter nulo de una cadena ´/0´  (Leído 3803 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
como lidear con el caracter nulo de una cadena ´/0´
« en: 06 de Marzo de 2011, 00:39:06 »
hola, estoy en un codigo el cual estoy usando el puerto serie del pic, para comunicarme al PC, pero el punto es que tngo la recepcion echa del pic, pero estoy teniendo problemas a la hora de tomar lo que esta en el buffer de recepcion del pic y hacer que por ejemplo ensienda un led el pic. osea le mando desde el pc al pic la palabra ensiende y quiero que el led se ensienda, pero en esto no pasa nada ya que me di cuenta que la palabra que le mando esta con el caracter nulo del buffer, como lo puedo hacer para tomar olo la palabra??

saludos
ccs c

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #1 en: 06 de Marzo de 2011, 09:16:08 »
  ¿Podrías mostrar el código?

  Que tenga el caracter nulo no debería presentar mayor inconveniente. Si vos recibís la palabra enciende y la almacenás en un buffer, bastaría con hacer una comparación utilizando la función strcmp y listo.

  Algo asi...

Código: ASM
  1. if (strcmp(buffer, "enciende") == 0)  output_high(PIN_B1);

  Yo no utilizo CCS así que tal vez haya algún error de sintaxis en cuanto a la función output....
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #2 en: 06 de Marzo de 2011, 11:16:25 »
Para empezar podrías enviarle al pic sólo un caracter. Y en función de ese caracter elegido el pic interactúe.
    ¿Que función estás usando para leer el buffer?
    ¿usás interrupciones para hacer la lectura del usart?
            Saludos.
                Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #3 en: 06 de Marzo de 2011, 12:38:31 »
hola, dejo el codigo que estoy implementando:

Código: [Seleccionar]
#use delay (clock=4000000)         //clock=20Mhz
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, stream=radio)
#USE RS232(BAUD=9600, XMIT=PIN_G1, RCV=PIN_G2, stream=antena)
#include <string.h>

char lectura_radio=0x00,lectura_antena=0x00;
char cadena_radio[30],cadena_antena[30];
char comando_radio[30],comando_antena[30];
int incremento_radio=0;
int incremento_antena=0;
int1 procesar_radio=0;
int1 procesar_antena=0;

void proceso_antena(char b);
void proceso_radio(char a);
void borrar_cadena_radio(void);
void borrar_cadena_antena(void);
void copia_cadena_radio(void);
void copia_cadena_antena(void);

#int_RDA   //interrupcion para la resepcion del master
void rda_isr()
{
//lectura_radio=0x00;
 if(kbhit()) {   //Esto es para que no se cuelgue el pic
             lectura_radio=fGETC(radio);  //guarda el valor enviado por el puerto serie
             proceso_radio(lectura_radio);
             }
}

#INT_RDA2      
void rda2_isr()
{
lectura_antena=0x00;
 //if(kbhit()) {   //Esto es para que no se cuelgue el pic
             lectura_antena=fGETC(antena);  //guarda el valor enviado por el puerto serie
             proceso_antena(lectura_antena);
            // }
}

void proceso_radio (char a){

if(a==0x0D){
 procesar_radio=1;
}
else{
cadena_radio[incremento_radio++]=a;
}
}

void proceso_antena (char b){

if(b==0x0D){
 procesar_antena=1;
}
else{
cadena_antena[incremento_antena++]=b;
}
}


void main(){

   enable_interrupts(INT_RDA);                   // Habilita Interrupción RDA
   enable_interrupts(INT_RDA2);    
   enable_interrupts(GLOBAL);      //todas las interrupciones activadas
  
fprintf(radio,"\rcomunicacion inalambrica por medio\n");
fprintf(radio,"\rdel sistema remoto de reseteo de antena\n\n
\n");
fprintf(radio,"%i",incremento_radio);

fprintf(antena,"\rcomunicacion por medio de las antenas\n");
fprintf(antena,"\rpara el reseteo de la antena\n\n
\n");
fprintf(antena,"%i",incremento_antena);

output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
output_low(PIN_D3);
output_low(PIN_D4);
while(TRUE){

if(procesar_antena==1){
fprintf(antena,"\r\n%s          %i",cadena_antena,incremento_antena);
copia_cadena_antena();
}

if(procesar_radio==1){
fprintf(radio,"\r\n%s           %i",cadena_radio,incremento_radio);
copia_cadena_radio();
}

switch (comando_radio){               <----------------AQUI EL PROBLEMAAAAAAAAA
case "prender":
                       output_high(PIN_D0);
                      break;
default:
output_low(PIN_D0);
}


}}

////////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/*      TRASPASO DE DATOS DE LOS BUFFER DE RECEPCION A NUEVAS CADENAS         */
/******************************************************************************/
////////////////////////////////////////////////////////////////////////////////

void copia_cadena_radio(void){

strcpy(comando_radio,cadena_radio);
borrar_cadena_radio();
}

void copia_cadena_antena(void){

strcpy(comando_antena,cadena_antena);
borrar_cadena_antena();
}
////////////////////////////////////////////////////////////////////////////////
/************************************FIN***************************************/
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/*          BORRAN BUFFER DE RECEPCION SERIAL DE LA UART 1 Y UART2            */
/******************************************************************************/
////////////////////////////////////////////////////////////////////////////////

void borrar_cadena_radio(void){
int c=0;
procesar_radio=0;
for(c=0;c<=incremento_radio;c++){
cadena_radio[c]=0;
}
incremento_radio=0;
}

void borrar_cadena_antena(void){
int e=0;
procesar_antena=0;
for(e=0;e<=incremento_antena;e++){
cadena_antena[e]=0;
}
incremento_antena=0;
}
////////////////////////////////////////////////////////////////////////////////
/************************************FIN***************************************/
////////////////////////////////////////////////////////////////////////////////

de todas formas tengo entendido que

Citar
  1.
      if (strcmp(buffer, "enciende") == 0)  output_high(PIN_B1);

no se puede hacer...... alomejor me equivoco,
lo otro que no quiero, crear una cadena con el nombre por ejemplo de enciende para que compare, por que gastaria mucha memoria, ya que nesesito hacer varias comparaciones en mi programa.

saludos
« Última modificación: 06 de Marzo de 2011, 12:50:44 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #4 en: 06 de Marzo de 2011, 12:56:55 »
no que onda pero ahora probe de nuevo el programa y me funciona  :mrgreen: :mrgreen: :mrgreen: pero solo el switch, ahora como lo puedo hacer para  compararlo con el if
 y que me entre auna funcion ?????
« Última modificación: 06 de Marzo de 2011, 13:14:55 por japifer_22 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #5 en: 07 de Marzo de 2011, 01:46:48 »
Japifer_22: Probá enviar solo un carácter desde la pc para que interactúe con un switch con un caracter entre comillas simples. Por ejemplo  'a' . Total a los efectos de que el pic interprete el mensaje es igual. Luego desde el case 'a' llamás s la fución.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #6 en: 07 de Marzo de 2011, 09:35:36 »
.........

de todas formas tengo entendido que

Citar
  1.
      if (strcmp(buffer, "enciende") == 0)  output_high(PIN_B1);

no se puede hacer...... alomejor me equivoco,
.................


  ¿No me digas que CCS tiene esa restricción?, que feo  :5]     Yo probé eso en HiTech y funciona de maravillas.

Japifer_22: Probá enviar solo un carácter desde la pc para que interactúe con un switch con un caracter entre comillas simples. Por ejemplo  'a' . Total a los efectos de que el pic interprete el mensaje es igual. Luego desde el case 'a' llamás s la fución.

  Lo que indica Jukinch tiene que funcionar bien.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #7 en: 07 de Marzo de 2011, 11:29:57 »
debe funcionar porque lo que esta evaluando en el if es el strcmp, lo que no funciona es comparar directamente un string.  Como dice jukinch es mejor hacerlo con un solo caracter dá lo mismo y ahorras mas
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #8 en: 07 de Marzo de 2011, 12:11:22 »
debe funcionar porque lo que esta evaluando en el if es el strcmp, lo que no funciona es comparar directamente un string.  Como dice jukinch es mejor hacerlo con un solo caracter dá lo mismo y ahorras mas

  Justamente me refería a eso de que no permita comparar directamente un string, en HiTech sí se puede.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #9 en: 07 de Marzo de 2011, 21:23:37 »
hola, bueno en mi swirch si me esta funcionando todo y la recepcion va de lo mas bien, ahora logro mandar una trma de 29 caracteres como max y la adquiere y procesa de lo mas bien, pero el punto ahora es que como puedo hacer si yo quiero comparar lo que esta en el buffer de recepcion con por ejemplo una palabra "hola", como tendria que hacer esto ????, por que strcmp compara 2 cadenas, pero para esto tendre que crear una cadena con hola, estaria perdiendo espacion en el pic, es por esto que quisiera saver como podria desir algo asi:

en el buff de recepcion tenemos "hola".
if(buff==hola) output_high(PIN_A0);
else
     output_low(PIN_A0);
el buff de recepcion entra al switch de lo mas bine, en ese punto no tengo problema, pero quiero hacer algo independiente del switch ahora, para tener mas opciones de comparacion nada mas  :mrgreen:

saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #10 en: 07 de Marzo de 2011, 21:48:21 »
  Siempre te va quedar en algún lado el string "hola", más allá de la sintaxis que uses. Escrbir algo así

Código: C
  1. strcmp (buffer,"hola");

básicamente ocuparía el mismo lugar que escribirlo así.

Código: C
  1. const char *palabraacomparar = "hola";
  2.  
  3. if strcmp (buffer,palabraacomparar);

  Acabo de compilar estos dos programas con HiTech...

Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3.  
  4.   __CONFIG (LVPDIS & HS & WDTDIS);
  5.  
  6.  
  7. void main(void)
  8. {
  9.   char buffer[30] = "Enciende";
  10.  
  11.   TRISB = 0;
  12.   PORTB = 0;
  13.   if (strcmp (buffer, "Enciende") == 0) RB0 = 1;
  14.   while (1);
  15. }

Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3.  
  4.   __CONFIG (LVPDIS & HS & WDTDIS);
  5.  
  6.  
  7. void main(void)
  8. {
  9.   char buffer[30] = "Enciende";
  10.   const char *palabra = "Enciende";
  11.  
  12.  
  13.   TRISB = 0;
  14.   PORTB = 0;
  15.   if (strcmp (buffer, palabra) == 0) RB0 = 1;
  16.   while (1);
  17. }


  El primero ocupo 183 words de código y el segundo  189
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: como lidear con el caracter nulo de una cadena ´/0´
« Respuesta #11 en: 08 de Marzo de 2011, 20:54:31 »
hola AngelGris, gracias por la preucopacion y dispocision, lo que me dices ya lo avia provado pero no me gusto la forma de cmparar. aver si encuentro algo quem guste :mrgreen:, reitero las gracias.
 si encuentro algo te lo are saver ok???

saludos he insisto gracias