STM32
直播中

张辉

7年用户 1352经验值
私信 关注
[问答]

怎样使用STM32中的串口去封装printf函数呢

怎样使用STM32中的串口去封装printf函数呢?有哪几种封装方式呢?有哪些注意事项?

回帖(1)

刘云

2021-11-30 09:27:49

  • 在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。



  • 自己封装一个类似 printf 的函数(前提是已经可以实现串口发送了):


#include
#include
#include


uint32_t Uart_strlen ( uint8_t *str )
{
    uint32_t cnt = 0;
        while(str[cnt] != 0)
        {
                cnt++;
        }
        return cnt;
}


void USART_Printf(uint8_t UsartPort,char *fmt, ...)
{
    va_list ap;
    uint8_t databuf[512] = {0};


    va_start(ap, fmt);
        vsprintf((char*)databuf, fmt, ap);
        va_end(ap);
               
        if(UsartPort == 1)
        {
                if(HAL_UART_Transmit_IT(&huart1, databuf, Uart_strlen(databuf))!= HAL_OK)
                {
                        Error_Handler();
                }
                //等待串口1发送完成
                while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
        }
        else if(UsartPort == 2)
        {
                if(HAL_UART_Transmit_IT(&huart2, databuf, Uart_strlen(databuf))!= HAL_OK)
                {
                        Error_Handler();
                }
                //等待串口2发送完成
                while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);
        }
        else
                return;
}
之后就可以在代码里通过USART_Printf函数实现串口打印,需要注意的是:
打印最后需要加上"nr",否则换行会不正常,比如USART_Printf(1, “Hello world ! nr”);


  • 使用标准的printf函数:
    详情可参考这篇博文:STM32上使用printf.
    勾选Use Micro LIB库,包含stdio.h头文件
    采用串口的方式,主要就是重定向printf使用哪一个串口输出。


#include


#ifdef __GNUC__  
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  
#else  
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f)  
#endif /* __GNUC__ */  
   
#ifdef __cplusplus  
extern "C" {  
#endif //__cplusplus  
   
PUTCHAR_PROTOTYPE  
{  
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);  //调用STM32的HAL库,发送一个字节
          return (ch);  
}  
   
#ifdef __cplusplus  
}  
#endif //__cplusplus
接下来就可以直接用printf函数实现打印。

  No pains, no gains.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分