TolentinoCotesta

Uso di printf, snprintf

Jul 6th, 2019
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. /* Il numero dei caratteri massimo che sarà inviato di volta in volta sulla seriale */
  2. #define BUFFER_SIZE 100    
  3.  
  4. /*  
  5. * Se usi ESP8266, puoi evitare in quanto implementa direttamente Serial.printf()
  6. * Per un utilizzo più generico è necessaro un buffer che conterrà la stringa di testo da inviare.
  7. */
  8. char txBuffer[BUFFER_SIZE];
  9.  
  10. unsigned int cont = 0;
  11. int T1 = 150;
  12. int T2 = 360;
  13.  
  14. /*
  15. * L'implementazione di printf (e di tutte le funzioni derivate) non supporta i float
  16. * per risparmiare RAM, ma si risolve brillantemente con variabili int ed un po' di matematica
  17. */
  18. float T3 = 15.8;
  19.  
  20. void setup() {
  21.   Serial.begin(115200);
  22. }
  23.  
  24. void loop() {
  25.   cont++;
  26.   /* Prepariamo la stringa. Per l'elenco completo dei codici di formattazione
  27.   *  (%d, %u etc etc) fai riferimento ai manuali del C++ come ad esempio qui
  28.   *  http://www.cplusplus.com/reference/cstdio/printf/
  29.   *  Puoi usare anche i caratteri non stampabili come New Line \n, oppure TAB \t etc etc
  30.   */
  31.   Serial.println();
  32.   Serial.println();
  33.   Serial.println("Esempio sprintf");
  34.   sprintf(txBuffer, "Contatore: %u \tVariabile T1: %d \tVariabile T2: %d\n", cont, T1, T2);
  35.   Serial.println(txBuffer);
  36.  
  37.   /*
  38.    *  Per un utilizzo più "sicuro" a volte è preferibile usare snprintf() perché nel caso in cui
  39.    *  la stringa superi la dimensione del buffer non succede nulla di strano. I caratteri vengono
  40.    *  semplicemente ignorati (con sprintf invece no, l'ESP8266 ad esempio potrebbe anche resettarsi).
  41.    *
  42.    *  Non cambia nulla ad eccezione che bisogna specificare anche la lunghezza del buffer
  43.   */
  44.   Serial.println("Esempio snprintf 1");
  45.   snprintf(txBuffer, BUFFER_SIZE, "Contatore: %u \tDifferenza T2-T1: %d\n", cont, T2 - T1);
  46.   Serial.println(txBuffer);
  47.  
  48.   // Oppure in questo modo più "generico"
  49.   Serial.println("Esempio snprintf 2");
  50.   snprintf(txBuffer, sizeof(txBuffer), "Contatore: %u \tSomma T1+T2: %d\n", cont, T1 + T2);
  51.   Serial.println(txBuffer);
  52.  
  53.   /* Il discordo per i float si fa leggermente più complicato, ma nulla di trascendentale.
  54.    * In questo esempio definiamo anche che il testo dovrà avere una lunghezza fissa ed il
  55.    * cosiddetto "padding zero" ovvero lo zero davanti anche nel caso in cui non sia necessario
  56.    * al fine di rispettare la larghezza imposta. Per quanto riguarda la parte frazionaria la otteniamo
  57.    * con una semplice moltiplicazione ed un modulo. Se basta 1 cifra decimale (var * 10)%10
  58.    * E' necessario fare il casting della variabile flot ad int.
  59.   */    
  60.  
  61.   Serial.println("Esempio variabile float");
  62.   sprintf(txBuffer, "Variabile T3 float: %03d,%d °C\n", (int)T3, (int)(T3 * 100)%100, (char)223);
  63.   Serial.println(txBuffer);
  64.  
  65.   /*
  66.    * Se usi questa tecnica con display LCD (utilissima per gestire il numero di caratteri fisso e predefinito)
  67.    * spesso il carattere "°" non è direttamente supportato dal display come testo semplice ed allora puoi passare
  68.    * direttamente il valore corrispondente cosi come da tabella caratteri che trovi nel datasheet del controller (di solito HD44780)
  69.    *
  70.    * sprintf(txBuffer, "Variabile T3: %03d.%d %cC\n", (int)T3, (int)(T3 * 10.0)%10, (char)223);
  71.    * lcd.print(txBuffer);
  72.    */
  73.    
  74.   delay(5000);
  75. }
Add Comment
Please, Sign In to add comment