zoukankan      html  css  js  c++  java
  • 单片机工程加入printf函数

    转载自:http://blog.csdn.net/xfeng88/article/details/6695848

    在嵌入式开发中,常常会通过串口打印一些信息到PC终端,这就需要实现自己的printf函数,下面介绍打印函数print的实现。


    print.h

     1 #ifndef     __PRINT_H_
     2 #define    __PRINT_H_
     3 
     4 void    print(char* fmt, ...);
     5 void    printch(char ch);
     6 void    printdec(int dec);
     7 void    printflt(double flt);
     8 void    printbin(int bin);
     9 void    printhex(int hex);
    10 void    printstr(char* str);
    11 
    12 #define console_print(ch)    putchar(ch)
    13 
    14 #endif    /*#ifndef __PRINT_H_*/

    上面print函数为全功能的打印函数,可以实现类似printf的功能,printch实现单个字符的打印、printdec实现十进制格式数字的打印,printflt实现浮点数的打印,printbin实现二进制格式数字的打印,printhex实现十六进制格式数字的打印,printstr实现字符串的打印,console_print函数是串口单字符打印函数的宏定义,这里暂时用PC终端单字符打印函数putchar代替。在实际嵌入式环境下,替换成串口单字符打印函数即可。


    print.c

      1 #include <stdio.h>
      2 #include <stdarg.h>
      3 #include "print.h"
      4 
      5 int main(void)
      6 {
      7     print("print: %c
    ", 'c');
      8     print("print %d
    ", 1234567);
      9     print("print: %f
    ", 1234567.1234567);
     10     print("print: %s
    ", "string test");
     11     print("print: %b
    ", 0x12345ff);
     12     print("print: %x
    ", 0xabcdef);
     13     print("print: %%
    ");
     14     return 0;
     15 }
     16 
     17 void    print(char* fmt, ...)
     18 {
     19     double vargflt = 0;
     20     int  vargint = 0;
     21     char* vargpch = NULL;
     22     char vargch = 0;
     23     char* pfmt = NULL;
     24     va_list vp;
     25 
     26     va_start(vp, fmt);
     27     pfmt = fmt;
     28 
     29     while(*pfmt)
     30     {
     31         if(*pfmt == '%')
     32         {
     33             switch(*(++pfmt))
     34             {
     35                 
     36                 case 'c':
     37                     vargch = va_arg(vp, int); 
     38                     /*    va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
     39                         mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
     40                     printch(vargch);
     41                     break;
     42                 case 'd':
     43                 case 'i':
     44                     vargint = va_arg(vp, int);
     45                     printdec(vargint);
     46                     break;
     47                 case 'f':
     48                     vargflt = va_arg(vp, double);
     49                     /*    va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
     50                         mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
     51                     printflt(vargflt);
     52                     break;
     53                 case 's':
     54                     vargpch = va_arg(vp, char*);
     55                     printstr(vargpch);
     56                     break;
     57                 case 'b':
     58                 case 'B':
     59                     vargint = va_arg(vp, int);
     60                     printbin(vargint);
     61                     break;
     62                 case 'x':
     63                 case 'X':
     64                     vargint = va_arg(vp, int);
     65                     printhex(vargint);
     66                     break;
     67                 case '%':
     68                     printch('%');
     69                     break;
     70                 default:
     71                     break;
     72             }
     73             pfmt++;
     74         }
     75         else
     76         {
     77             printch(*pfmt++);
     78         }
     79     }
     80     va_end(vp);
     81 }
     82 
     83 void    printch(char ch)
     84 {
     85     console_print(ch);
     86 }
     87 
     88 void    printdec(int dec)
     89 {
     90     if(dec==0)
     91     {
     92         return;
     93     }
     94     printdec(dec/10);
     95     printch( (char)(dec%10 + '0'));
     96 }
     97 
     98 void    printflt(double flt)
     99 {
    100     int icnt = 0;
    101     int tmpint = 0;
    102     
    103     tmpint = (int)flt;
    104     printdec(tmpint);
    105     printch('.');
    106     flt = flt - tmpint;
    107     tmpint = (int)(flt * 1000000);
    108     printdec(tmpint);
    109 }
    110 
    111 void    printstr(char* str)
    112 {
    113     while(*str)
    114     {
    115         printch(*str++);
    116     }
    117 }
    118 
    119 void    printbin(int bin)
    120 {
    121     if(bin == 0)
    122     {
    123         printstr("0b");
    124         return;
    125     }
    126     printbin(bin/2);
    127     printch( (char)(bin%2 + '0'));
    128 }
    129 
    130 void    printhex(int hex)
    131 {
    132     if(hex==0)
    133     {
    134         printstr("0x");
    135         return;
    136     }
    137     printhex(hex/16);
    138     if(hex < 10)
    139     {
    140         printch((char)(hex%16 + '0'));
    141     }
    142     else
    143     {
    144         printch((char)(hex%16 - 10 + 'a' ));
    145     }
    146 }
  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/codecamel/p/4686437.html
Copyright © 2011-2022 走看看