实现自己的myprintf

stm32自定义printf,使用DMA打印 1、初始化的时候初始化DMA和DMA发送完成中断,串口中断 我用的是STM32G031G8U6,所以用的是串口2,为什么要串口中断。是因为DMA发送完成中断的回调函数UART_DMATransmitCplt,已经在底层定义好。并不是定义为弱函数给用户重新定义。在DMA发送完成中断中,会触发串口发送完成中断TC, 串口发送完成中断的回调函数是给用户用的 2、定义一个全局变量用来指示DMA发送完成,初值为1表示发送完成 并且包含stdarg.h 文件 3、定义myprintf int myprintf 阅读详情

最近看《C和指针》,里面讲到了可变参数如下图,所以就想自己实现一个myprintf

 

下面是实现的简单的myprintf.h

#include <stdarg.h>

#define NULL 0

va_list args;

char sign[] = { '0','1','2','3','4','5',
                '6','7','8','9','a','b',
                'c','d','e','f'};

void print_int( int num, int mode, int flag )
{
    if( num == 0 )
    {
        if( flag == 0 )
	{
	    putchar( '0' );
	    return;
	}
	else
	{
            return;
	}
    }

    print_int( num/mode, mode, 1 );
    
    putchar( sign[ num%mode ]  );
}

void print_str( char const *str )
{
    if( str == NULL )
    {
        return;
    }

    while( *str != '\0' )
    {
        putchar( *str );
	    str++;
    }
}


void print_float( float num )
{
    int part = num/1;

    print_int( part, 10, 0 );

    putchar( '.' );

    part=num*1000000-part*1000000;

    print_int( part, 10, 0 );
}

void check_type( char type )
{
    switch( type )
    {
        case 'd':
	{
	    int num = va_arg( args, int );

	    if( num < 0  )
	    {
	        putchar('-');
            num = num * (-1);
	    }

	    print_int( num, 10, 0 );
	    break;
	}

	case 'c':
	{
	    char ch = (char)va_arg( args, int );
	    putchar( ch );
	    break;
	}

	case 's':
	{
	    char *str = va_arg( args, char * );
	    print_str( str );
	    break;
	}

	case 'f':
	{
	    float num = (float)va_arg( args, double );

	    if( num < 0  )
	    {
	        putchar('-');
	    	num = num * (-1);
	    }

	    print_float( num );
	    break;
	}

	case 'p':
	{
	    int num = va_arg( args, int );
	    putchar( '0' );
	    putchar( 'x' );
        print_int( num, 16, 0 );
	    break;
	}

	default:
	{
	    putchar( '%' );
	    putchar( type );
	}
	       
    }
}

void myprintf( const char *format, ... )
{
    if( format == NULL )
    {
        return;
    }
    
    va_start( args, format );
    
    while( *format != '\0' )
    {
        while( *format != '%' && *format != '\0' )
	    {
	        putchar( *format );
            format++;	    
	    }

	if( *format != '\0' )
	{
	    format++;

	    if( *format != '\0' )
	    {
	        check_type( *format );
            format++;
	    }
	    else
	    {
	        putchar( *(format-1) );
	    }
	}
    }

    va_end( args );
}


把myprintf定义成用来调试代码的函数

debug.h

#include "myprintf.h"

#ifndef __DEBUG__
#define debug_msg(fmt, args...)
#else
#define debug_msg(fmt, args...) myprintf(fmt, ##args)
#endif


下面写个例子简单测试下

myprintf_test.c

#include "debug.h"

int main()
{
    int num = -5;
    char ch = 'a';
    char *str = "abcdef";
    char *ptr = NULL;
    float min = 0.1415926;
    
    printf("printf效果:\n\n");
    printf("num=%d,\\ch=%c,str=%s,\nmin=%f,str_addr=%p,ptr_addr=%p \
          \n",num,ch,str,min,str,ptr);
    
    myprintf("\nmyprintf的效果:\n\n");
    debug_msg("%%%num=%d,\\ch=%c,str=%s,\nmin=%f,str_addr=%p,ptr_addr=%p \
    \n%",num,ch,str,min,str,ptr);

    myprintf("\n");

    return 0;
}


运行一下

不知道为什么自带的printf不支持多个%%%的输出,转义也不行

 

SDK中打印函数my_printf()实现 APT UART, 串口打印 阅读详情

相关推荐

创建一个myprintf函数实现中断打印

参考视频 stm32 生成模板,建立环境 建立一个F030C8T6 添加串口1 并enable中断 打开FREERTOS 并加入两个任务 一个信号量 上图是加入的任务 上图是加入的信号量 生成模板 添加一个函数 添加myuart.c函数在src中 #include "main.h" #include "cmsis_os.h" #include "stdio.h" #include "

shenchen2010的博客 394

【嵌入式C语言】可变参数 va_start、va_arg、va_end、va_list、stdarg.h 库详解

可变参数详解 printf( )是我们在编程中避不开的函数,之前我们研究了printf( )的实现原理,初步了解了printf( )函数在库中是借用putchar( )来进行实现输出的,但是还有一个问题我们上一篇文章没有解决,那就是printf( )中的可变参数是怎么实现的呢,如何去使用可变参数完成我们自己的输出函数呢? 让我们再来看一眼printf( )的长相,在stdio.h文件中他是这样声明的 int printf(const char *format, ...) printf( )中分为两种参数,

物联网从你我开始 4103

制作一个简单的操作系统9

探索如何实现一个自定义的 printf 函数来处理任意 %d 和 %s 组合这样参数传递:(最多支持5个参数,按顺序匹配)在 C 语言编程中,`printf` 函数是一个非常常用的输出函数,它可以根据格式字符串输出不同类型的数据。然而,有时候能需要实现一个自定义的 `printf` 函数来满足特定的需求,比如处理任意 `%d` 和 `%s` 的组合。本文将详细介绍如何实现这样一个自定义的 `myprintf` 函数。

文石_2009的博客 174

继续sprintf函数,这次亲自动手写了一个myprintf,是不是更有意思了,当然别指望我的代码没有bug。

#include &lt;stdio.h&gt; typedef char *va_list; #define __va_rounded_size(TYPE) \ (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int)) #define va_start(AP, LASTARG) \ (AP=((char *)&amp;(LASTARG...

weixin_39410618的博客 761

延迟相乘叠加求和 DMAS (Field II 仿真代码)

(Delay Multiply and Sum, DMAS)算法,最初是为雷达微波系统设计的,研究者们对 DMAS 波束合成方法进行了修改,并应用超声成像。结果表明,DMAS 波束合成在模拟和实验中的表现都优于传统的延时叠加(Delay and Sum, DAS),这种新方法带来的主要改进是对比度分辨率明显提高(即主瓣和侧瓣更窄),从而增加了动态范围,提高了 B 型超声图像质量。与传统 DAS 相似,DMAS 算法通过对来自超声换能器阵元的信号应用几何计算延迟来聚焦接收到的波束。

weixin_38452364的博客 3083

Maxwell涡流热损计算:铜导体在50Hz交流下的仿真实践

本文详细介绍了使用Maxwell软件进行铜导体在50Hz交流条件下的涡流热损仿真实践。从涡流热损的基本概念到Maxwell仿真设置、网格划分、结果后处理等关键步骤,提供了实用技巧和常见问题解决方案,帮助工程师准确计算涡流热损,优化电力设备设计。

weixin_42526015的博客 389

printf实现

这是我看之前公司的旧代码摘录下来的, 感觉写的还算可以吧,

自学嵌入式 566

Unity集成阿里Qwen2.5-Omni全模态大模型实战:语音交互与多模态AI开发指南

本文详细介绍了在Unity中集成阿里Qwen2.5-Omni全模态大模型的实战指南。通过C#脚本开发,实现语音交互、图像分析等多模态AI功能,涵盖API调用、音频处理、流式响应解析等核心步骤,为游戏、虚拟人等Unity应用提供沉浸式智能交互解决方案。

weixin_29005499的博客 315

自己实现myprintf函数

#include #include void printint(int dec) { if(0 == dec) { return; } printint(dec / 10); putchar(dec % 10 + '0'); } void printstr(char *str) { while(*str) {

zheng_guan的博客 5063

别再手动调参了!用MATLAB+改进PSO算法,5步搞定机械臂轨迹优化(附完整代码)

本文介绍如何利用MATLAB和改进PSO算法快速优化机械臂轨迹规划,仅需5步即可完成传统耗时的手动调参过程。通过混沌初始化、自适应权重等创新方法,改进PSO算法显著提升优化效率,实现全局最优解搜索,适用于工业自动化中的机械臂控制。文章包含完整MATLAB代码实现,帮助工程师轻松应用于实际生产场景。

weixin_29232121的博客 353

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5621

函数和宏实现打印的增强myprintf

函数和宏实现打印的增强 转载于:https://www.cnblogs.com/LiuYanYGZ/p/11239063.html

weixin_30399871的博客 133

2026AI漫剧放心大胆做!小白也能轻松出片(附保姆级教程)

要是在2025,我大概率会劝他再等等,毕竟那时工具还没这么顺手。但到了2026年的今天,我的回答得很干脆:放心去做,绝对没问题。这一年多来,AI漫剧这块的变化真可谓翻天覆地。过去你想拍个像样的短片,哪怕再简陋,也得凑齐拍摄设备、找场地、找演员,后期剪辑更是折磨。但现在,时代变了,AI已经把创作的门槛踏平了。你不需要请演员,也不用操心灯光布景,更不用为剪辑特效烧钱。一个人,一台电脑,花几天时间就能做一部完整的AI漫剧。你只要有有想表达的故事,突发的灵感,剩下的,都能直接交给AI落地。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 430

可变参数问题以及实现简单的myprintf

1.该博客把v http://blog.youkuaiyun.com/hackbuteer1/article/details/7558979

JackyLau的专栏 753

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1262

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 547

可变参数问题(以及Myprintf函数的实现)

#include //可变参数头文件 例如: 1.int Max_list(int a,...)//参数有好多怎么办? {  va_list list;  int max = a;  int cur = a;  va_start(list,a);//没关系,指针来解决;打开指针,list是指向下一个参数的指针,a是第一个参数的指针  while(cur >=0

qq_39750835的博客 370

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

完整实现printf -支持整型,字符,字符串,有符号,十六进制,单精度双精度浮点数打印...

myprintf头文件 1 /**************************************************************************** 2 File name: myprintf.h 3 Author: 4 Version: 5 Description: 格...

489

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

给一个大佬的C/C++不定参数实现的注释版本

如有问题请联系博主。

未来就在脚下。 93

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【C语言】之实现 printf 函数功能

/*********************************************** * 文件名: myPrintf.c * 文件功能: 使用putchar函数模拟printf函数的功能 * 编辑人: 王廷云 * 编辑时间: 2017-10-14 * 修改时间: 2018-1-12 ***********************************************...

王廷云的博客 1万+

用C语言的可变参函数实现一个简单的printf函数

文章出处:http://www.cnblogs.com/phinecos/archive/2007/08/24/868524.html #include "stdio.h" #include "stdlib.h" #include void myprintf(char* fmt, ) //一个简单的类似于printf的实现,//参数必须都是int 类型 { //

韦编二绝 3409

可变参数的函数,myprintf,itoa

1、可变参数          头文件 stdarg;类型 va_list;           宏 va_start 到达可变参数的起始位置。初始化va_list类型的变量,使其指向可变参数列表的头(即第1个可变参数)。例:va_start(ap, str);           宏 va_arg 获取可变参数,当遇到一个结束标志时停止处理。返回一个可变长度参数的值,并使va_list类型

trb331617的博客 335

编写myprintf

 #include #include #include void printInt(int data) {  int q=data/10;  if(q!=0)  {   printInt(q);  }  putchar(data%10+'0'); } int myprintf(const char *format,...) {  assert(format);

qq_36534818的博客 1085

不使用man 3 printf的函数,实现一个简单的printf函数

题目:不使用man printf中的函数,实现一个简易的输出函数myprintf。 函数声明:int myprintf(const char *format,...); 要求该函数可以识别(只需要识别)出format字符串中的%ld,%lf,%c,%s这四个转义字符,并转化成相应的参数。 说明:man printf中的函数即:printf, fprintf, sprintf, snpri

小豪之家 2014

c语言自定义函数多个参数,printf是如何实现可变参数的?自定义函数能否实现参数可变?【C语言】...

序在我们使用C语言的printf和scanf函数时,是否有好奇过它到底是怎么实现参数任意多的呢?(开始以为是系统自带的,有无小伙伴一起的2333)好奇心驱使下,终于了解到具体的实现方法接下来就一起一步一步揭秘吧 ohhh!!# 首先进行比较简单的可变参数自定义函数代码先挂上:#include#includevoid myPrintf(int n, ...){int i;va_list val;va...

weixin_34433661的博客 1092
上一篇: shell学习资料:shell十三问
下一篇: 实现自己的mystring.h
zhouxf_cn
博客等级 码龄14年 54粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值