[SOLUCIONADO]LCD KS0108 + Mega328p Monitorizar Victron MPPT 75|15

El problema que tengo es que no consigo mostrar la información que recibo por el puerto serie en una pantalla, para tener un monitor de estados del sistema foto-voltaico.

El dispositivo encargado de darme la información es Victron MPPT 75|15.

Dispone de un puerto de comunicación serie establecido 19200,8,1,n con cuatro pin de salida 5v/tx/rx/Gnd donde entrega cada segundo las medidas/estados.

PID 0xA042<CR><LF> 
FW 123<CR><LF> 
SER# HQ16429Q39Z<CR><LF> 
V 13640<CR><LF> 
I 1290<CR><LF> 
VPV 37350<CR><LF> 
PPV 18<CR><LF> 
CS 5<CR><LF> 
ERR 0<CR><LF> 
LOAD ON<CR><LF> 
IL 0<CR><LF> 
H19 10<CR><LF> 
H20 1<CR><LF> 
H21 39<CR><LF> 
H22 0<CR><LF> 
H23 46<CR><LF> 
HSDS 11<CR><LF> 
Checksum ƒ<CR><LF>

Con la librería SoftwareSerial consigo reconocer toda la información y pasarla al puerto serie, mostrando la información por Monitor Serie de arduino, bien todo perfecto…

El problema es cuando intento mostrar esta información por el KS0108, solo consigo las primeras tres etiquetas.

PID, SER, FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;

Pensando que podría ser por la carga de las librerías gráficas, y la necesidad de leer bit a bit la trama que entrega Victron MPPT 75|15 procesada por otra librería SoftwareSerial decidí que la solución seria cambiar de dispositivo gráfico.

Si utilizo el LCD5110 consigo una linea mas, es decir mostrar cuatro etiquetas, fracaso no es la solución, retomamos el KS0108.

Retiramos del código la librería SoftwareSerial para descargar de procesos, conectamos directamente al puerto tx/rx arduino, y el resultado es la misma que en el caso del LCD5110 consigo una linea mas, es decir mostrar cuatro etiquetas.

Conclusión solicitar ayuda, ¿donde esta fallando mi código?.

/*
 * Kacitran >-< Recolector de datos Victron MPPT 75|15. 
 * v0.15
 * 
    CONCEPTOS BASICOS SERIE -> http://forum.arduino.cc/index.php?topic=396450.0
    TIPOS DE DATOS          -> http://arduino.cl/introduccion-a-los-tipos-de-dato-con-arduino/
    string.h                -> http://www.cplusplus.com/reference/cstring/

                MPPT 75|15
              _____________
             | _    20   _ |
             |_____________|
         ________________________
        |    4    3    2    1    |
        |    .    .    .    .    |
        |   VCC  TX   RX   GND   |
        | (RED) (YEL)(WHI)(BLK)  |
        |        _______         |
        |_______|       |________|

*/
#include "U8glib.h"
#include <SoftwareSerial.h>
U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16);     // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
//SoftwareSerial PuertoUno (2, 3);// software serial: RX = digital pin 2, TX = digital pin 3

int FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;
//int PID, SER, FW, V, I, VPV, PPV, CS, ERR, LOAD, IL, H19, H20, H21, H22, H23, HSDS;

const byte NumeroCaracter = 250;//30
char LeerCaracter[NumeroCaracter];   // matriz para almacenar los datos recibidos
boolean NuevosDatos = false;

const char * VictronDatos[] = {"FW", "V", "I", "VPV", "PPV", "CS", "ERR", "LOAD", "IL", "H19", "H20", "H21", "H22", "H23", "HSDS"};
//const char * VictronDatos[] = {"PID", "SER", "FW", "V", "I", "VPV", "PPV", "CS", "ERR", "LOAD", "IL", "H19", "H20", "H21", "H22", "H23", "HSDS"};

const unsigned int TodosVictronDatos = sizeof(VictronDatos) / sizeof(*VictronDatos);

void setup() {

  Serial.begin(19200);
//  PuertoUno.begin(19200);

  u8g.setFont(u8g_font_5x7);  //u8g.setFont(u8g_font_unifont);
  u8g.setRot180();            // Rotacion de pantalla 180º
  u8g.setColorIndex(1);       // Panel monocromo

}

  void draw()       // informacion display
  {

   u8g.firstPage();
   do {
       u8g.drawStr( 0, 6," V ->");
       u8g.setPrintPos(25,6);
       u8g.print(String(V));
       u8g.print("mV");
       u8g.setPrintPos(65,6);
       u8g.print(String(FW));
       u8g.drawStr( 85, 6,"Version");

       u8g.drawStr( 0, 13," I ->");
       u8g.setPrintPos(25,13);
       u8g.print(String(I));
       
       u8g.drawStr( 0, 20,"VPV->");
       u8g.setPrintPos(25,20);
       u8g.print(String(VPV));
       u8g.print("mV");
       
       u8g.drawStr( 0, 27,"PPV->");
       u8g.setPrintPos(25,27);
       u8g.print(String(PPV));
       
       u8g.drawStr( 0, 34,"CS ->");
       u8g.setPrintPos(25,34);
       u8g.print(String(CS));

       u8g.drawStr( 0, 41,"Err->");
       u8g.setPrintPos(25,41);
       u8g.print(String(ERR));

       u8g.drawStr( 0, 48,"LOAD>");
       u8g.setPrintPos(25,48);
       u8g.print(String(LOAD));
       
       u8g.drawStr( 0, 55,"IL ->");
       u8g.setPrintPos(25,55);
       u8g.print(String(IL));
       
       u8g.drawStr( 0, 62,"H19->");
       u8g.setPrintPos(25,62);
       u8g.print(String(H19));

   } while( u8g.nextPage() );
   delay(1);
  }

void loop()
{
  RecolectorDatos();
  if (NuevosDatos)        // línea completa, tratar
  {
    AnalizarNuevosDatos();
    NuevosDatos = false;
  }
}
void RecolectorDatos()
{
  static byte ndx = 0;
  char IndicadorFinal = '\n';
  char caracter;
  while (Serial.available() > 0 && NuevosDatos == false)
  {
    caracter = Serial.read();
    if (caracter != '\r')
    { // Ignoramos este caracter
      if (caracter != IndicadorFinal)
      {
        if (caracter == '\t') caracter = ' '; // CAmbiamos las pestañas en un solo espacio
        LeerCaracter[ndx] = caracter;
        ndx++; // Vamos al siguiente espacio en nuestro buffer
        if (ndx >= NumeroCaracter)
        { // Y comprobar los límites.
          ndx = NumeroCaracter - 1; // that means we will loose the end of long strings
        }
      }
      else
      {
        LeerCaracter[ndx] = '\0'; // Terminar la cadena
        ndx = 0; // ndx Es estático, así que nos preparamos para el siguiente turno
        NuevosDatos = true;
      }
    }
  }
}
void AnalizarNuevosDatos()
{
  const char *delim  = " ";
  char * item;
  boolean EtiquetaEncontrada;
  long int DatoEtiqueta;
  int IndiceEtiqueta;
  item = strtok (LeerCaracter, delim);
  EtiquetaEncontrada = false;
  for (int i = 0; i < TodosVictronDatos; ++i)
  {
    if (!strcmp(VictronDatos[i], item))
    {
      item = strtok(NULL, delim);
      if (item != NULL)
      {
        EtiquetaEncontrada = true;
        IndiceEtiqueta = i;
        DatoEtiqueta = atol(item);
        break; // Termina el bucle for cuando encontramos una etiqueta
      } // Final si teníamos un valor para la etiqueta
    } // Cadena final comparar
  } // fin del for

  if (EtiquetaEncontrada) {
    switch (IndiceEtiqueta) { 

 /*
           case 0:
            PID = DatoEtiqueta;


            break;
*/      
      case 0:
        FW = DatoEtiqueta;


        break;

      case 1:
        V = DatoEtiqueta;

        //Serial.print("v Voltage Bateria ");
        //Serial.print(F("02 V   -> "));
        //Serial.println(V);
        //Serial.println(F("mV"));

        break;
      case 2:
        I = DatoEtiqueta;


        break;
      case 3:
        VPV = DatoEtiqueta;


        break;

      case 4:
        PPV = DatoEtiqueta;


        break;

      case 5:
        CS = DatoEtiqueta;

 
        break;

      case 6:
        ERR = DatoEtiqueta;


       break;

      case 7:
        LOAD = DatoEtiqueta;


        break;

      case 8:
        IL = DatoEtiqueta;


        break;

      case 9:
        H19 = DatoEtiqueta;


        break;

      case 10:
        H20 = DatoEtiqueta;


        break;

      case 11:
        H21 = DatoEtiqueta;


        break;

      case 12:
        H22 = DatoEtiqueta;


        break;

      case 13:
        H23 = DatoEtiqueta;


        break;

      case 14:
        HSDS = DatoEtiqueta;

        
        break;
    }
  }
  else {
  }

      draw();
}

Gracias de antemano por dedicarme vuestro tiempo.

Bien me contesto a mi mismo, pero real mente la respuesta es gracias a la ayuda de (surbyte).

Como bien dice un dicho: "Ven cuatro ojos mas que dos", y si el nuevo par de ojos que escudriñan el código es (surbyte) pues éxito garantizado de este proyecto.

Cual fue realmente la solución que aporto a este proyecto, pues algo tan sencillo y complicado como decirle, recolecta los datos y NO los muestres si no estaban completos. Me explico: lo que yo realizaba ya que daba por hecho que no existían perdida, recolecta y muestra.

  RecolectorDatos();
  if (NuevosDatos)  {      // línea completa, tratar
      AnalizarNuevosDatos();
      NuevosDatos = false;
  }
  if (fTodosLeidos) { //cuando tengas todos los datos    
      fTodosLeidos = false;

Porque es sencillo, porque cuando tienes la mente libre sin contaminar para analizarlo y ser consecuente, sin dejar de lado experiencia y conocimiento en el sentido amplio de las palabras; y por que no mencionar la calidad como persona, creo se podría resumir con " ∞ ".

      case 14:
                HSDS = DatoEtiqueta;

                //Serial.print("Dia ");
                Serial.print(F("15hsds "));
                Serial.println(HSDS);
                //Serial.println(F("   Dias en servicio 365"));
                Serial.println(F("..."));
                fTodosLeidos = true;
                break;

En este punto (fTodosLeidos = true;) donde crea una función todos leídos.

Bien lo doy como solucionado, y dejo un pantallazo.

.