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: 

recibir datos via USB LabWindows CVI

¡Resuelto!
Ir a solución

Buenas tardes,

 

estoy realizando un programa basado en CVI y Arduino. Tengo dos canales de datos diferenciados que mando desde Arduino, pero no se me ocurre como separarlos cuando los recibo a través del Serial en CVI.

Por ejemplo, si quisiera enviar el dato 454545454545, y una vez llegue a CVI procesar los 4 por un lado y los 5 por otro.

 

Los canales por separado(aislados) si los recibo bien, usando ComRdTerm. ¿Habria alguna manera de detectar un bit de inicio igual que se detecta el bit de terminación en CVI?

Si alguien tuviese una ligera idea de como recibir los datos correctamente.

 

Gracias de antemano.

Saludos cordiales

0 kudos
Mensaje 1 de 29
4.584 Vistas

 

¿Podrías esplicar mejor tu pregunta? Si ya recibes los canales por separado con ComRdTerm resulta que el Arduino va transmitiendo y el CVI recibiendo correctamente.

No entiendo si el problema está en el Arduino (compactar más mediciones en un único mensaje) u en el CVI.

Puedes realizar un pequeño protocolo de comunicación que comprenda las mediciones de todos los canales en el formato que le corresponde y luego un caracter de terminación. SI nos proporcionas algun dato mas sobre tu transmisión podremos ayudarte mejor.



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 2 de 29
4.541 Vistas

Por cierto el USB del título se refiere simplemente a que utilizas algun conversor de USB a serial, ¿verdad?

En el programa se trata solamente de comunicación serial.



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 3 de 29
4.539 Vistas

Buenos días, 

 

lo primero gracias por contestar. A ver si me puedo explicar mejor. 

 

Estoy usando dos entradas analógicas de arduino para realizar mediciones. Dichas mediciones se almacenan en sus respectivos vectores. Una vez recojo los vectores, envío los valores de estos por el puerto serial. Así es como envio los datos desde arduino.

 

for (i = 0; i < 4096; i++) {
    Serial.print((a0[i] * 3.3) / 4096);
    Serial.println('L');
    Serial.print((a1[i] * 3.3) / 4096);
    Serial.println('F');
  }

De esta forma, en CVI recido los datos bien, pero recibo ambos canales juntoss, y lo que me interesaria seria poder tomar las lecturas de cada canal por separado. No se si me he explicado bien. ('L' y 'F' son caracteress de terminación).

 

Si uso ComRdTerm, con el caracter de terminacion F, lee el dato 'a0La1'

 

Se me ha ocurrido que tal vez podría usar una función tipo 'split' o algo semejante para separar a0 y a1.

 

Saludos

0 kudos
Mensaje 4 de 29
4.537 Vistas

Este es el código del que estaba partiendo para leer los datos en CVI, así leía cuando enviaba un solo canal.

 

while(cont != 4096){
	leerBuf1[0] = '\0';
	ComRdTerm (CANAL1, leerBuf1, strLen, 'L'); 
	sscanf(leerBuf1, "\n%f", &c1);
	valores[cont] = c1;
	cont++;					
}
0 kudos
Mensaje 5 de 29
4.534 Vistas
Solución
Aceptado por el autor del tema teleco_loco

Bueno, te sugiero que leas cada vez ambos canales de una vez, separandolos despues de leerlos; podrías haces así:

 

// Declaracion de variables
double	a, b;
char	leerBuf1[64];


// Lectura de muestras
ComRdTerm (CANAL1, leerBuf1, 63, 'L');
sscanf (leerBuf, "%lfL%lfF", &a, &b);

De esta manera econtrarás en 'a' y 'b' los dos canales medidos.



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 6 de 29
4.527 Vistas

Genial¡¡ ya tengo ambos canales activos. Muchas gracias.

 

Una consulta mas. La plicacion me funciona algo lenta;¿¿puede ser porque el programa tenga que esperar a una gran cantidad de datos?? Seria mejor usar InstallComCallback??

 

Muchas gracias de nuevo ¡¡

0 kudos
Mensaje 7 de 29
4.522 Vistas

Hay que discriminar lo que entiendes por lentitud de la aplicación. Creo que hay tres puntos por mirar:

 

  1. Por un lado el Arduino puede ir transmitiendo lentamente: si hay muchos datos por enviar tradará mucho en terminar la tarea. Esto puede solucionarse aumentando la velocidàd de comunicación, si puedes, y afinando el programa en el Arduino para que sea mas eficiente y rápido. Considera que a 9600 baud se transmite 1 byte/msec: con esto puedes calcular cuánto tempo demoras en recibir todos los datos; si abres el puerto a mayor velocidad tardará menos tiempo; a esto debes añadir el tiempo de medición interno al Arduino: para velocizar esto debes trabajar dentro de la placa
  2. El tiempo de medición + transmisión del Arduino se refleja en el programa del CVI, que como es lógico no podrá correr más rápido Guiño Dependiendo en cómo el programa ha sido realizado, la interfaz del usuario puede ser bloqueada por todo este tiempo, así que parece que el sistema sea lento. 
    Usar el InstalComCallback te permite separar la interfaz del usuario de la tarea de monitoreo del Arduino, así que por ejemplo mientras que recibes datos del instrumento puedes hacer otras cosas (graficarlos, gestionar otros asuntos...). Esto no hace la aplicación mas rápida, simplemente el usuario no se queja de que el sistema no responde a sus comandos.
  3. Finalmente, puede ser que la gestión de los datos recibidos es lenta: este es el único en que puedes hacer algo dentro del programa CVI.

Si puedes aclarar a qué se debe la lentitud que lamentas, con estas indicaciones sabes donde trabajar para mejorar la situación.



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 8 de 29
4.518 Vistas

Pues segun las tres pautas que me has dado en el comentario anterior, creo que se debe a la segunda. Creo que la transmisión/recepción de los datos es rápida; aún así lo comprobaré mejor.

 

La lentitud la encuentro a la hora de manipular la interfaz gráfica en CVI, los ""botones" tardan mucho en responder. Por lo que, en principio, ¿debería probar a usar InstallComCallback en lugar de ComRdTerm?

 

Saludos

0 kudos
Mensaje 9 de 29
4.507 Vistas

Esto depende de cómo gestionas las cosas en tu programa: me imagino que habrá un botón de inicio pero esto ¿qué hace? Podrías gestionar la comunicación dentro de un timer, un timer asincrono, un thread independiente u simplemente la callback del botón. Si pones un poco de tu código podría darte alguna sugerencia.



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 29
4.503 Vistas