Skip to content

Redirect STD

Georgi Angelov edited this page Sep 30, 2019 · 9 revisions

Log_Debug() is fprintf(stderr, ... )

/* Georgi Angelov 2019 */
#include <Arduino.h>

void STD_TO_UART(int fd, void *file) {
  if (fd > -1) {
    int *p = (int *)((char *)file + 60); // offset to FILE->fd
    //Serial.printf("[STD] OLD FD: %d\n", *p);
    *p = fd;
    //Serial.printf("[STD] NEW FD: %d\n", fd);
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Azure Explore");

  /* UART FD */
  int fd = Serial.FD();
  Serial.printf("UART = %d\n", fd);

  /* REDIRECT TO UART FD */
  //STD_TO_UART(fd, stdin); // 0
  STD_TO_UART(fd, stdout);  // 1 for printf
  STD_TO_UART(fd, stderr);  // 2 for Log_Debug()

  /* TEST */
  printf("[TEST] printf() %d\n", 42); 
  fprintf(stdout, "[TEST] fprinf()\n");
  puts("[TEST] puts");
  Log_Debug("[TEST] Log_Debug() %f", 22.0 / 7);
}

NEW: simple use Serial.redirect( stderr )

HINT: by default stdio is buffered ...

// unbuffer
setvbuf(stderr, NULL, _IONBF, 0);  
setvbuf(stdout, NULL, _IONBF, 0);  
  
printf("test"); // work without \n  
Clone this wiki locally