Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

problema con cadena de caracteres con labwindows CVI y comunicacion serial RS232

Buenos dias! esta semana he tenido un problema con la recepción de un buffer de 8400 bytes por puerto serial en labwindows.

 

He implementado las tres funciones posibles para recepcion del puerto serial:

 

opcion 1: con fin de cola el caracter 'x'.

bytes_read = ComRdTerm (puerto, read_data, 8500, 'x');

 

opcion 2: sin fin de cola solo recibir los caracteres.

bytes_read = ComRd (puerto, read_data, 8400);

 

opcion 3: Guardando lo que hay en el puerto a un archivo con fin de cola caracter 'x'.

bytes_read = ComToFile ( puerto , ARC , 8500, 'x');

 

En la opcion 1 y opcion 3 obtuve los mismos resultados recibo los caracteres, pero tengo una pérdida significativa y aleatoria de alrededor de 20 bytes al final de la cola. 

 

Mi pregunta es ¿porque se pueden estar perdiendo esta cantidad de bytes en la cola de 8400 bytes enviados?

 

Realicé una comparación con hyperterminal de windows y no presento pérdidas de ningún byte de datos para descartar que sea errores de hardware externo al pc.... Pero en labwindows si presento esta pérdida.... Esto debe suceder por alguna razón la cual me interesa conocer. Las configuraciones de (paridad, numero de bits, baudios, bit de parada, etc) son las mismas que en hyperterminal por ello no encuentro motivo a la falta de datos....

Ing. Jhon Lizarazo
CIDA
0 kudos
Mensaje 1 de 10
4.492 Vistas

Hola,

 

       ¿Dentro de la cadena no estaras enviando el caracter de terminación 'x'?

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 2 de 10
4.486 Vistas

Hola Luis, Gracias por responder mi inquietud. Si la cola de entrada tiene una 'x' al final. y esto es lo que observo en hyperterminal alli si tiene la x al final de la cola de los datos. Cambié el fin de cola en el microcontrolador rabbit para enviar 'xxxxxxx' y me funciona bien al parecer no encontraba el fin de cola y por alguna razón se perdían datos al final de la transmisión. Lo que me preocupa es que la transmisión de los datos no sea fidedigna porque son datos de un conversor análogo digital del ccd de una cámara. Por ello quiero saber la razón para que se pierdan datos al final como si se desincronizaran los relojes de la comunicación. Quizás por ello es que existen los protocolos de comunicación para enviar tramas separadas.

 

Tu de casualidad sabes cuantos bytes máximo puedo enviar sin tener pérdidas de datos? porque según la información del help de labwindows la longitud máxima de buffer que acepta el pc es 32.767 bytes lo q sucede es que si implemento un protocolo es mas tiempo para transmisión de los datos.

 

Saludos y muchas gracias de antemano!    

Ing. Jhon Lizarazo
CIDA
0 kudos
Mensaje 3 de 10
4.481 Vistas

Hola Jhon,

 

          Lo que te preguntaba era si no enviabas dentro de los datos un byte con valor 120 que corresponde al caracter ascii 'x' (ver Ascii Table). La otra es que tengas errores en la transmisión y un dato que valia 121 te llegue como 120 y te cause el problema.

 

          Según mi experiencia la transmisión de datos serial puede contener errores que se manifiestan notoriamente a mayor velocidad de transmisión, mayor longitud del cable y presencia de ruido. Pero si para ti es critico la velocidad, con un cable corto de buena calidad y alejado de fuentes de interferencia deberias poder transmitir a 115200 kbps sin problemas.

 

          Eso respecto al hardware, ahora si ya en HyperTerminal visualizas tus datos correctamente significa que los datos llegan bien al computador, y puede que tengas alguna configuración en LabVIEW que te haga falta, no he usado CVI, pero en el LabVIEW normal tu puedes indicar el tamaño del buffer de entrada o de salida, no se cual es el tamaño máximo, si llegaras a ese límite podrías ir leyendo paquetes de menor tamaño y luego unirlos.

 

          Cuentame como tienes configurado el puerto serial (velocidad, etc), que longitud de cable usas (o alguna interfaz de acoplamiento óptico), y si la data que envias tiene algún formato específico (valores que pueda tomar, encabezado, fin de trama, cantidad de datos). Para ver si te puedo ayudar un poco más.

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 4 de 10
4.468 Vistas

Hola Luis, Ahhh ok, no es posible que el dato corresponda al valor en ascii de la 'x' ya que por ahora es un dato constante que ingreso con un valor que pongo en un puerto de un microcontrolador. y pongo el valor de 1 que es el numero decimal 49 osea que seria una cadena de 8400 datos llenod de 1. por ello ese dato debería terminar con la x que envía al final de la cadena. Es decir 8399 datos son 1 y el último era la 'x'. Pero cuando coloco una sola 'x' final de la cola no la toma en cuenta. En cambio cuando coloco mas 'xxxxxx' al final de la cola si toma todos los datos. No sé porque razón pasa esto.

 

Por otro lado el puerto serial lo configuro en labwindows/CVI con (Paridad: ninguna, 8 bits de datos, 115200 baudios, 1 bit de parada y un buffer de entrada con 10000 bytes.). La longitud del cable es 3 mts,  el formato de envio es hexadecimal por ello nunca enviaría una 'x'. Y lo que hago es enviar la data completa + la x.

 

Gracias!!

Ing. Jhon Lizarazo
CIDA
0 kudos
Mensaje 5 de 10
4.460 Vistas

Hola Jhon,

 

          En este link dice lo siguiente:

 


Bits de parada: Usado para indicar el fin de la comunicación de un solo paquete. Los valores típicos son 1, 1.5 o 2 bits. Debido a la manera como se transfiere la información a través de las líneas de comunicación y que cada dispositivo tiene su propio reloj, es posible que los dos dispositivos no estén sincronizados. Por lo tanto, los bits de parada no sólo indican el fin de la transmisión sino además dan un margen de tolerancia para esa diferencia de los relojes. Mientras más bits de parada se usen, mayor será la tolerancia a la sincronía de los relojes, sin embargo la transmisión será más lenta.

           Así que por tu inquietud de la sincronización de los relojes puedes probar usar 1.5 como bit de parada y ver si se soluciona el problema.

 

          Respecto al caracter 'x' recuerda que es equivalente al número hexadecimall 0x78, así que solo te digo que tengas cuidado al realizar la aplicación de no enviar el caracter de terminación como data.

 

          Respecto a la longitud del cable puedes conseguir uno de 1.8mts, pero si todos los '1's te llegan bien, ese no es el problema.

 

          Prueba con lo bit de parada, y si sigue el problema me dices.

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 6 de 10
4.454 Vistas

Hola Jhon,

 

     Otra cosa, veo que aquí en este otro link usan la función GetInQLen para obtener el número de bytes en puerto, con eso te permitiría saber si los 8400 estan en el buffer.

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 7 de 10
4.452 Vistas

Hola Jhon,

 

       Sino aquí esta otro link donde usan ReturnRS232Err() para determinar si ocurrió un timeout o algún otro error.

 

Saludos Cordiales,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 8 de 10
4.450 Vistas

buen dia, tengo un problema con la comunicación serial entre la tarjeta que sirve como interfaz de un sensor de par mecánico y el cpu, la cuestión es que si se puede establecer la comunicación seria, pero a la hora de leer los datos que llegan, en lugar de bytes, aparecen caracteres como: A%&j]- , en lugar de aparecer los bytes, dejo una imagen, para dar una idea de donde muestra este error, que al parecer es el Error -1073807252. el proposito de este VI es obtener varias cadenas de bytes y mostrarlos para luego interpretarlos en numeros reales enteros, muchas gracias si alguien sabe algo por favor diganme que hacer .

0 kudos
Mensaje 9 de 10
4.086 Vistas

Esta discusión sigue aquí: es mejor no añadir comentarios a viejos hilos ya cerrados si no siguen el mismo tema. En particular en este caso ya que se trata de un entorno de programación completamente diferente (LabWindows/CVI y no LabVIEW).



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 10 de 10
4.075 Vistas