- 在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。
- 自己封装一个类似 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”);
- 使用标准的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.