1. 程式人生 > >STM32多個串列埠printf

STM32多個串列埠printf

網上講的新增printf()到程式中一般都是這樣的(簡要提一下):
1.配置GPIO ,USART,RCC 的Configuration
2.勾選usb micro lib
3.在程式中新增:(標頭檔案需要新增#include <stdio.h>)
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (u8) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 
return ch;

}

很明顯這個方法使用printf()只能輸出到usart1,如果需要使用多個usart呢,肯定不能都是用printf()。
方法如下是繼續是用usart2的printf()功能:
1.配置usart2的串列埠配置,gpio,rcc enable,跟上面類似
2.勾選usb micro lib,跟上面類似
3.新增標頭檔案#include <stdarg.h>,編寫USART2的printf函式:
void USART2_printf (char *fmt, …)
{
char buffer[CMD_BUFFER_LEN+1]; // CMD_BUFFER_LEN長度自己定義吧
u8 i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt); 
vsnprintf(buffer, CMD_BUFFER_LEN+1, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer[i])
{
USART_SendData(USART2, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); 
}
va_end(arg_ptr);
}
用法與printf類似,如int i=123;USART2_printf("%d",i);