@AdamHaun的答案就是您所需要的,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);
请注意,虽然此解决方案为您提供了方便的使用功能,但它比发送原始数据或使用even更慢sprintf()
。对于高数据速率,我认为这还不够。
另一个选择,也许是更好的选择,是与ST-Link Utility一起使用ST-Link,SWD调试器。并通过SWO viewer使用Printf,这是ST-Link Utility的手册,相关部分从第31页开始。
通过SWO Viewer的Printf显示从目标通过SWO发送的printf数据。它允许在正在运行的固件上显示一些有用的信息。