文章

串口重定向

在单片机的串口输出中,只能通过单字节发送或者字符串发送,这对调试的输出不太方便,如果我们能使用像C语言printf函数来输出就会方便很多。

标准的stdio.h中对于printf函数的输出是有固定方向(显示器)的,如果需要输出到串口,就需要对它进行重定向处理。

32位单片机的printf函数是调用了fputc函数,8位单片机为putchar函数。

重定向fputc函数代码为:

1
2
3
4
5
6
7
#include <stdio.h>

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

重定向putchar函数代码为:

1
2
3
4
5
6
7
#include <stdio.h>

char putchar(char c)
{
	SendByte(c);
	return c;
}

如果是多个串口都想要像printf一样的功能,需要包括头文件#include <stdarg.h>,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义一个类似于printf的函数
void my_printf(const char *format, ...)
{
    char buffer[256]; // 用于存储格式化后的字符串

    // 使用标准C库函数vsnprintf将可变参数列表格式化为字符串,并存储到buffer中
    va_list args;
    va_start(args, format);
    vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);

    // 调用HAL_UART_Transmit函数将buffer中的字符串发送出去
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
本文由作者按照 CC BY 4.0 进行授权