Autor Tema: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño  (Leído 2402 veces)

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

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Hola !!

Necesito concatenar los caracteres de una cadena de datos que estoy recibiendo por comunicacion serial mediante la interrupcion #int_rda, he intentado de varias maneras pero no lo he logrado  :?

Ejemplo, la cadena que estoy recibiendo [010300000003CB05] es de 16 posiciones y necesito concatenar la posiocion
  • +[1] y asi las 16 posiciones hasta que tenga una arreglo de 8 posiciones osea deberia quedar 01 03 00 00 00 03 CB 05, buscando he visto que utilizan la funcion strcat (<cadena_destino>, <cadena_origen>), entonces donde estoy almacenando estacadena es una trama[16].


Pienso que estoy utilizando mal la funcion,  como lo intento hacer

char trama[16] ; // Trama donde recibo los 16 caracteres
char trama2 [8];// Trama donde pienso almacenar las 8 concatenaciones

//Intento concatenar los datos de la trama en trama2
trama2[0]=strcat(trama[0],trama[1]);   //En mi ignoracia pensaba que al hacer esto, en trama2[0] se almacenaba 01
trama2[0]=strcat(trama[2],trama[3]); // trama2[1]=03

Y asi sucesivamente hasta completar 8 agrupaciones, pero intento imprimirlo por pantalla para ver si se da la concatenacion de los datos y el pic se desborda o me muestra valores que no son. Para este caso deberia imprimir trama2:01

 printf("Trama 2:%C  \r\n",trama2[0]);


Si alguien sabe algun procedimiento o como puedo hacer para concatenar estos datos, le estare muy agrecdecido.  :mrgreen:
Buen Dia para Todos.




« Última modificación: 18 de Abril de 2015, 00:53:53 por un Moderador »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #1 en: 17 de Abril de 2015, 21:36:08 »
for(i=0;i<8;i++)
{
   trama2='';
   strcat(&trama2,&trama[i*2]);
   strcat(&trama2,&trama[(i*2)+1]);
}

Algo asi ?

La idea seria primero vaciar trama2, luego ingresar el primer valor y el siguiente a continuacion
« Última modificación: 18 de Abril de 2015, 00:54:23 por un Moderador »

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #2 en: 20 de Abril de 2015, 14:27:39 »
Hola  KILLERJC  :-/

No lo que requiero es que la trama que llega es [010300000003CB05]  estos datos son almacenados en un Char trama[16]

trama={'0','1','0','3','0','0','0','0','0','0','0','3','C','B','0','5',}

y no se como concatenarlo o unirlo para que  los datos me quede almacenados de esta manera

trama2={'01','03','00','00','00','03','CB','05'} // Osea que ya quedarian en un arreglo de 8 posiciones

Agradezco sus comentarios he ideas   :mrgreen:

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #3 en: 20 de Abril de 2015, 19:13:41 »
Hola
El problema que tengo concretamente es:
El dato que recibo al leer un carácter desde la usart es un valor codificado en ASCII.
Dicho valor lo voy leyendo de a 1 carácter.

Los datos los estoy enviando desde VB6 la trama es [1 3 0 0 0 3 CRCH CRCL]
En visual basic  para calcular el crc simplemente defino el dato antes de inviarlo al buffer de transmición osea

num=hex(1)  que me respresentaria a num=0x01;

Si envio los datos uno a uno, ejemplo  el primer dato es "1" en realidad recibo 31 que es la codificacion en ascii, como necesito calcular de nuevo el crc, necesito una funcion o un metodo de transforma ese 0x31 a 0x01, para poder calcular el crc y me de igual al crc recibido, en el cual tambien tengo problema ya que si el crc esta divido en parte alta y baja debo concatenarlos para poder hacer la comparacion. Ejemplo

El crc de esta trama en hex [1 3 0 0 0 3] es 'CB'  parte alta y '05' parte baja , pero al recibirlos por la usart el no me los tomara por pares sino que tomaria 'C' 'B' '0' '5' y cada uno representado en en ascii hexadecimal osea seria '43' '42' '30' '35', no se que hacer jeje  :shock:.

Si tiene conocimiento y me pueden ayudar, muchas gracias. 


El 2 en ASCII está representado por el 0x32 y el 0 por 0x30

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #4 en: 20 de Abril de 2015, 23:46:37 »
Entonces tengo unas cuantas preguntas mas. siempre van a ser numeros? cual es el maximo numero a enviar dentro de esta trama [1 3 0 0 0 3 CRCH CRCL] ? un 9 es decir [1 3 0 9 0 3 CRCH CRCL]? no hay letras o puede haber letras (no hablo del CRC)?

Por que enviar '01' cuando podes enviar '1' ? o esperas que puede enviarse hasta 0xFF ?

PD: La solucion que di antes fue muy mala, demasiado mala.

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #5 en: 21 de Abril de 2015, 00:17:30 »
Ya solucione el problema para poder tomar los valores con un hilo de REDPIC http://www.todopic.com.ar/foros/index.php?topic=4641.0, con la esta funcion

int aschex2int(char d){          // Convierte un caracter ascii hex a int

   int r=0;                       // Declaro e inicializo a cero el resultado
   if(isxdigit(d)){               // Si es un digito hexadecimal ...
      if(isdigit(d)){             // si es un digito decimal ...
         r=d-'0';                 // devuelvo su diferencia con el valor ascii del caracter "0"
      }
      if(isalpha(d)){             // si es alfanumerico ...
         d=toupper(d);            // lo paso a mayusculas y ...
         r=10+(d-'A');            // devuelvo 10 mas su diferencia con el valor ascii de la letra "A"
      }
   }
   return(r);
}

   // Ejemplo de uso con 1 caracter

   int x;
   x = aschex2int('F');          // x toma el valor 15


Funciona bastante bien, ahora lo que no se es como interpretar los datos del CRC, los envio desde VB6 en parte alta y parte baja un ejemplo 'CB' '05', como estoy recibiendo todo por la usart me recibe los datos 'C' 'B' '0' '5' y me los almacena en la trama en las posiciones [6] [7] [8] [9], necesito unir [6] y  [7] para que quede en la posicion 6 el dato 'CB' al igual [8] y[9] para que quede en la posicion 7 el dato '05'.

La falla es que los datos me llegan en ascii hexadecimal  el C los interpreta como 0x43 y el B como 0x42, y la funcion de arriba no me sirve ya que solo cambia de ascii HEX  a enteros, y no se como poder unir dichas posiciones, he intentado con strcat()  y al parecer lo hago mal.  :oops:

Gracias por su ayuda  :mrgreen:


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #6 en: 21 de Abril de 2015, 02:34:06 »
Por eso te preguntaba cual era el rango de entrada es decir si era solo de 0 a F o 0 a 9, si el maximo era 0x0F o es 0xFF, etc, para pasarlos directamente a numeros.
Si era de 0 a F directamente omitia el 0 lo cual no te interesaria.

Usando el codigo de redpic hasta creo que seria innecesario el if(isalpha(d)) ypodria ser reemplazado por un "else", ya que si entro a isxdigit es por que esta dentro de 0 a F

Usando ese codigo

CRCH = (aschex2int('C') < 4) + aschex2int('B');
CRCL = (aschex2int('0') < 4) + aschex2int('5');

Y asi ? obviamente deberias hacer aschex2int(trama[12]), es solo a modo de ejemplo.

Eso te lo pasa a un numero ( de 0-15 en decimal o 0x0 a 0xF en hexa) luego lo dezplazas 4 lugares y le sumas lo que te da el otro quedando 0xCB en CRCH y 0x05 en CRCL
Que es lo que imagino queres vos.

Quedando algo asi:

Código: C
  1. for(i=0;i<8;i++)
  2. {
  3.     trama2[i]=(aschex2int(trama[2*i]) < 4) + aschex2int(trama[(2*i)+1]);
  4. }
« Última modificación: 21 de Abril de 2015, 05:03:49 por KILLERJC »

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #7 en: 21 de Abril de 2015, 18:40:53 »
Hola KILLERJC, muchas gracias por tus valiosos aportes.

La trama que estoy recibiendo es [1 3 0 0 0 3 CB 05] para este ejemplo, ya que son varios esclavos  la trama varia, pero para este esclavo siempre sera la misma

Como explicas claramente si utilizo la funcion de REDPIC aschex2int(trama[10]), toma cada uno de los datos de la trama y me los trasforma a enteros, quedando asi el vector:
  0   1   2   3   4  5   6   7   8   9
[01 03 00 00 00 03 0C 0B 00 05], los prieros 6 datos perfecto por que ya puedo calcular el crc para que coincida perfectamente y me de CB05   :-/

Ahora bien cuando intento  unir el CRCH que esta en las posiciones 6 y 7, CRCL 8 y 9
 CRCH= (trama[6]<4)+trama[7];

El valor que me imprime en la variable CRCH= 0B, cuando deberia ser CB ..... por lo que veo es ese '0' que antecede el valor me afecta la rutina que sugerias  :shock:

No entiendo por que se tiene que dezplazar 4 posiciones y ps al ser ya no de un digito si no 2 por cada posicion lo intento hacer asi

 CRCH= (trama[6]<8)+trama[7]<4; pero menos que da  jajajaja  :oops:

Gracias, muchas gracias por sus aportes   :-)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #8 en: 21 de Abril de 2015, 22:19:13 »
La idea es clara y deberia funcionar..

0x0C = 0000 1100

0x0C < 4 = 0x0C * 16 = 1100 0000 = 0xC0

0x0B = 0000 1011

0xC0 + 0x0B = 1100 1011 = 0xCB


Esto:
CRCH= (trama[6]<4)+trama[7];

No podes hacerlo por que son strings

De todas formas reemplaza la rotacion por una multiplicacion y anda, ya lo simule

Código: C
  1. char i,trama2[8],trama[17]={'0','1','0','3','0','0','0','0','0','0','0','3','C','B','0','5'};
  2.  
  3.             for(i=0;i<8;i++)
  4.             {
  5.                 trama2[i] = (aschex2int(trama[2*i])) * 16 + aschex2int(trama[(2*i)+1]);
  6.             }

Temians con

trama2[8]={0x01,0x03,0x00,0x00,0x00,0x03,0xCB,0x05};
Lo simule y es eso lo que me quedo.

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #9 en: 21 de Abril de 2015, 23:37:35 »
KILLERJC, sinceramente no se como agradecerte !!! eres un duro y que tengas la paciencia para explicar a novatos que se quieren adentrar en este maravilloso mundo de los automatas programables, es de admirar! como muchos de este foro Excelnte .

Muchas gracias  ((:-)) ((:-))  :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #10 en: 22 de Abril de 2015, 02:38:31 »
Es que realmente no entendia que habia que hacer primero, pense que querias que fueran strings como salida,tampoco sabia que entradas tenias por eso mi preguntas por si entraba numeros de 0x00 a 0x0F. una ves que supe que querias hacer ahi por fin se pudo resolver.

Otra cosa, a eso simplemente lo podes hacer desde el programa de la PC, es decir convertir:

0x0C y 0x0B

en 0xCB y mandarlo por la UART, no deberia haber problemas y te ahorrarias tiempo en el micro.

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
« Respuesta #11 en: 22 de Abril de 2015, 16:32:47 »
De echo desde el pc lo envio de esa manera 0xCB pero cuando llega por la UART lo separa en 'C' y 'B', ya con lo que me explicaste pude concatenarlo y hacer que mi programa corriera perfectamente. Muchas gracias :mrgreen: