STM32多串口共用printf打印串口数据

在此声明:文章可以转载,必须注明出处!(文章已被转载多次,但是写的是原创,令我很是生气)
(1)问题描述:
多串口共用printf函数,百度到的资料大部分是建议重新写一个xx_printf(format, …)。但是使用起来还是不方便,就此问题而言加上一个判断语句便可解决。
(2)解决方法:
printf函数最后调用的是int fputc(int ch, FILE *f),那么重新改写此函数便可。
(3)代码:

//标志量定义
int USART_PRINTF_FLAG = 2;//默认串口2

//改写fputc
int fputc(int ch, FILE *f)
{
	if (USART_PRINTF_FLAG == 2)
	{
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
		USART_SendData(USART2,(uint8_t)ch);
	}
	else
	{
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
		USART_SendData(USART1,(uint8_t)ch);
	}
	
	return ch;
}

//中断处理
void USART1_IRQHandler(void)
{
	USART_PRINTF_FLAG = 1;
	//your coding here...
}

void USART2_IRQHandler(void)
{
	USART_PRINTF_FLAG = 2;
	//your coding here...
}
  • 26
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
当多个串口同时使用printf时,可以使用以下方法: 1. 对每个串口分别定义一个printf函数,例如:printf1、printf2等。 2. 在每个串口的初始化函数中,将stdout重定向到对应的串口。 3. 在代码中使用对应的printf函数,例如使用printf1输出到串口1。 以下是一个简单的示例代码,使用两个串口同时输出: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include "stm32f4xx.h" #include "usart.h" // 重定向stdout函数 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } // 重定向printf1函数 int printf1(const char *format, ...) { int len; va_list args; va_start(args, format); len = vfprintf(stdout, format, args); va_end(args); return len; } // 重定向printf2函数 int printf2(const char *format, ...) { int len; va_list args; va_start(args, format); len = vfprintf(stderr, format, args); va_end(args); return len; } int main(void) { // 初始化两个串口 USART1_Init(); USART2_Init(); // 重定向stdout到串口1 stdout = &USART1_Stream; // 重定向stderr到串口2 stderr = &USART2_Stream; // 输出到串口1 printf1("Hello, USART1!\r\n"); // 输出到串口2 printf2("Hello, USART2!\r\n"); while (1) { } } ``` 在这个例子中,我们定义了两个串口printf函数,分别为printf1和printf2。在初始化函数中,我们将stdout重定向到串口1,将stderr重定向到串口2。然后我们就可以使用printf1和printf2函数来分别输出到不同的串口了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值