Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: juancho056 en 17 de Abril de 2015, 18:16:57
Título: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 en 17 de Abril de 2015, 18:16:57
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.
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: KILLERJC en 17 de Abril de 2015, 21:36:08
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:
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 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
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: KILLERJC 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.
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 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:
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: KILLERJC 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
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.
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 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 :-)
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: KILLERJC 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
trama2[8]={0x01,0x03,0x00,0x00,0x00,0x03,0xCB,0x05}; Lo simule y es eso lo que me quedo.
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 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:
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: KILLERJC 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.
Título: Re: Como concatenar datos de cadena, para guardarlos en cadena de menor tamaño
Publicado por: juancho056 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: