STM32 单个或者多个串口重定向 HAL库 CUBEMAX 解决方案

有关于STM32单片机中,单个或者多个串口输出分别重定向的解决方案

注:这只是作者根据自己的一些浅薄见解得到的一个解决方案,并不是唯一,但是作者本身觉得很不错,而且很方便,适用于所有单片机的串口重定向。

注:觉得好的请一键三连,转发请附上来源。

先上代码:

#include "stdio.h"
#include "string.h"

#define HUART1 1	// 串口1开关
#define HUART2 1	// 串口2开关
#define HUART3 1	// 串口3开关

#define BUFF 512
static char HUART_BUFF[BUFF];

#if HUART1
#define printf(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf(FORMAT,...)
#endif

#if HUART2
#define printf2(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart2,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf2(FORMAT,...)
#endif

#if HUART3
#define printf3(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart3,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf3(FORMAT,...)
#endif

并不是特别复杂的内容,不过考虑到一些新手的使用上的方便,还是讲一下,不然可能会用不起来哈哈哈哈。

有关于移植性的考虑

首先考虑到移植的方便性,用了:

#if
#else
#endif

这样的形式进行包装,方便通过最上面的三个宏定义直接一键关闭某个串口,而不需要考虑太多,任何程序中都可以拿去就用。

有关于调试程序的方便性考虑

非常巧妙的,当关掉某个串口的输出时,已经写好的printf的代码不需要删除,只是关掉的那个串口不会输出了而已。
因此,我们可以将一个串口专门作为代码的调试输出,更甚至是同一个串口进行调试,只需要略作修改即可,调试时输出的内容,可以随时进行关闭,极大的方便了调试。
就比如这样:

#include "stdio.h"
#include "string.h"

#define HUART1 1	// 串口1开关
#define DEBUG_Switch 1	// 串口1调试信息输出开关

#define BUFF 512
static char HUART_BUFF[BUFF];

#if HUART1
#define printf(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf(FORMAT,...)
#endif

#if DEBUG_Switch 
#define APP_DEBUG(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define APP_DEBUG(FORMAT,...)
#endif

在上面的代码中,我们只使用了串口1,但是可以重定向两个输出方式,另外,从代码可见,为0的时候,我将它宏定义为空了。
我们可以将调试信息在不需要的时候,随时关闭。

有关于个性化自定义输出的考虑

通过改变每个宏定义中的printf,你可以将它变成任何的东西,put,print,等等……都可以。
其他好像就没啥了。

最后:不要忘了一键三连哦!嘿嘿。

版权声明:本文为CSDN博主「水水不水啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Undertheabyss/article/details/121324702

有关于STM32单片机中,单个或者多个串口输出分别重定向的解决方案

注:这只是作者根据自己的一些浅薄见解得到的一个解决方案,并不是唯一,但是作者本身觉得很不错,而且很方便,适用于所有单片机的串口重定向。

注:觉得好的请一键三连,转发请附上来源。

先上代码:

#include "stdio.h"
#include "string.h"

#define HUART1 1	// 串口1开关
#define HUART2 1	// 串口2开关
#define HUART3 1	// 串口3开关

#define BUFF 512
static char HUART_BUFF[BUFF];

#if HUART1
#define printf(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf(FORMAT,...)
#endif

#if HUART2
#define printf2(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart2,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf2(FORMAT,...)
#endif

#if HUART3
#define printf3(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart3,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf3(FORMAT,...)
#endif

并不是特别复杂的内容,不过考虑到一些新手的使用上的方便,还是讲一下,不然可能会用不起来哈哈哈哈。

有关于移植性的考虑

首先考虑到移植的方便性,用了:

#if
#else
#endif

这样的形式进行包装,方便通过最上面的三个宏定义直接一键关闭某个串口,而不需要考虑太多,任何程序中都可以拿去就用。

有关于调试程序的方便性考虑

非常巧妙的,当关掉某个串口的输出时,已经写好的printf的代码不需要删除,只是关掉的那个串口不会输出了而已。
因此,我们可以将一个串口专门作为代码的调试输出,更甚至是同一个串口进行调试,只需要略作修改即可,调试时输出的内容,可以随时进行关闭,极大的方便了调试。
就比如这样:

#include "stdio.h"
#include "string.h"

#define HUART1 1	// 串口1开关
#define DEBUG_Switch 1	// 串口1调试信息输出开关

#define BUFF 512
static char HUART_BUFF[BUFF];

#if HUART1
#define printf(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define printf(FORMAT,...)
#endif

#if DEBUG_Switch 
#define APP_DEBUG(FORMAT,...) \
{\
    memset(HUART_BUFF, 0, BUFF);\
    sprintf(HUART_BUFF,FORMAT,##__VA_ARGS__); \
	HAL_UART_Transmit(&huart1,(uint8_t *)HUART_BUFF,strlen(HUART_BUFF), 1);\
}
#else
#define APP_DEBUG(FORMAT,...)
#endif

在上面的代码中,我们只使用了串口1,但是可以重定向两个输出方式,另外,从代码可见,为0的时候,我将它宏定义为空了。
我们可以将调试信息在不需要的时候,随时关闭。

有关于个性化自定义输出的考虑

通过改变每个宏定义中的printf,你可以将它变成任何的东西,put,print,等等……都可以。
其他好像就没啥了。

最后:不要忘了一键三连哦!嘿嘿。

版权声明:本文为CSDN博主「水水不水啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Undertheabyss/article/details/121324702

生成海报
点赞 0

水水不水啊

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32 C++编程系列一:STM32 C++编程介绍

一、STM32及其他单片机开发现状 在目前绝大部分的单片机开发当中,C语言占据着主流的地位,但由于C语言本身是一种面向过程的语言,因此在当前利用面向对象思想构建可复用代码为主流的今天显得比较麻烦&#x

六种电平转换的优缺点

作为一名电子设计的硬件工程师,电平转换是每个人都必须面对的的话题,主芯片引脚使用的1.2V、1.8V、3.3V等,连接外部接口芯片使用的1.8V、3.3V、5V等,由于电平不匹配就必须进行

OV7670摄像头模块资料

OV7670摄像头模块资料 一、实物图和原理图 二、模块简介 OV7670 是 OV( OmniVision)公司生产的 CMOS VGA 图像传感器。该传感器体积小、工作电压低,提供单片 VGA