2016-10-02 7 views
0

Я использую этот код для Retarget printf(), но он не работаетКак перенаправить printf() на STM32F10x?

#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 */ 
     /* e.g. write a character to the LCD */ 
    lcd_Data_Write((u8)ch); 

     return ch; 
} 

Я использую STM32F103RBT6

Компилятор: GCC с редактором emBitz

+0

Возможно дублирование http://stackoverflow.com/questions/39664071/how-to-make-printf-work-on-stm32f103/ – SamR

+0

Может быть полезно: http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32 –

ответ

1

Tank вы Бенс Kaulics

Я использую tinyprintf библиотеку, и она работала очень хорошо: github link

1

В качестве альтернативы, вы можете написать свою собственную printf() функцию используя Variable Argument Functions (va_list).

С va_list пользовательской функцией печати выглядит следующим образом: например

#include <stdio.h> 
#include <stdarg.h> 
#include <string.h> 

void vprint(const char *fmt, va_list argp) 
{ 
    char string[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); 
} 

Использования:

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); 

Обратите внимание, что в то время как это решение дает удобную функцию для использования, это медленнее, чем отправка сырых данных или использования даже sprintf(). Я использовал это решение как на AVR, так и на микроконтроллерах STM32.

Вы можете дополнительно изменить vprint, как это, где periphery_t является простой enum Тип:

void vprint(periphery_t target, const char *fmt, va_list argp) 
{ 
    char string[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; 
     } 
    } 
} 
2

Попробуйте захватить функцию _write следующим образом:

#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 

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

Я использую этот метод на STM32F072. Подробности здесь. http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/279945#279945 –

 Смежные вопросы

  • Нет связанных вопросов^_^