TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: 25javier en 26 de Febrero de 2006, 17:58:00

Título: Transmicion pic-pic con longitud datos variables
Publicado por: 25javier en 26 de Febrero de 2006, 17:58:00
Hola estoy tratando de enviar info de un pic a un pic con longitud de datos variables,mi idea es poner un caracter de inicializacion y otro de finalizacion
 por ejemplo  
A       "inicio de datos
123   "dato0
44     "dato1
56     "dato2
67     "daot3
89     "dato4
@      "fin de datos

sin envio printf("A"Giño ---valor=getc() ,recibo el valor decimal 65,valor decimal del ascii
si pongo los numeros en un vector D[],D[0]=123,D[1]=44,D[2]=56,D[3]=67,D[4]=89 ,si mando con printf("%C",D) y recibo con valor=getc() recibo bien los numeros...pero si mando para terminar printf("@"Giño del otro lado recibire el valor decimal 64(valor decimal del Ascii @)o sea que no puedo distinguir si es otro numero( por casualidad el 64 es parte de los numeros )o es el caracter fin de datos...
Alguna solucion??
gracias por adelantado
Saludos
Javier

Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: nyquist2 en 27 de Febrero de 2006, 10:07:00
Escrito originalmente por 25javier
Hola estoy tratando de enviar info de un pic a un pic con longitud de datos variables,mi idea es poner un caracter de inicializacion y otro de finalizacion
 por ejemplo  
A       "inicio de datos
123   "dato0
44     "dato1
56     "dato2
67     "daot3
89     "dato4
@      "fin de datos

sin envio printf("A"Giño ---valor=getc() ,recibo el valor decimal 65,valor decimal del ascii
si pongo los numeros en un vector D[],D[0]=123,D[1]=44,D[2]=56,D[3]=67,D[4]=89 ,si mando con printf("%C",D) y recibo con valor=getc() recibo bien los numeros...pero si mando para terminar printf("@"Giño del otro lado recibire el valor decimal 64(valor decimal del Ascii @)o sea que no puedo distinguir si es otro numero( por casualidad el 64 es parte de los numeros )o es el caracter fin de datos...
Alguna solucion??
gracias por adelantado
Saludos
Javier






Hola,

Yo estoy trabajando con algo similar. En mi caso, debo transmitir entre pics una serie de bytes, no caracteres, sino numeros en hexa. Para reconocer el mensaje estoy usando un valor en particular: 0xAA, q en binario es 10101010.
La idea q planteas es correcta, tal vez deberia revisar q valores numericos estas seguro q no vas a mandar y usarlos (o su equivalente en ASCII) como inicio y fin de mensaje.
Espero haberte servido de ayuda.

Saludos, Nyquist.



Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: 25javier en 01 de Marzo de 2006, 18:25:00
Hola Nyquist,
El problema es que no tengo manera de saber los numeros que voy a tener que mandar asi que pueden ser desde 0 -255....entonces como puedo mandar un caracter fin de trama???tiene que haber alguna manera....yo pense mandar algo como 6 bytes iguales "444444"y ese que sea el paquete indicando que termino el envio de datos..alguna idea mejor??
saludos
Javier
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: grouchy en 01 de Marzo de 2006, 23:55:00
Hola.
No se exactamente que significan los datos o que tipo de valores son los que quieres enviar pero tengo una sugerencia, porque no mandas el valor del dato en forma de caracter o codigo ASCII, primero hay que convertir el valor a enviar en caracteres, los enviamos y después recuperamos el valor deseado, algo como esto:

//Para enviar los datos tenemos:
char dato_caracter[4];
.
.
.
printf("A");   // Se inicia transmision

// Se envian la cantidad X de datos que se requieran
for (i=0;i==X;i++)
{
sprintf(dato_caracter,"%U",D);
printf("%S",dato_caracter);
}
...
printf("@");   // Se finaliza transmision


// Para la recepcion tenemos:

char    recepcion[4],conversion[3];
char    basura;
int       D[20]; // Depende de hasta cuantos datos deseas recibir
int       j,i;
.
.
.

basura=getc();
if (basura=="A") //se esta iniciando recepcion de valores valores
   j=i=0;
do
{
basura=getc();
recepcion[j]=basura
j++;
if (j==4)
{
strncpy(conversion,recepcion,3);
D=atoi(conversion);
i++;
j=0;
}
}while (basura!="@");


Espero que te funcione, o que por lo menos te de alguna idea..................
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: Algec en 02 de Marzo de 2006, 02:25:00
YO tengo hecha una transmision de floats y enteros de puerto serie de pic a puerto serie de pic y funciona. Esta dentro de un proyecto que titule HMI, interface hombre maquina.
Si quereis usar ese codigo decidmelo y os subo al almacen el codigo, el proteus y demas, aun no lo subi completo porque le falta una parte del proyecto completo.
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: mldavid en 02 de Marzo de 2006, 06:00:00
Hola, yo tuve que programar un protocolo de enlace de datos para serie pero entre dos ordenadores, lo que podrias utilizar para definir el caracter del fin es seleccionar dos cualquiera y utilizar lo que se llama caracte stuffing (no se si se escribe asíGiño el metodo consiste en que si tienes que enviar una trama en lugar de poner un caracter para fin de trama pongas dos distintos, por ejemplo AB y que cuando tengas que transmitir el mensaje si tienes que enviar AB que lo detectaria como fin de trama envies AAB de forma que no lo detecta como fin de trama y en el receptor haces la operacion contraria si te llega AAB interpretas AB, esto lo puedes hacer con cualquier par de caracteres y no es muy dificil de programar solo un par de if.

Espero ayudarte.
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: nyquist2 en 02 de Marzo de 2006, 11:16:00
Hola,

Se me ocurren otras dos ideas:

1) q mandes como dato la cantidad de bytes q vas a transmitir, pero el problema es q no sabes la cantidad de memoria q tenes q reservar para guardar los datos q recibas. En ese caso podrias reservar una cantidad exagerada de memoria, aunq es una forma "trucha" de resolver el problema.

2) podrias generar un timeout (con interrupciones y timer) para cuando dejes de rercibir. Me explico: vos dispones el soft para recibir un byte tras otro constantemente. Cada vez q terminas de recibir un byte haces un refresh al timer. Cuando dejes de recibir, a pesar de q el programa este esperando, te va a saltar la interrupcion del timer, ahi es donde terminaste de recibir.

Espero q te sirvan. Si tenes alguna duda sobre la segunda, te cuanto q implemente algo por el estilo con un 8051 en asm y funciono muy bien.

Saludos, Nyquist.
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: 25javier en 07 de Marzo de 2006, 23:41:00
recien veo los mensajes,estube usando un paquete para indicar el inicio de datos y otro para el fin de datos con time out por si se tilda la transmicion,
22222 + datos + checksum datos+ 88888,anda sin problemas...igual estoy viendo que solucion es mas eficiente...crei que el metodo que comenta nyquist2  usando sprintf es el mas simple...
gracias a todos por las respuestas!!Algec si podes subi el codigo!!
Saludos
Javier
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: Algec en 08 de Marzo de 2006, 04:27:00
lo hare en cuanto pueda, por cierto, que habia que poner al principio y al final del codigo?
Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: gauchosuizo en 08 de Marzo de 2006, 06:32:00
hola

porque no usan un protocolo ya definido, como el Modbus? Es la mejor solucion.

Aloha

Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: RedPic en 08 de Marzo de 2006, 12:39:00
Hay otra solución muy simple que implica el uso de un pin adicional que habilita / deshabilita la recepción de datos sin necesidad de predefinir trama alguna.

Ponemos en alto el pin adicional en el Pic Servidor y comenzamos a transmitir desde él.

El Pic Cliente detecta esta señal y comienza a recibir bytes mientras dicha señal continúe en alto.

Cuando el Pic Servidor ha terminado baja el pin adicional y el Pic Cliente lo detecta dando por concluida la recepción de datos.

Si no es complicado montar este puente pin-a-pin entre los dos pic"s es otra posibilidad a tener en cuenta.
(es el mismo concepto que la implementación en RS-232 del uso de las líneas adicionales RTS DTR ... )

Un saludo.

Título: RE: Transmicion pic-pic con longitud datos variables
Publicado por: 25javier en 15 de Marzo de 2006, 09:00:00
Hola,me di cuenta que mando un stream como final de datos como 88888, es inviable ..cuando detecto 5 ochos seguidos quiere decir que termino la transmision,pero si uno de los datos es 8 detecto unos de los datos como parte de ese paquete y me "como" un caracter de la transmision...estube viendo el codigo que posteo grouchy. en principo no andubo..no entiendo para que hacer
sprintf(dato_caracter,"%U", valor);  si los valores ya esta en decimal..
valor[1]=22;
valor[2]=33;
valor[3]=25;
valor[4]=250;
valor[5]=46;

el tema es que si mando el caracter 64,el codigo se piensa que es el caracter fin de datos "@" y termina la transmision..el mismo problema que tengo con los otros codigos...no puedo implementar el hard con mas cables proque luego pienso adaptarlo para wireless y no tengo soporte para RTS..creo que la unica que queda es mandar la longitud de datos y poner un buffer que se aguante la maxima longitud de transmision....alguna otra idea???
saludos
Javier