Autor Tema: Problema con funcion de concatenar STRCAT  (Leído 4226 veces)

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

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Problema con funcion de concatenar STRCAT
« en: 04 de Enero de 2011, 15:02:47 »
Saludos,

Alguien me de pistas para solucionar mi problema:

Recibo un string por RDA y lo guardo en la variable "source" (por ejemplo guardo 123ABC)

Después trato de concatenar un string llamado "ctrlZ" que tiene guardado los caracteres ^Z y al ejecutar:
Código: [Seleccionar]
strcat (source, ctrlZ);
        fprintf (com_soft, "%s\r\n", source);

El resultado que obtengo es que ctrlZ (^Z) me aparece montado al incio de la cadena source, algo así:
^Z3ABC

Gracias
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #1 en: 04 de Enero de 2011, 18:11:23 »
Epale amigo!
No estoy muy seguro de lo que quieres hacer pero aqui te coloco un material muy bueno que quisas te pueda ser de alguna utilidad  :mrgreen:

Saludos

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con funcion de concatenar STRCAT
« Respuesta #2 en: 05 de Enero de 2011, 12:10:03 »
Y probaste al revés?
Código: [Seleccionar]
strcat (ctrlZ,source);
Saludos
El papel lo aguanta todo

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #3 en: 05 de Enero de 2011, 12:12:13 »
Y probaste al revés?
Código: [Seleccionar]
strcat (ctrlZ,source);
Saludos


Claro que sí, pero no sale tampoco...
:(
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #4 en: 05 de Enero de 2011, 12:27:54 »
Hola Willie_rosario_salsa

Asi me funciono

  :mrgreen:
Citar
#include <16F876A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

void main()
{

   char str1[4]={'1','2','3'};
   char str2[4]={'7','8','9'};
   char *ptr;
   ptr= strcat(str1,str2);
  
   delay_ms(500);
   fprintf(serial,"%s",ptr);
   while(true);

}



Espero te sea util!

Saludos
« Última modificación: 05 de Enero de 2011, 12:30:59 por RALF2 »

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #5 en: 05 de Enero de 2011, 12:34:08 »
Hola RALF

el problema se me presenta cuando el string es guardado mediante la interrupción RDA serial, parece que algún puntero o algún CR me provoca el error de montar la segunda cadena al inicio de la primera...

Saludos
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #6 en: 05 de Enero de 2011, 12:55:11 »
Es estraño wllie, podrias colocar entonces el resto del codigo donde te da el problema haber que es lo que sucede?

Saludos

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #7 en: 05 de Enero de 2011, 13:12:52 »
Adjunto el codigo que tengo:

Código: [Seleccionar]
#include <16f876A.h>
#include <string.h>


#zero_ram     
#fuses xt, wdt, put, nobrownout, nolvp
#use delay (clock=4 Mhz, restart_wdt)
#use fast_io(a)               
#use fast_io(b)
#use fast_io(c)
#USE RS232(STREAM=com_hard, BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8, ENABLE=PIN_c5, restart_wdt, timeout=2) //UART HARDWARE
#USE RS232(stream=com_soft, baud=9600, xmit=pin_a5, RCV=PIN_B0, bits=8, force_sw, restart_wdt, timeout=1) //UART SOFTWARE

#byte RCREG=   0x1A 
#byte RCSTA= 0x18
#byte porta= 0x05
#byte PORTB=   0x06
#byte portc=   0x07     
#bit  OERR=    0x18.1
#bit  FERR=    0x18.2
#bit  CREN=    0x18.4

//SALIDAS                                                                       
#define  buzz     PIN_C0                               
#define  pausa    pin_A0                 
#define  led      PIN_A2 
#define  stat_rx  pin_A3                 
                               
int   i=0;  //puntero de for y de descargas RDA                       
int j=0; //puntero para RDA
int k=0; //puntero para EXT
int c=34; //34 = comillas
int d=26; //26 tecla control
int   puerto=0;     
int   unidad=0; 
int decena=0;
int     led1=0;
int     led2=0;   
short flag_env_at1=0;
short flag_pausa=0;
short flag_test=0;   

char  source[50], dest[50], ctrlZ[5];

***********************************************
***********************************************
#int_rda      //RECIBE INFORMACION DESDE EL CANAL
void rx_rfid (void){   
   output_high (stat_rx);  //indica que está recibiendo
   for(i=0;i<50;i++)
    source[j++]=getc();
   
   disable_interrupts (int_rda);
   cren=0;
   if (source[0]=='S' && source[1]==decena && source[2]==unidad && source[7]=='C' && source[8]=='M' && source[9]=='M' )
      [color=red][font=Verdana][b][u]flag_env_at1=1;   //tag invalido acceso denegado [/u][/b][/font][/color]
   else
      flag_pausa=1;  //caso contrario debe detener el canal   por un delay X 
   cren=1;   
   enable_interrupts (int_rda);
   j=0;
   output_low (stat_rx);   //recepcion correcta
}


***********************************************
***********************************************
void main(void)                                                                                                             
{                                                                                         
   cren=0;                     
   setup_wdt(WDT_2304MS);
   setup_adc_ports(NO_ANALOGS); // all pins digital
   port_b_pullups (true);                                 
   set_tris_a(0b00000000);   
   set_tris_b(0b00111111);
   set_tris_c(0b10001000);
   porta=0;
   portb=0;
   portc=0;   
                                                                         
   enable_interrupts (int_ext);
   ext_int_edge (h_to_l);                           
   enable_interrupts (int_rda); 
   cren=1;                                               
   enable_interrupts (global); 
   strcpy (ctrlZ, "^Z");

while(true)
         {
               if(flag_env_at1){                                                 //si la bandera se activó en RDA
       
    [color=red][b]memcpy(dest, &source[11], 9);             //recorta los primeros 11 bytes de source y los pone en dest los siguientes 9
                        strcat (dest, ctrlZ);                               // añade el contenido de ctrlZ a dest
    fprintf (com_soft, "Resultado %s", dest);[/b][/color]
    delay_ms(100);           
                restart_wdt();
                flag_env_at1=0;
        }

"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #8 en: 05 de Enero de 2011, 13:58:19 »
El problema pudiera ser de tiempos willie
Es decir que al momento de ejecutar el strcat o el fprint su funcion sea perturbada por algunas de las interrupciones  :shock:

Prueba quitando todas las interruciones y carga de forma manual valores en source[11]...
Y luego ejecuta este trozo del programa

Citar
memcpy(dest, &source[11], 9);             //recorta los primeros 11 bytes de source y los pone en dest los siguientes 9
                        strcat (dest, ctrlZ);                               // añade el contenido de ctrlZ a dest
            fprintf (com_soft, "Resultado %s", dest);

            delay_ms(100);                         
                  
Haber si opera bien el  strcat  :mrgreen:
De estar todo bien. entonces el problema esta en otra parte  :D

Y nos cuentas como te fue  :mrgreen:



Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #9 en: 05 de Enero de 2011, 18:06:08 »
Sigue sin funcionar...

A veces recorta bien, a veces no...

Algo pasa  :( :( :(
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #10 en: 05 de Enero de 2011, 18:41:47 »
Ok lo que te coloque lo probe y funciona bien  :mrgreen: asi que podrias redefinir el programa colocando la rutina

                        memcpy(dest, &source[11], 9);            
                        strcat (dest, ctrlZ);                            
            fprintf (com_soft, "Resultado %s", dest);

Dentro de la rutina de interrupcion #RDA
Y asi te deberia funcionar bien  :mrgreen:




Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #11 en: 06 de Enero de 2011, 15:32:43 »
Gracias RALF

probare aumentando el tamaño de los arreglos para ver si x eso no funca bien, pero en la rutina RDA trato de perder la menor cantidad de tiempo...

"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #12 en: 06 de Enero de 2011, 16:44:52 »
Ok willie!
Te lo digo solo para probar a ver si alli es donde se genera el problema  :mrgreen:
Ademas puedes quitar el cren y el disable_interrupts (int_rda) ya que no hace falta, el compilador los activa y desactiva por ti  :mrgreen:

Saludos

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Problema con funcion de concatenar STRCAT
« Respuesta #13 en: 06 de Enero de 2011, 16:55:45 »
Listo RALF, parece q el problema va por el tamaño de los arreglos y los recortes que hago con memcpy...

Y lo del cren=0 y la int rda= disable lo hago xq cada 3ms recibo datos por RCV y por RB0, y al no hacerlo, mientras recibo por el puerto virtual (RB0) suele llegar datos al RCV del micro, y es verdad la interrupción no se genera, pero si no inhabilito el puerto por completo (cren=0) al terminar de atender la int_ext el buffer RCSTA está saturado debido a que llegaron datos al mismo tiempo, y no fueron recibidos ni guardados correctamente.

Muchas gracias, siempre son bien recibidas las sugerencias
:)
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con funcion de concatenar STRCAT
« Respuesta #14 en: 06 de Enero de 2011, 17:15:06 »
ok willie_rosario_salsa
Mira estuve realizando unas pruebas a tu codigo y note lo siguiente  :shock:

1) memcpy(dest, &source[11], 9);            
2) strcat (dest, ctrlZ);                            
3) fprintf (com_soft, "Resultado %s", dest);
 
La primera vez que ejecutas 1) dest se carga con unos datos luego en 2) esos datos se concatenan con ctrlZ y luego se imprimen bien hasta alli todo perfecto pero que pasa en la segunda captura ya dest tiene datos cargados de la primera captura por lo que al realizarce la segunda captura y al concatenar los datos vas a concatenar lo que habias guardado en dest la primera vez (dest + ctrlZ) + ctrlZ de nuevo  :shock: he alli donde puede estar el problema yo lo probe en el simulador y eso es lo que me hace por lo que una posible solucion seria cargar '\0' en dest luego del fprintf para evitarte ese problema  :mrgreen:

Que te parece?

Saludos
« Última modificación: 06 de Enero de 2011, 18:51:12 por RALF2 »