Cómo enviar datos por serial al arduino de manera eficiente

Hola!

Estoy desarrollando un pequeño proyecto con arduino en el que en una pantalla OLED I2C se muestran algunas estadísticas de rendimiento del sistema, además de la hora.

La comunicación, evidentemente, se hace vía serial port. El funcionamiento para la comunicación que he diseñado es el siguiente:

  • Desde el programa, se envía una línea (a rate de una vez por segundo, mínimo). La línea tiene la siguiente estructura:
    X.Y.HH.MM.AAA.BB.CCC.DD.EEE
    Cada número separado por puntos es guardado en una variable distinta. De tal manera, sería: X y Y son para el display. X es para el modo sleep de la pantalla (función de la librería) y el Y es para qué información mostrar en grande, si CPU o GPU.
  • Cuando llega al arduino, se “desmonta” usando Serial.parseInt();, cada valor separado por punto es enviado a una variable distinta.
  • Luego, se imprime en pantalla usando las funciones de la librería.

Cuando pongo el sistema a prueba y hago testeos con la consola del IDE, algunas veces funciona y otras algunos bytes quedan por el camino.

Éste es el código (las variables para almacenar HH y MM no están implementadas, pero el funcionamiento sigue siendo igual):

// I2C OLED lib by Rinky dinky electronics
//
// Arduino Uno/2009:
// ----------------------
// Display:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin
//


#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL); // Remember to add the RESET pin if your display requires it...

//GRAPHICS
extern uint8_t UI[];
extern uint8_t TOPGPU[];
extern uint8_t TOPCPU[];

//FONT
extern uint8_t SmallFont[];
extern uint8_t TinyFont[];
extern uint8_t BigNumbers[];

byte sleep;
byte onTop;
byte CPUusage;
byte CPUtemp;
byte GPUusage;
byte GPUtemp;
byte RAMusage;

void setup()
{
  Serial.begin(9600);
  if(!myOLED.begin(SSD1306_128X64))
    while(1);   // In case the library failed to allocate enough RAM for the display buffer...
}

void loop()
{
   while (Serial.available() > 0) {
    Serial.println("BUFFER");
    sleep = Serial.parseInt();
    onTop = Serial.parseInt();
    
    CPUusage = Serial.parseInt();
    CPUtemp = Serial.parseInt();

    GPUusage = Serial.parseInt();
    GPUtemp = Serial.parseInt();

    RAMusage = Serial.parseInt();
    // look for the newline. That's the end of your sentence:

    if (Serial.read() == '\n') { //PARA DEBUG
      //Serial.print(onTop, DEC);
      //Serial.print("\n");
    
      //Serial.print(GPUusage, DEC);
      //Serial.print("\n");
    
      //Serial.println(RAMusage, DEC);
      //Serial.print("\n");
    }  
  }

//imprime en pantalla los datos [...]
}

La verdadera pregunta es, ¿cómo puedo enviar estos datos al arduino de manera eficiente y sin perde bytes por el camino? Desconozco si estoy haciendo mal usando el serial o si hay maneras más rápidas para enviar datos.

Tengo algo de experiencia programando (básica), algo de entendimiento con arquitectura de CPU’s y conocimientos de electrónica básica. Si pudiésesis facilitar la respuesta para que pudiera entender los conceptos sería de gran ayuda. ¡Gracias!

Sube la tasa de baudios para comenzar. Nada te impide llevar a 115200 la velocidad de comunicación y hacer mas rápido ese momento en que se intercambien los bytes.
No creo que a 115k pierdas algo con un refrezco de 1 segundo como dices.
Prueba a ver.

La verdadera pregunta es, ¿cómo puedo enviar estos datos al arduino de manera eficiente y sin perde bytes por el camino? Desconozco si estoy haciendo mal usando el serial o si hay maneras más rápidas para enviar datos.

Cuando se se trabaja en comunicaciones, generalmente es mas eficiente, por lo compacto, enviar Bytes. Mira este tutorial de Luis Llamas y si quieres comunicaciones seguras, debes agregar CRC
Saludos