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: 

comunicacion serial LABWINDOW CVI

¡Resuelto!
Ir a solución

Hola a toda la comunidad,

 

estoy intentando realizar una comunicacion serie con LabWindow, pero no soy capaz de utilizar los datos recibidos en buffer de entrada. He comprobado que los datos que me llegan son los correctos usando printf para ver los datos contenido en el array, pero a la hora de leer el array (usando un bucle for para leer cada poscion), no me muestra los datos correctos. 

 

Espero poodais ayudarme,

Un saludo

0 kudos
Mensaje 1 de 10
4.907 Vistas

Puedes darnos un ejemplo de los mensajes que recibes y los datos por extraer?



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 10
4.901 Vistas

Buenos días,

 

estos son los datos que recojo en el buffer con ComRd:

 

Captura.PNG

 

La idea era extraer estos datos mediante un bucle for, para despues poder graficarlos.

 

ComRd (4, buf,strLen);
printf("%s\n",buf);

 

for(int i = 0; i<= strLen; i++)
{
     b = buf[i];
     printf("%f", b);
     PlotStripChartPoint(panelHandle, PANEL_PANEL1, b);
}

 

Pero el resultado que me imprime, al extraer los datos del bucle es este.

 

Captura1.PNG

 

No se si me estoy equivocando en los tipos de datos, la verdad es que estoy perdido, no termino de entender el funcionamiento de la funcion ComRd.

 

Gracias de antemano,

Un saludo

0 kudos
Mensaje 3 de 10
4.894 Vistas

Creo que lo mejor sería extraer las mediciones mientras que las recibes. Por lo que veo, parece que cada vez recibes un mensaje con una sola medición: si es así, podrías extraer la medición en un double con sscanf (buf, "%lf", &mis); 

 

ComRd simplemente recibe del puerto serial el mensaje y lo pone en la variable string: cómo extraer los datos depende de lo que transmite el dispositivo externo. sscanf es lo que se usa para extraer un dato float u doble, mientras que lo que haces en tu loop es extraer el valor ascii de los caracteres y imprimirlo en la pantalla: 49 es 1, 54 es 6, 46 el punto decimal..., esto es, la secuencia 49,49, 54, 51, 46, 48, 48 se corresponde al número "1163.00"



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 4 de 10
4.885 Vistas

Ante todo, gracias por responder y ayudarme,

 

mas o menos se me van aclarando las dudas, aunque no del todo.

 

El dispositivo externo le esta mandando datos continuamente, por lo que la idea es que los fuera leyendo conforme le van llegando, entonces, ¿debo de hacerlo con el uso conjunto del ComRd y de sscanf, para leer los datos de sscanf? 

 

lo que no me queda claro es como ir leyendo los datos uno a uno conforme me van llegando. Esa imagen que he puesto arriba son todos los datos que me a ido enviando uno a uno..No se si me explico.

 

Un saludo

0 kudos
Mensaje 5 de 10
4.880 Vistas
Solución
Aceptado por el autor del tema teleco_loco

Bueno, si el dispositivo envía continuamente los datos, ¿cómo separa los datos entre si? Los datos por ejemplo pueden ser separados por el retorno de carro (0x13) u el nueva línea (0x10), u otro carácter. Si es así podrías usar el ComRdTerm para leer cada dato singolarmente, añadiendo el sscanf para extraer la información después de cada lectura. Como decir que sí: debes estar continuamente leyendo del puerto serial y extraendo los datos uno por uno si quieres leer conforme el proceso se va realizando.



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 10
4.874 Vistas

Bien, perfecto.

 

Ya va saliendo algo más claro, muchas gracias. Si surge algo más lo ire  comentando ¡¡

 

Gracias, un saludo

0 kudos
Mensaje 7 de 10
4.867 Vistas

Me alegra haberte ayudado.

Solamente me ocurre notar que los valores que he puesto en mi mensaje anterior son equivocados: el retorno de carro realmente es 0x0D (13 es el código en decimal) y el nueva línea es 0x0A (decimal 10). Estos son los valores que debes poner en el campo TeminationByte del ComRdTerm en el caso de que quieras usarlo.



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 10
4.855 Vistas

Hola de nuevo.

 

los valores ya me los saca bien, ahora estoy intentando representarlos en una gráfica, y lo estoy haciendo con PlotStripChartPoint. ¿Crees que es la mejor forma de representarlos? La gráfica me esta saliendo de una manera tal que así:

 

Captura.PNG

 

Teoricamente es una sinusoidal, pero en vez de unirme mis puntos directamente creo que me está poniendo valores en cero entre las muestras.

 

Por eso digo que si esta es la mejor opcion o mejor una gráfica del tipo Graph. 

 

Un saludo

0 kudos
Mensaje 9 de 10
4.847 Vistas

Es posible que estés dibujando un punto con una medición válida y uno con cero: esto lo puedes averiguar añadiendo un DebugPrintf ("%f\n", medicion); inmediatamente antes del plotStripChardPoint y mirando a la ventana del Debug Output.

 

Otra posibilidadn es que hayas puesto en el strip chart un incorrecto tipo de línea: el diagrama que pones podrías ser el resultado de un Base zero vertical bar, mejor sería usar el Thin line:

Trace Settings.png



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.842 Vistas