串口重定向printf

KEIL中实现串口重定向

  • uart.c重定向
1
2
3
4
5
6
7

#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印,串口1
return ch;
}
  • 虚拟串口重定向CDC

    修改usbd_cdc_if.c文件

1
2
3
4
5
6
7
8
9
10
#include <stdarg.h> 
void usb_printf(const char *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);
}

在GCC中串口重定向

  • uart.c
1
2
3
4
5
int _write(int fd, char *pBuffer, int size)
{
HAL_UART_Transmit(&huart1, (uint8_t *)pBuffer, size, 0xff);
return size;
}

Makefile中添加float
-u _printf_float

例:# libraries

1
2
3
LIBS = -lc -lm -lnosys 
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -u _printf_float -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections