Vai al contenuto

1 settembre 2011

1

Usare printf su Arduino per concatenare le stringhe da stampare

Arduino debug

Durante la fase di sviluppo del codice per un microcontrollore, in questo caso per la piattaforma Arduino, è fondamentale crearsi una buona infrastruttura di debug che stampi dei messaggi di stato sulla porta seriale, per capire cosa sta succedendo nel codice.

Il primo approccio, che tutti abbiamo messo in atto, è quello di concatenare una serie di Serial.print per stampare dei messaggi che contengano anche i valori di alcune variabili, per esempio:

Serial.print("Valore variabile 1: ");
Serial.println(var1);

Sicuramente è un metodo comodo per la rapidità di scrittura ma solo finché si tratta di stampare poche cose, quando le stringhe cominciano ad essere più complesse, le istruzioni di concatenazione si allungano e penalizzano la leggibilità del codice. Quello che si fa, normalmente, nei linguaggi derivati dal C, è usare la funzione printf che prende come argomenti una stringa contenente alcuni caratteri speciali e una serie di valori da sostituire a questi caratteri, vediamo come poterlo fare anche con Arduino.

L’ambiente di sviluppo di Arduino, purtroppo, non include questa funzione ma se ne trova una versione simile nelle librerie AVR di basso livello del microprocessore che, però, richiede un po’ di codice aggiuntivo per funzionare. Per semplificarci la scrittura, possiamo crearci una funzione printf da usare poi liberamente nel nostro codice.

#include <stdarg.h>
#include <avr/pgmspace.h>

void printf(PGM_P s, ... )
{
  char format[100]; // Questo delimita la lunghezza massima della stringa originale.
  memset(format, 0x00, 100);
  strcpy_P(format, s);

  char buff[128]; // Questo delimita la lunghezza massima della stringa finale.
  memset(buff, 0x00, 128);
  va_list args;
  va_start(args,format);
  vsnprintf(buff, sizeof(buff), format, args);
  va_end(args);
  buff[sizeof(buff)/sizeof(buff[0])-1]='\0';
  Serial.print(buff);
}

Questa funzione fa uso del meccanismo per risparmiare memoria su Arduino di cui ho parlato in un precedente articolo, così da ridurre l’impatto del codice di debug sull’esecuzione del programma. Il codice di debug, quindi, si può scrivere in modo molto più leggibile con due sole righe:

prog_uchar PROGMEM debugVariabili[] = {"Valore variabile 1: %s\r\nValore variabile 2: %s.\r\n"};
printf(debugVariabili, var1, var2);

Se, poi, vogliamo fare le cose per bene, metteremo tutte le dichiarazioni delle PROGMEM in un file separato, così da averle tutte a portata di mano per eventuali modifiche ai testi e per rendere ancora più snello alla vista il codice del resto del programma, che conterrà solamente le istruzioni che “fanno qualcosa”.

 

Image: Vlado / FreeDigitalPhotos.net

Leggi altro da Arduino

Articoli simili:

Risparmiare memoria su Arduino
VisualMicro - Programmare Arduino con Visual Studio
Arduino Day 2012
  1. luciano
    Gen 7 2014

    salve
    sono alle prese con la CMUCAM4 e basic stamp della parallax, vorrei rimanere sul Pbasic, ma trovo difficile convertire alcune funzioni arduino, la prego, mi puo’ spiegare la funzione presa dalla libreria CMUCAM$.cpp che le ho allegato ?
    grazie
    ______________________________________________________
    int CMUcam4::setTrackingWindow(int topLeftX, int topLeftY,
    int bottomRightX, int bottomRightY)
    {
    return (snprintf(_cmdBuffer, CMUCAM4_CMD_BUFFER_SIZE,
    “SW %d %d %d %d\r”,
    topLeftX, topLeftY, bottomRightX, bottomRightY)
    < CMUCAM4_CMD_BUFFER_SIZE)
    ? _voidCommandWrapper(_cmdBuffer, CMUCAM4_NON_FS_TIMEOUT)
    : CMUCAM4_COMMAND_OVERFLOW;
    }
    _____________________________________________________

Condividi ciò che pensi, scrivi un commento.

(required)
(required)

Nota: HTML è permesso. Il tuo indirizzo e-mail non sarà mai pubblicato.

Sottoscrivi i commenti