STM32使用HAL串口封装printf

  • 在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。
  1. 自己封装一个类似 printf 的函数(前提是已经可以实现串口发送了):
#include <string.h>
#include <stdio.h>
#include <stdarg.h>

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函数实现串口打印,需要注意的是:
打印最后需要加上"\n\r",否则换行会不正常,比如USART_Printf(1, “Hello world ! \n\r”);

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

#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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值