当前位置: 首页 > news >正文

【STM32 HAL】多串口printf重定向

【STM32 HAL】多串口printf重定向

  • 前言
  • 单串口printf重定向
    • 原理
    • 实现
      • CubeMX配置
      • Keil5配置
  • 多串口printf重定向

前言

在近期项目中,作者需要 STM32 同时向上位机和手机发送数据,传统的 printf 重定向只能输出到一个串口。本文介绍如何实现 printf 同时输出到多个串口

单串口printf重定向

原理

为了使用 printf() 函数进行数据交互,需要重定向 fputc() 函数
这是 printf 内部调用的函数,默认是 __weak 弱定义,便于我们重写

实现

CubeMX配置

与轮询模式配置一致
注意: 中断和 DMA 模式可能导致数据异常,需谨慎使用
在这里插入图片描述

Keil5配置

  1. 勾选 “Use MicroLIB”
  2. 添加头文件stdio.h
  3. 重写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,轻松实现数据发送到不同的串口了!!!

http://www.lryc.cn/news/428973.html

相关文章:

  • 帆软报表,达梦数据库驱动上传失败
  • CSS选择器的优先级是如何确定的?有哪些方法可以提高选择器的效率?
  • 【MySQL】基础入门(第二篇)
  • 勇闯机器学习(第二关-数据集使用)
  • 数据库学习(进阶)
  • redis的数据结构——跳表(Skiplist)
  • Docker服务迁移
  • 机器学习:逻辑回归实现下采样和过采样
  • React原理之Fiber双缓冲
  • 机器学习笔记三-检测异常值
  • 如何评估Redis的性能
  • RabbitMQ发布订阅模式Publish/Subscribe详解
  • Android8.1源码下对APK进行系统签名
  • 2024年城市客运安全员考试题库及答案
  • 全网最全面的Nginx内容(理论与实践相结合)
  • (七)Flink Watermark
  • springboot 上传文件失败:The temporary upload location
  • UNiapp之微信小程序导出Excel
  • fsadsadsad
  • 高效录制新选择:2024年Windows录屏软件
  • Java技术面试(一面)
  • docker修改数据目录
  • Appium学习
  • 回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注
  • libLZMA库iOS18平台编译
  • 《AI办公类工具PPT系列之二——iSlide AI》
  • C语言基础(六)
  • 什么是词向量?如何得到词向量?Embedding 快速解读
  • AI视频创作应用
  • JAVA常见的工具类之Object类(超详细)