在很早之前觉得printf基本上只能一个串口用, 如果需要在输出里面加入一些数据, 基本上就是使用sprintf这样使用,不过始终感觉不爽
在学习了C语言可变参数之后, 觉得可以用可变参数来实现自定义的printf
#include "stdio.h"
#include <stdarg.h>
void drv_com1_printf(char *fmt, ...)
{
char buffer[50];
char *p = buffer;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, 50, fmt, arg_ptr);
while(*p != '\0'){
LL_USART_TransmitData8(USART1,(uint8_t)*p++);
while (LL_USART_IsActiveFlag_TXE(USART1)== RESET);
}
va_end(arg_ptr);
}
void drv_com2_printf(char *fmt, ...)
{
char buffer[50];
char *p = buffer;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, 50, fmt, arg_ptr);
while(*p != '\0'){
LL_USART_TransmitData8(USART2,(uint8_t)*p++);
while (LL_USART_IsActiveFlag_TXE(USART2)== RESET);
}
va_end(arg_ptr);
}
void drv_com3_printf(char *fmt, ...)
{
char buffer[50];
char *p = buffer;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, 50, fmt, arg_ptr);
while(*p != '\0'){
LL_USART_TransmitData8(USART3,(uint8_t)*p++);
while (LL_USART_IsActiveFlag_TXE(USART3)== RESET);
}
va_end(arg_ptr);
}
void drv_com4_printf(char *fmt, ...)
{
char buffer[50];
char *p = buffer;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, 50, fmt, arg_ptr);
while(*p != '\0'){
LL_USART_TransmitData8(UART4,(uint8_t)*p++);
while (LL_USART_IsActiveFlag_TXE(UART4)== RESET);
}
va_end(arg_ptr);
}
一定要加入头文件stdarg.h