Comment recibler printf () sur un STM32F10x?

J’utilise ce code pour retarget printf() , mais cela ne fonctionne pas

 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* eg write a character to the LCD */ lcd_Data_Write((u8)ch); return ch; } 

J’utilise STM32F103RBT6

compilateur: GCC avec emBitz editor

Essayez de détourner la fonction _write comme ceci:

 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 int _write(int file, char *ptr, int len) { switch (file) { case STDOUT_FILENO: /*stdout*/ // Send the ssortingng somewhere break; case STDERR_FILENO: /* stderr */ // Send the ssortingng somewhere break; default: return -1; } return len; } 

Alternativement, vous pouvez écrire votre propre fonction printf() utilisant, Fonctions d’argument variable (va_list) .

Avec va_list une fonction d’impression personnalisée se présente comme suit:

 #include  #include  #include  void vprint(const char *fmt, va_list argp) { char ssortingng[200]; if(0 < vsprintf(string,fmt,argp)) // build string { HAL_UART_Transmit(&huart1, (uint8_t*)string, strlen(string), 0xffffff); // send message via UART } } void my_printf(const char *fmt, ...) // custom printf() function { va_list argp; va_start(argp, fmt); vprint(target, fmt, argp); va_end(argp); } 

Exemple d'utilisation:

 uint16_t year = 2016; uint8_t month = 10; uint8_t day = 02; char* date = "date"; // "Today's date: 2015-12-18" my_printf("Today's %s: %d-%d-%d\r\n", date, year, month, day); 

Notez que bien que cette solution vous permette d'utiliser des fonctions pratiques, elle est plus lente que l'envoi de données brutes ou l'utilisation même de sprintf() . J'ai utilisé cette solution à la fois sur les microcontrôleurs AVR et STM32.

Vous pouvez encore modifier le vprint comme ceci, où periphery_t est un type simple enum :

 void vprint(periphery_t target, const char *fmt, va_list argp) { char ssortingng[200]; if(0 < vsprintf(string,fmt,argp)) { switch(target) { case PC: PC_send_str(string); break; case GSM: GSM_send_str(string); break; case LCD: LCD_print_str(string); break; default: LCD_print_str(string); break; } } } 

Tank vous Bence Kaulics

J’utilise la bibliothèque tinyprintf et cela a très bien fonctionné: github link