本文主要是介绍【STM32 HAL】多串口printf重定向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【STM32 HAL】多串口printf重定向
- 前言
- 单串口printf重定向
- 原理
- 实现
- CubeMX配置
- Keil5配置
- 多串口printf重定向
前言
在近期项目中,作者需要 STM32 同时向上位机和手机发送数据,传统的 printf 重定向只能输出到一个串口。本文介绍如何实现 printf 同时输出到多个串口
单串口printf重定向
原理
为了使用 printf() 函数进行数据交互,需要重定向 fputc() 函数
这是 printf 内部调用的函数,默认是 __weak 弱定义,便于我们重写
实现
CubeMX配置
与轮询模式配置一致
注意: 中断和 DMA 模式可能导致数据异常,需谨慎使用
Keil5配置
- 勾选 “Use MicroLIB”
- 添加头文件stdio.h
- 重写fputc()函数
int fputc(int ch,FILE *f)
{uint8_t temp[1] = {ch};HAL_UART_Transmit(&huart1,temp,1,2);// 根据实际情况配置return ch;
}
最后,你就能调用 printf() 函数了!!!
多串口printf重定向
fput重定向
int fputc(int ch,FILE *f){uint8_t temp[1] = {ch};HAL_UART_Transmit(current_huart,temp,1,2);return ch;
}
my_usart.c中定义
UART_HandleTypeDef *current_huart = &huart1;
my_usart.h中宏定义
// 定义宏来简化 printf 切换和输出
#define PRINTF_PC(...) do { \current_huart = &huart1; \printf(__VA_ARGS__); \
} while(0)#define PRINTF_HC05(...) do { \current_huart = &huart2; \printf(__VA_ARGS__); \
} while(0)
详解:
- ‘…’ 是可变参数宏,表示可接收任意参数
- ‘VA_ARGS’ 会替换为宏调用时传入的实际参数
- do { … } while(0) 结构确保宏展开后总是作为完整语句执行
- ‘ \ ’是续行符,用于表示宏定义还未结束
在主循环函数中测试
void loop(void)
{PRINTF_PC("PC_TEST\n");PRINTF_HC05("HC05_TEST\n");HAL_Delay(1000);
}
从此,你就可以使用 PRINTF_PC 和 PRINTF_HC05,轻松实现数据发送到不同的串口了!!!
这篇关于【STM32 HAL】多串口printf重定向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!