@ Відповідь Адама Хауна - все, що вам потрібно, з sprintf()
нього легко створити рядок і потім надіслати його. Але якщо ви дійсно хочете власну printf()
функцію, то шлях змінних функцій аргументу (va_list) .
З va_list
власною функцією друку виглядає наступне:
#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);
}
Приклад використання:
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);
Зауважте, що хоча це рішення дає зручну функцію у використанні, але це повільніше, ніж надсилання необроблених даних або використання навіть sprintf()
. З високими даними, я думаю, це буде недостатньо.
Інший варіант, і, мабуть, кращий варіант - це використання налагоджувача ST-Link, SWD разом із ST-Link Utility. І використовуйте Printf через переглядач SWO , ось посібник з утиліти ST-Link , відповідна частина починається на сторінці 31.
Printf через SWO Viewer відображає дані printf, надіслані від цілі через SWO. Це дозволяє відображати деяку корисну інформацію на запущеній прошивці.