【嵌入式 · 单片机 · STM32 · C51】多串口共用printf

一、代码

#include "stdarg.h"
#include "string.h"

void Usart_printf(USART_TypeDef *USARTx, char *fmt, ...)
{
    
    
    static unsigned char Usartx_TxBuff[200];
	unsigned int i, length;

	va_list ap; //va_list 可变参数列表,存参数地址

	va_start(ap, fmt); //获取可变参数地址 fmt地址赋给ap

	/*使用参数列表发送格式化输出到字符串,函数功能将可变参数格式化输出到一个字符数组*/
	vsprintf((char *)Usartx_TxBuff, fmt, ap); //fmt中内容赋给Usart3_TxBuff

	va_end(ap); //清空参数列表

	length = strlen((const char *)Usartx_TxBuff);
	while ((USARTx->SR & 0X40) == 0)
		;
	for (i = 0; i < length; i++)
	{
    
    
		USARTx->DR = Usartx_TxBuff[i];
		while ((USARTx->SR & 0X40) == 0)
			;
	}
}

调用

// 使用前记得初始化相应的串口
Usart_printf(USART1, "Hello CloudSir!");

二、移植到其他平台

移植到其他单片机只需要更改串口发送函数即可。

#include "stdarg.h"
#include "string.h"

void Usart_printf(int USARTx, char *fmt, ...)
{
    
    
    static unsigned char Usartx_TxBuff[200];
	unsigned int i, length;

	va_list ap; //va_list 可变参数列表,存参数地址

	va_start(ap, fmt); //获取可变参数地址 fmt地址赋给ap

	/*使用参数列表发送格式化输出到字符串,函数功能将可变参数格式化输出到一个字符数组*/
	vsprintf((char *)Usartx_TxBuff, fmt, ap); //fmt中内容赋给Usart3_TxBuff

	va_end(ap); //清空参数列表

	length = strlen((const char *)Usartx_TxBuff);
	
    // 此时,Usartx_TxBuff 是要发送的字符串,length是字符串的长度
    // 在这里写串口发送代码,和判断串口号的逻辑代码
    
}

示例:移植到51单片机

#include "stdarg.h"
#include "string.h"

void Usart_printf(int USARTx, char *fmt, ...)
{
    
    
    static unsigned char Usartx_TxBuff[200];
	unsigned int i, length;

	va_list ap; //va_list 可变参数列表,存参数地址

	va_start(ap, fmt); //获取可变参数地址 fmt地址赋给ap

	/*使用参数列表发送格式化输出到字符串,函数功能将可变参数格式化输出到一个字符数组*/
	vsprintf((char *)Usartx_TxBuff, fmt, ap); //fmt中内容赋给Usart3_TxBuff

	va_end(ap); //清空参数列表

	length = strlen((const char *)Usartx_TxBuff);
	
    // 此时,Usartx_TxBuff 是要发送的字符串,length是字符串的长度
    // 在这里写串口发送代码,和判断串口号的逻辑代码
    if(USARTx == 1)
    {
    
     // 如果是串口1,调用串口1的发送代码
        for (i = 0; i < length; i++)
        {
    
    
            SBUF = Usartx_TxBuff[i];
            while(!TI);//等待发送完毕
            TI = 0;
        }
    } 
    else if(USARTx == 2)
    {
    
     // 如果是串口2
        // 51只有一个串口,这里只是做一个示范
    }

}

调用

Usart_printf(1, "Hello CloudSir!");

致正在学习嵌入式的小伙伴们:
嵌入式的学习是要基础知识 + 动手实践同步进行的,在这里给大家推荐一个可以系统学习嵌入式和刷题的网站:牛客网(传送门:牛客网)。

在这里插入图片描述

牛客网原本是一个刷 IT 题库的网站,经过多年的发展,已经成为了一个集 课程+刷题+面经+求职+讨论区分享 的一站式求职学习网站,最最最重要的里面的资源全部免费, 而最近他们正打算将这套模式推广到嵌入式行业,专门为嵌入式工程师开设了相应的板块,正在学习嵌入式、寻找嵌入式专项题库、想要找嵌入式相关工作但又缺乏经验的小伙伴们,千万不要错过(链接在下面哦)!

猜你喜欢

转载自blog.csdn.net/qq_34802028/article/details/124741221