Página principal
Serial plotter
wxwidgets

El programa Serial plotter es una utilidad que tiene arduino en versiones 1.6 . Sirve para crear una gráfica de dos canales analógicos que representan la tensión de los pines A0 y A1 del arduino.
Había realizado un programa parecido en Gambas (Visual Basic para Linux) ardupu.zip, y como estaba haciendo programas con la librería wxwidgets, decidí hacerlo con está librería.
La programación se realiza bajo Linux  Debian 9.4 y con la librería wxwidgets versión 3.1.1, esto lo especifico por su importancia.
La programación ha sido un tanto liosa y complicada.
En principio por los pocos ejemplos de dibujo en la librería de wxwidgets.
La segunda causa soy yo, no soy bueno en la programación en C++ , y en ciertas ocasiones pienso que hay tanta abstracción en la programación de objetos, que en algunos casos llega a convertirse en programación ofuscada.
El colocar los distintos botones y controles fue fácil, el problema fue el dibujado de lineas y control del repintado, me llevo bastante tiempo.
En Linux Debian 9.4 y bajo librería wxwidgets versión 3.1.1 el programa funciona perfectamente.
Pero cuando lo compile bajo Windows en las librerías
librería 2.8.12 y 3.1.1, compilaba bien, pero el funcionamiento era dispar.
Bajo la librería  2.8.12  simplemente no funcionaba se quedaba colgado.
Bajo la librería 3.1.1 el funcionamiento era extraño,  en principio funcionaba bien, pero cuando se interactuaba con él programa, se bloqueaba. Después de muchas pruebas el único modo de que funcionara era modificar la cantidad de datos que mandaba el arduino, de los 40 por segundo, debía rebajarse a los 10 por segundo.
Los datos que manda arduino por segundo son 40*9=360 Datos/Segundo , 360*10=3600 bps. Debería se suficiente la velocidad de 115200 del puerto serie.
Después de muchas vueltas buscando alguna solución, la encontré. Modificar los tiempos de espera entre bytes en la configuración serie. Esto se consigue cambiando los parámetros:
    time_out.ReadIntervalTimeout =     10;    //20;   
    time_out.ReadTotalTimeoutMultiplier = 1;    //2;
    time_out.ReadTotalTimeoutConstant = 2;    //50;

También existía diferencia entre las versiones 2.8.12 y la 3.1.1 en el repintado (onPaint) . Aunque en Linux funcionaba perfectamente en las dos versiones de las librería, en  Windows no pasaba lo mismo.
Para arreglar esto modifique:
#if YesWindows   
    dc.Blit(31,5,768,255, dcBuffer, 31, 5, wxCOPY, true);
#else
    dcPantalla->Blit(31,5,768,255, dcBuffer, 31, 5, wxCOPY, true);
#endif   

De esta forma funcionaba en los dos sistemas operativos.
Existe algún problema en el repintado, pero eso solo pasa si tenemos ventanas por encima de la nuestra.
También se podría realizar una rutina donde se busquen los puertos serie disponibles, es fácil, pero eso os lo dejo hacer a vosotros.


Programa funcionando.


Programa funcionando y con el código donde se muestra el programa que tiene que instalarse en el arduino.

PROGRAMA

Hasta pronto.
JUAN GALAZ


Bibliografía:
wxtutor.html
wxtem.html