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)
        {
                USART_SendData(USART2, (u8) buffer[i++]);
                while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
        }
        va_end(arg_ptr);
}