Arduino:
Escribiendo en el error estándar

Cómo hacerlo:

Arduino no diferencia de forma nativa entre la salida estándar y el error estándar como lo hacen los sistemas informáticos convencionales. Los métodos Serial.print() y Serial.println() escriben en la misma salida serial, que típicamente se visualiza en el Monitor Serial del IDE de Arduino. Sin embargo, podemos emular la escritura en stderr al formatear específicamente los mensajes de error o dirigiéndolos a una salida alternativa, como un archivo en una tarjeta SD o a través de una conexión de red.

Para emular stderr, puedes prefijar los mensajes de error con una etiqueta como “ERROR:” para diferenciarlos en el Monitor Serial:

void setup() {
  Serial.begin(9600); // Inicializa la comunicación serial a 9600 baudios
}

void loop() {
  int result = someFunction();
  if (result == -1) {
    // Emulando stderr al prefijar el mensaje de error
    Serial.println("ERROR: La función falló en ejecutarse.");
  } else {
    Serial.println("La función se ejecutó exitosamente.");
  }
  delay(1000); // Espera un segundo antes de reiniciar el bucle
}

int someFunction() {
  // Una función ficticia que retorna -1 en caso de error
  return -1;
}

La salida de muestra en el Monitor Serial del IDE de Arduino podría verse así:

ERROR: La función falló en ejecutarse.

Para proyectos que requieren un enfoque más sofisticado, incluyendo escribir en diferentes salidas físicas, puede ser necesario el uso de librerías de terceros o hardware adicional. Por ejemplo, registrar mensajes de error en una tarjeta SD requiere la librería SD:

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  Serial.begin(9600);
  if (!SD.begin()) {
    Serial.println("ERROR: ¡La inicialización de la tarjeta SD falló!");
    return;
  }
  
  myFile = SD.open("error.log", FILE_WRITE);
  if (myFile) {
    myFile.println("ERROR: La función falló en ejecutarse.");
    myFile.close(); // Asegúrate de cerrar el archivo para guardar los contenidos
  } else {
    Serial.println("ERROR: Falló al abrir error.log!");
  }
}

void loop() {
  // Tu código principal iría aquí
}

Con este enfoque, físicamente separas la salida normal del programa y los mensajes de error dirigiendo estos últimos a un archivo error.log en una tarjeta SD, lo que permite análisis post-mortem sin saturar el canal de salida primario.