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.
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.
el 01-20-2016 10:54 AM
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
¡Resuelto! Ir a solución.
el 01-25-2016 02:53 AM
¿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.
el 01-25-2016 02:55 AM
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.
el 01-25-2016 03:38 AM
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
el 01-25-2016 04:27 AM
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++; }
01-25-2016 05:43 AM - editado 01-25-2016 05:44 AM
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.
el 01-25-2016 06:57 AM
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 ¡¡
el 01-25-2016 07:33 AM
Hay que discriminar lo que entiendes por lentitud de la aplicación. Creo que hay tres puntos por mirar:
Si puedes aclarar a qué se debe la lentitud que lamentas, con estas indicaciones sabes donde trabajar para mejorar la situación.
el 01-25-2016 08:01 AM
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
el 01-25-2016 08:17 AM
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.