A resposta de @ AdamHaun é tudo que você precisa, sprintf()
é fácil criar uma string e enviá-la. Mas se você realmente quer uma printf()
função própria, então Funções de Argumento Variável (va_list) é o caminho.
Com va_list
uma função de impressão personalizada, é semelhante ao seguinte:
#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);
}
Exemplo 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);
Observe que, embora esta solução ofereça uma função conveniente para uso, mas é mais lenta que o envio de dados brutos ou o uso uniforme sprintf()
. Com altos datarates, acho que não será suficiente.
Outra opção, e provavelmente a melhor opção, é usar o depurador SW-ST-Link junto com o utilitário ST-Link. E use Printf via visualizador SWO , aqui está o manual do ST-Link Utility , parte relevante começa na página 31.
O Printf via SWO Viewer exibe os dados de printf enviados do destino através do SWO. Permite exibir algumas informações úteis sobre o firmware em execução.