La respuesta de @AdamHaun es todo lo que necesitas, con sprintf()
es fácil crear una cadena y luego enviarla. Pero si realmente quieres un printf()
de su propia función, entonces Funciones con argumentos variables (va_list) es el camino.
Con va_list
una función de impresión personalizada tiene el siguiente aspecto:
#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 da una función conveniente para utilizar, pero es más lento que el envío de datos en bruto o el uso de incluso sprintf()
. Con altas tasas de datos creo que no será suficiente.
Otra opción, y probablemente mejor, es utilizar ST-Link, depurador SWD junto con ST-Link Utility. Y utilizar Printf a través del visor SWO Aquí está el manual de Utilidad ST-Link La parte relevante comienza en la página 31.
El visor de Printf vía SWO muestra los datos de printf enviados desde el objetivo a través de SWO. Permite mostrar alguna información útil sobre el firmware en ejecución.