From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discusiones sobre Productos NI

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

labview puerto serie serial port

¡Resuelto!
Ir a solución

Hola buenas, espero que alguien me pueda ayudar con mi problema, el caso es que tengo que enviar información mediante radiofrecuencia desde un arduino remoto, que recoge información de tres sensores a otro arduino conectado al PC que a su vez a través del puerto serie del PC manda la información a labview. El problema es que a veces aparecen símbolos raros que supongo que será ruido en el puerto serie.

 

La primera de las preguntas es: ¿De que manera es mejor enviar los datos al puerto serie, mediante un String o dato a dato? En la imagen que adjunto los datos llegan dato a dato. Se puede ver en el software de que manera lo hago.

 

Y la segunda pregunta es: ¿Cual es la mejor manera de separar los datos en labview? Adjunto una imagen de la manera en que lo he hecho yo, la cual funciona bien hasta que pasa cierto tiempo. A través de software envió una letra P para que labview sepa que es el inicio de los datos, a partir de hay realiza la separación de los tres datos y los convierte en un numero.

 

Funciona bien hasta que empiezan a aparecer símbolos raros, normalmente en el tercer dato, y también me e fijado en que en el puerto serie se acumulan los datos, por ejemplo si a principio llega P23,4X23,5X102,33 al cabo de cierto tiempo en el puerto serie aparece 2,33P23,4X23,5X10. ( X es para separar los datos )

 

También adjunto el software con el que he programado el arduino remoto por si alguien ve un fallo para que me lo comunique. ¡¡Gracias por vuestra ayuda!!

 

 

Hi , I hope someone can help me with my problem , the fact is that I have to send information via radio from a remote arduino , which collects data from three sensors to another Arduino connected to the PC which in turn through the PC serial port sends the information to labview . The problem is that sometimes appear strange symbols I guess it will be noise on the serial port .
 
The first question is: In what way is better to send the data to the serial port , using a string or data to data ? In the attached image data data data to arrive . You can see in the software that I do so .
 
And the second question is : What is the best way to separate the data in labview ? Attached is a picture of how I have done it , which works well until some time passes . Through software sent a letter P for Labview know which is the beginning of the data, since there is performed the separation of the three data and converts them into a number.
 
Works well until strange symbols begin to appear , usually on the third item , and I also noticed that the serial port data accumulate , for example if the first gets P23 , 4X23 , 5X102 , 33 after some time on the serial port appears X102 , 33P23 , 4X23 , 5X10 . ( X is to separate the data )
 
Also enclosed with the software I programmed the remote arduino if someone sees a failure to communicate it to me . Thanks for your help!

 

Descargar todos
0 kudos
Mensaje 1 de 26
14.372 Vistas

Hola,

hace un tiempo que realice una aplicación que enviaba datos desde arduino a labview. Yo opté por un mensaje donde enviaba todos, recuerdo que eran del orden de 20 números (float, integer, etc).

Yo opté por una cabecera, en mi caso de 4 caracteres, a continuación envía el número total de caracteres del mensaje. Al final del mensaje le añadí un CRC (control de errores).

 

La lectura de datos en labview lo realizaba con un buffer donde buscaba la cabecera, leía el número de caracteres del mensaje y esperaba a que llegaran todos los datos del mensaje. Una vez esto, compruebo el CRC que es correcto y si no descarto el mensaje y busco otra cabecera.

 

Los datos los mandaba con un tamaño fijo y no le introducía separador. También se le puede añadir un contador para conocer si se pierde algún mensaje. Yo enviaba los dados de forma binaria (función para c: reinterpret_cast. Funcion en labview: type cast function). Así por ejemplo, el float son cuatro bytes. Hay que tener cuidado con que tipo de formato en que se representa los datos por el arduino y windows, es decir, si son Little-endian o Big-endian. Para convertir de uno a otro una vez que tienes el dato binario se invierte, por ejemplo un entero I32, tiene 4 byte (b0,b1,b2,b3) pues para cambiarlo de formato se invierten los bytes, es decir (b3,b2,b1,b0) y se hace el casting.

 

Por ejemplo:

Tamaño de dato

Tipo

Descripción

2

Char[2]

Cabecera

2

Unsigned short int(U16)

Longitud de mensaje total

4

Int(I32)

Lectura de entrada analógica A0

2

Unsigned short int

Contador de mensaje

2

Unsigned short int (U16)

CRC-CCITT

 

 

 

Espero que te ayude.

 

Saludos 

 

Emilio

0 kudos
Mensaje 2 de 26
14.359 Vistas

Hola, gracias por responder pero no he entendido casi nada, ¿como funciona eso del CRC y como se comprueba que los datos son correctos en labview con esto? ¿de que manera enviabas los datos, string o como float uno a uno? ¿cual es el motivo de enviar los datos en binario? ¿que herramientas usabas en labview para separar los datos y acerlos como float indivuduales? Gracias.

0 kudos
Mensaje 3 de 26
14.320 Vistas

Hola,

te adjunto un ejemplo, código para arduino (probado en mega) y código para labview 2009.

 

El código referente al arduino está en la carpeta prueba.

 

En cuanto al crc, es como la suma de todos los bytes del mensaje salvo éste. Si tienes mas interés búscalo en la wikipedia. En concreto utilizo el CRC-CCITT de 16 bits. El código lo he implementado en Labview y Arduino.

 

En este caso los datos se envían todos juntos en un mensaje de longitud fija. Se manda es una cadena de bytes(char) que corresponde con un carácter en la tabla ASCII. 

 

Se realiza el envío de datos en binario para evitar conversiones complejas y se reduce en número de bytes a enviar. Solo hay que tener en cuenta el cambio de Little-endian a big-endian que es cambiar los bytes de orden de cada dato.

 

Recomiendo que veas la tabla de excel que te adjunto para ver el orden de los datos en el mensaje y el tamaño, a la hora de interpretar el código, por favor, téngala en cuenta.

 

El envío en de datos en binario no se pierde información, se trasmite todos los "ceros y unos", además de ser una forma compacta. Por ejemplo, imagínate que quieres enviar el float (3,1234e-4), pues en binario se enviarían 4 bytes mientras que como cadena de texto se mandaría nueve bytes y posteriormente hay que convertirlo con un algoritmo complejo, en cambio, el envío en binario son 4 bytes (caracteres), que posteriormente se tienen que ver como float.

 

En cuanto a la herramienta que utilizo en labview para separar los datos, pues yo recibo los datos como una cadena de caracteres del puerto serie y lo separo con el bloque substring, eso si primero voy buscando la cabecera de mensaje y me olvido de lo anterior y compruebo que el CRC del mensaje corresponde con el que he enviado en el mensaje, si no es así pues descarto la cabecera y busco otra cabecera. Una vez encontrada la cabecera espero a que en el buffer estén todos los bytes del mensaje.

 

Échale un vistazo a los programas y pregunta lo que no entiendas.

 

Saludos,

 

Emilio

 

Mensaje 4 de 26
14.291 Vistas

Hola buenas, gracias por tus respuestas, tu programa principal de labview es bastante complicado, no tengo tanto nivel de labview como para entenderlo todo, el CRC viene siendo lo mismo que un checksum no? Es lo que voy a utilizar. Mi programa comienza a enviar los datos correctamente como se puede ver en la imagen 1 que adjunto, al buffer le llegan una letra seguido de los datos correctos. Pero pasado poco tiempo empiezan a llegar símbolos raros al buffer como se puede ver en la imagen 2, al primer dato le falta el punto, el segundo se muestra correctamente pero el tercero y cuarto aparecen símbolos raros. La imagen 3 es la forma en que separo los datos en labview y configuro el puerto serie y la imagen 4 el trozo de código que utiliza el arduino para enviar los datos al puerto serie del ordenador. No entiendo porque empezando bien y pasado unos segundos comienza a fallar, los datos se guardan en una tarjeta sim que tiene el arduino remoto y aparecen de forma correcta, el problema esta labview, puede ser que el buffer del puerto serie se llene? o puede ser que no configuro bien el puerto serie en labview? o puede ser que no envío de forma correcta los datos al puerto serie a través del código de arduino? No consigo encontrar la solución e probado cambiando tiempos en el código en C, probando diferentes formas de separar los datos en labview y nada. Aver si ves algo raro y me puedes ayudar a solucionar mi problema, gracias!!

Descargar todos
0 kudos
Mensaje 5 de 26
14.231 Vistas

La imagen 4.

0 kudos
Mensaje 6 de 26
14.230 Vistas

Hola,

 

En resumen:

  • comprueba que los datos leídos en labview son los enviados por el puerto serie con otro monitor serie como el mismo de arduino.
  • comprueba que la configuración que tienes en el puerto serie en labview es la que deseas (yo utilizo otra pero cualquiera puede ser buena). No es muy recomendable estar abriendo y cerrando el puerto cada vez que lees un dato.

 

En cuanto en el CRC y el ckecksum son similares. Se busca un algoritmo que genere un código que dependa de todos los datos enviados en el mensaje, para posteriormente calcularlo en el destino y compararlo con el origen para descartar errores en el envío. No es 100% seguro pero casi.

 

En cuanto al problema que tienes, hay que saber donde está, si al enviar el dato y/o al leer en labview. Meolvidaría de labview (cierro por un momento para que no me bloquee el puerto serie) compruebo los datos que son enviados al puerto serie con un monitor serial, por ejemplo el mismo que trae el IDE de arduino (barra de herramientas la derecha, una lupa). Si los datos aparecen como tu esperas durante un cierto tiempo, pues no es problema de arduino si no de la programación de labview.

 

En cuanto a la programación en labview, la configuración del puerto serie que haces es con carácter terminador (10 o salto de línea) yo no he utilizado pero te lo comento para que lo tengas en cuenta. Puedes ver ejemplos en labview en la ayuda para ver como funciona. Después de eso borras todos los eventos relativos al puerto serie y habilitas un evento que se lanza cuando existan caracteres en el puerto serie y esperas a que se produzca este evento, cuidado con el timeout que es el  tiempo que espera a que se produzca un evento de ese  tipo. Al ocurrir el evento lees todos los caracteres del puerto serie y comienza el proceso de transformación en datos y posteriormente debes de cerrar el puerto serie (¿me equivoco?). Personalmente no me gusta andar abriendo y cerrando el puerto serie cada vez que leo un dato como creo que lo haces. No tengo todo el programa para ver eso.

 

En la transformación de string a números pues, los datos deben tener un número fijo de dígitos, te dejo un código en labiew pequeñito que hace lo mismo (espero no lo he probado) pero que puede variar el número de dígitos del número. Se buscan las letras y me quedo con lo intermedio.

 

En cuanto al código que puse no es tan difícil, básicamente hago lo mismo que  tú pero en formato binario.

 

No te he solucionado nada pero espero que te ayude a resolver el tema. Si necesitas ayuda pues por aquí estoy.

 

Saludos,

Emilio.

 

 

Descargar todos
0 kudos
Mensaje 7 de 26
14.204 Vistas

Hola,

 

He hecho lo que me as pedido y he probado con el hyperterminal de windows la recepcion por el puerto y los datos son correctos, lo he dejado como una media hora y no ha habido ni un error el la cadena de datos a si que el problema esta en labview.

 

Yo creo que el puerto serie no lo cierro cada vez que recibo porque esta fuera del recuadro del whileloop pero no estoi seguro, por si acaso te envio el final del programa puesto que la foto anterior estaba cortada.

 

Ahora mismo el arduino remoto envia datos al PC cada 10 segundos, con el proyecto finalizado cada 15 minutos, y el timeout con el que me as dicho que tenga cuidado tambien son 10 segundos, ¿puede venir por hay el problema? ¿es recomendable dejarle el timeout o se puede eliminar? ¿es recomendable eliminar lo del carater terminador con salto de linea?

 

En cuanto ha separar el string y convertirlo a numeros lo tengo echo de manera correcta, cuando recibe los datos correctamente hace la separacion de forma adecuada por lo que no tiene mas misterio, de momento no lo voy a cambiar.

 

En definitiva creo que el problema esta en la configuracion del puerto serie en labview y me imagino que en la sincronizacion de los tiempos pero puede ser mucho imaginar...

 

Te agradezco tu ayuda, espero que podamos solucionar esto ya que me esta llevando bastante tiempo encontrar remedio.

 

Gracias Emilio!!

0 kudos
Mensaje 8 de 26
14.172 Vistas

Te adjunto las imagenes del VI

Descargar todos
0 kudos
Mensaje 9 de 26
14.171 Vistas

Hola,

 

Intuyo, por las imágenes, que configuras en puerto serie cada ciclo del bucle while, el puerto serie se configura al inicio de su utilización (programa), puede que eso sea el error. Te recomiendo que solo lo configures y borres los eventos antes del bucle while y una única vez.

 

Échale un vistazo de cómo lo tengo hecho yo este funciona sin problemas durante horas (cinco al menos) yo lo utilicé para monitorizar las temperaturas de un prototipo de horno para unas pruebas. Si deseas mándame la parte de código del arduino (solo el mensaje) y la parte de comunicación con el puerto serie de labview y lo chequeo. Yo tengo labview 2009.

 

Por otro lado, el timeout del evento del puerto serie, lo incrementaría de 10000 a por lo menos 20000. Con ello espera a que se produzca en evento de caracteres en el puerto serie a 20000ms.

 

Voy a intentar montar un ejemplo con la configuración que tienes tú.

 

Saludos,

 

Emilio.

 

0 kudos
Mensaje 10 de 26
14.149 Vistas