La respuesta de @ AdamHaun es todo lo que necesita, ya sprintf()
que es fácil crear una cadena y luego enviarla. Pero si realmente quieres una printf()
función propia, entonces las Funciones de Argumento Variable (va_list) son el camino.
Con va_list
una función de impresión personalizada se ve así:
#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);
}
Ejemplo de uso:
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);
Tenga en cuenta que, si bien esta solución le brinda una función conveniente para usar, es más lenta que enviar datos sin procesar o incluso usar sprintf()
. Con altas tasas de datos, creo que no será suficiente.
Otra opción, y probablemente una mejor opción, es utilizar ST-Link, depurador de SWD junto con ST-Link Utility. Y use Printf a través del visor SWO , aquí está el manual de la utilidad ST-Link , la parte relevante comienza en la página 31.
Printf via SWO Viewer muestra los datos de printf enviados desde el objetivo a través de SWO. Permite mostrar información útil sobre el firmware en ejecución.