Go Down

Topic: Usare printf su Arduino (Read 2978 times) previous topic - next topic

nid69ita

Feb 22, 2016, 01:04 pm Last Edit: Feb 22, 2016, 01:05 pm by nid69ita
Ciao a tutti.
Mi sono imbattuto in questo codice. Permette di usare la classica printf() verso la Serial di Arduino Uno (provato con quella e non con altre board ma penso sia in generale valido).
Magari è una cosa nota, ma almeno a me, era sconosciuta:

Code: [Select]
FILE serial_stdout;

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

void setup()
{ Serial.begin(9600);
  // Set up stdout for printf() use
  fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
  stdout = &serial_stdout;
  printf("My favorite number is %d!\n", 42);
}
void loop()
{
}


Per la cronaca, comunque il %f non funziona, quindi come per la sprintf()
my name is IGOR, not AIGOR

astrobeed

Ciao a tutti.
Mi sono imbattuto in questo codice. Permette di usare la classica printf() verso la Serial di Arduino Uno
Direi che si fa prima ad usare la sprintf() per creare l'array da inviare e darlo in pasto alla Serial.print() senza stare a fare tutti quei giri.
Meglio ancora, vale per tutte le mcu/micro, usare la sprintf(), che comunque è pesante da gestire, per creare la stringa formattata come serve e inviarla tramite UART con una routine scritta ad hoc con gestione dell'invio tramite interrupt e/o dma se disponibile.
Scientia potentia est

vbextreme

concordo con @astro, considerando che la funzione viene richiamata per ogni carattere da stampare diventa lentissima, questo perchè deve chiamare una funzione referenziata tramite puntatore per ogni carattere, quindi il chip prima legge i due/tre indirizzi necessari, poi li deve mettere in r30:31/EIND, infine chiamare la funzione che eseguirà il codice e ritornerà al chiamante.
Usando un codice più performante di quello scritto nella funzione proposta da @nid si avrà circa 10 clock persi per ogni chiamata a tale funzione.
Io preferirei usare la sprintf() direttamente nel buffer della seriale.
Easy framework linguaggio C: https://github.com/vbextreme/EasyFramework
Hack your life: http://vbextreme.netai.net/
Unoffical Telegram group: https://telegram.me/joinchat/ALRu8ACkdTdXyz-2P7v13A

Go Up