@La risposta di AdamHaun è tutto ciò di cui hai bisogno, con sprintf()
cui è facile creare una stringa e inviarla. Ma se vuoi davvero una printf()
tua funzione, allora Variable Argument Functions (va_list) è la strada giusta .
Con va_list
una funzione di stampa personalizzata è simile al seguente:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void vprint(const char *fmt, va_list argp)
{
char string[200];
if(0 < vsprintf(string,fmt,argp)) // build string
{
HAL_UART_Transmit(&huart1, (uint8_t*)string, strlen(string), 0xffffff); // send message via UART
}
}
void my_printf(const char *fmt, ...) // custom printf() function
{
va_list argp;
va_start(argp, fmt);
vprint(fmt, argp);
va_end(argp);
}
Esempio di utilizzo:
uint16_t year = 2015;
uint8_t month = 12;
uint8_t day = 18;
char* date = "date";
// "Today's date: 2015-12-18"
my_printf("Today's %s: %d-%d-%d\r\n", date, year, month, day);
Si noti che mentre questa soluzione offre una comoda funzione da utilizzare, ma è più lenta rispetto all'invio di dati non elaborati o all'utilizzo uniforme sprintf()
. Con alti datarati penso che non sarà sufficiente.
Un'altra opzione, e probabilmente migliore, è quella di utilizzare ST-Link, debugger SWD insieme a ST-Link Utility. E utilizzare Printf tramite il visualizzatore SWO , ecco il manuale dell'utilità ST-Link , la parte pertinente inizia a pagina 31.
Printf tramite SWO Viewer visualizza i dati printf inviati dalla destinazione tramite SWO. Permette di visualizzare alcune informazioni utili sul firmware in esecuzione.