my_printf.h / my_printf.c    



my_printf ist ein, in der Funktionalität reduzierter Ersatz, für die jedem C-Compiler beiliegenden printf-Funktion, und ist speziell für die Benutzung in Verbindung mit Mikrocontrollern gedacht. my_printf macht immer dann Sinn, wenn es darum geht, Flashspeicher zu sparen.
           Die Syntax von my_printf  :  void my_printf(const char *s,...);
           Prototypdeklaration in    :  ../include/my_printf.h
Eine Beschreibung zum originalen printf gibt es hier: https://www.jjflash.de/printf_myprintf.html

Ein vom Standard abweichendes Umwandlungszeichen %k ermöglicht es, Pseudo-Kommazahlen auszugeben.
my_printf benötigt zur Ausgabe irgendwo in den zu einem Programmprojekt gehörenden Dateien (vorzugsweise in der Datei, die die main-Funktion beinhaltet) einer Funktion namens:
           void my_putchar(char ch);
my_printf bedient sich dieser Funktion zur Zeichenausgabe. Soll bspw. ein Programm die Ausgaben auf der seriellen Schnittstelle vornehmen und ist die Software in uart.c eingebunden, dann gibt es dort die Funktion:
           void uart_putchar(char ch);
Um diese Ausgabefunktion nutzen zu können, kann ein einfaches Programm folgendermaßen aussehen:
  
        #include "ch32fun.h"
        #include "ch32v003_gpio.h"
        
        #include "uart.h"
        #include "my_printf.h"
        
        #define  printf      my_printf
        
        /* ----------------------------------------------------------
                                my_putchar
        
             wird von my_printf aufgerufen. Hierauf gibt my_printf
             den Datenstream aus
           ---------------------------------------------------------- */
        void my_putchar(char ch)
        {
          uart_putchar(ch);
        }
        
        int main(void)
        {
          SystemInit();             
        
          uart_init(115200);
          printf("\n\r Hallo Welt \n\r ");
          while(1);
        }    
               
Eine wichtige Zeile im obigen Programm ist:
           #define  printf      my_printf
Mit diesem define wird jede printf-Anweisung auf die eigene abgespeckte Version my_printf umgeleitet.
     Zeichen 
    Datentyp und Darstellung

    %d
    Integer als dezimale Zahl ausgeben (int ist 16-Bit Wert auf einem 8-Bit System, ein 32-Bit Wert auf einem 32-Bit Systemen
    %l
    nur bei printf32.c : 32-Bit Integerwert ausgeben (verfügbar für AVR, STM8 und MCS-51)
    %c
    Ausgabe eines char als (Ascii)-Zeichen
    %k
    (Pseudo-Kommazahl) Integerwert mit eingesetztem Dezimalpunt ausgeben, auf 32-Bit Systemen oder bei my_printf32 als 32-Bit Wert, ansonsten als 16-Bit Wert. Mit dem Wert in der globaler Variable printfkomma wird angegeben, an welcher Position bei der Ausgabe ein Dezimalpunkt eingefügt wird.
    %f
    nur bei my_printf_float.c, Ausgabe eines (float) Gleitkommawertes. Ein Punkt zur Angabe der Nachkommastellen wird interpretiert
    %s
    Zeichenkette (String) ausgeben
    %x
    Integer als hexadezimale Zahl ausgeben
    %%
    Ausgabe des Prozentzeichens


Beispiel:
  
        #include "ch32fun.h"
        #include "ch32v003_gpio.h"
        
        #include "uart.h"
        #include "my_printf.h"
        
        #define  printf      my_printf
        
        /* ----------------------------------------------------------
                                my_putchar
        
             wird von my_printf aufgerufen. Hierauf gibt my_printf
             den Datenstream aus
           ---------------------------------------------------------- */
        void my_putchar(char ch)
        {
          uart_putchar(ch);
        }
        
        int main(void)
        {
          int a, a2, b, c;          
          
          SystemInit();             
          uart_init(115200);
               
          printf("\n\r ASCII-Zeichen '%c' = dezimal %d = hexadezimal 0x%x\n\r", 'M', 'M', 'M');
        
          a= 42; b= 13;
        
          // Variable a um 2 Stellen nach links schieben, um spaeter 
          //2 Nachkommastellen anzeigen zu koennen
          a2= a*100;
          c= a2 / b;
        
          printfkomma= 2;
          printf(" %d / %d = %k", a, b, c);  
          while(1);
        }    
               
Ausgabe:

      ASCII-Zeichen 'M' = dezimal 77 = hexadezimal 0x4D
      42 / 13 = 3.23