Skip to main content
Replace broken link with web archive of link
Source Link
Greenonline
  • 3.2k
  • 7
  • 37
  • 49

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found thisthis today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

fixed sample code
Source Link
Madivad
  • 1.4k
  • 8
  • 26

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long hex = 0;
  static long deccounter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), dec++counter, hex++counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long hex = 0;
  static long dec = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), dec++, hex++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

I wouldn't normally put two answers to a question, but I only just found this today, where you can use printf without any buffer.

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;
    
    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);    
  }
}

This still has the floating point limitation.

edit: I thought I would do a little testing on this, and it works quite well. I added a better test to the loop with formatted output.

changed serial speed to reflect what I've seen most people use, plus included a sample in the main loop
Source Link
Madivad
  • 1.4k
  • 8
  • 26
Loading
Source Link
Madivad
  • 1.4k
  • 8
  • 26
Loading