C语言中printf是个功能强大的函数,可以打印各种格式的数据。在单片机程序调试时,也经常需要将数据打印出来查看。之前介绍过通过Jlink的RTT功能进行打印《Jlink使用技巧之RTT和J-Scope》,今天将介绍通过串口和USB虚拟串口的方式使用printf函数打印。
通过串口使用printf,需要将串口发送函数重定向到printf。在编译好的工程中添加以下部分程序即可:
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
return ch;
}
另外,不要忘了包含头文件
#include "stdio.h"
USB虚拟串口使用printf和串口不同,需要自己重新写一个功能和printf函数一样的函数。在编译好的USB虚拟串口的工程中(参考STM32CubeMX之USB从机),usbd_cdc_if.c文件下添加如下程序,并在.h文件中进行声明。
#include <stdarg.h>
void usb_printf(constchar *format, ...)
{
va_list args;
uint32_t length;
va_start(args, format);
length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
va_end(args);
CDC_Transmit_FS(UserTxBufferFS, length);
}
在需要时直接调用该函数即可,使用方法和printf函数一样:
usb_printf("%ds\r\n",cnt);
推荐阅读:
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。