@ La réponse d'AdamHaun est tout ce dont vous avez besoin, sprintf()
il est facile de créer une chaîne puis de l'envoyer. Mais si vous voulez vraiment une printf()
fonction de votre choix, alors les fonctions d'argument variable (va_list) sont la solution.
Avec va_list
une fonction d'impression personnalisée ressemble à ceci:
#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);
}
Exemple d'utilisation:
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);
Notez que bien que cette solution vous offre une fonction pratique à utiliser, elle est plus lente que l'envoi de données brutes ou l'utilisation de even sprintf()
. Avec des taux de données élevés, je pense que ce ne sera pas suffisant.
Une autre option, et probablement meilleure, consiste à utiliser ST-Link, le débogueur SWD avec l'utilitaire ST-Link. Et utilisez Printf via la visionneuse SWO , voici le manuel de l' utilitaire ST-Link , la partie pertinente commence à la page 31.
Printf via SWO Viewer affiche les données printf envoyées depuis la cible via SWO. Il permet d'afficher des informations utiles sur le firmware en cours d'exécution.