• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

嵌入式C语言中printf函数

luohaiyang 2018-08-08 浏览量:1442
大佬们,嵌入式C语言中怎么把printf的输出端口设置成串口。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • printf输出到串口,需要将fputc里面的输出指向串口(重定向)方法如下:
    #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 USART */
    USART_SendData(USART1 (uint8_t) ch);
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1 USART_FLAG_TC) == RESET);
    return ch;
    }
    因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行以下是解决方法:
    方法1.使用微库因为使用微库的话不会使用半主机模式.
    方法2.仍然使用标准库在主程序添加下面代码:
    #pragma import(__use_no_semihosting) 
    _sys_exit(int x) 

    x = x; 

    struct __FILE 

    int handle; 
    /* Whatever you require here. If the only file you are using is */ 
    /* standard output using printf() for debugging no file handling */ 
    /* is required. */ 
    }; 
    /* FILE is typedef’ d in stdio.h. */ 
    FILE __stdout;
    如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB;
    • 发布于 2018-08-08
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:13
  • STM32的microlib有一段代码可以重映射printf到串口的,参考https://blog.csdn.net/qq_29344757/article/details/75363639
    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 1
    • 0

  • 这需要你自己改printf函数 可以在原函数上改 也可以自己定义一个函数

    具体做法就是把串口的函数放到printf里

    • 发布于2018-08-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 嵌入式中其实尽量不要用printf,因为太耗费资源啦。

    此外其实你应该用fprintf,这个可以设定输出句柄,你把输出句柄连接到串口就行了。

    • 发布于2018-08-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 要自己实现输出串口的接口函数,调时时就会从串口发出了
    • 发布于2018-08-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 你需要程序确定这个PRINTF定到具体串口才能用
    • 发布于2018-08-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 第一步,#inlcude "stdio.h"            
    第二步,在主函数文件中重写fputc()和fgetc()函数,如下: 
    int fputc (intchFILE*f) 
      {    
              while(!(USART1->SR & USART_FLAG_TXE)); 
             USART1->DR =(ch & 0x1FF); 
            return (ch);} 
    int fgetc (FILE* f)  
    {    
           while (!(USART1->SR& USART_FLAG_RXNE));   
            return((int)(USART1->DR &0x1FF)); 

    }  

    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个可以在MDK的配置里面勾选microLIB,然后定向到哪个具体的串口配置一下就可以进行输出
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 原子的教程里面对这个有详细的介绍,建议参考一下原子的串口打印输出这一章节
    • 发布于2018-08-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 直接用重定向函数,调用的时候会自己把你的串口重定向
    • 发布于2018-08-28
    • 举报
    • 评论 0
    • 0
    • 0

  • printf是通过fputc函数进行重定义的,fputc里面的内容是操作串口发送函数的话就是调用串口。
    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 首先你需要重定义一遍函数功能

    然后重定向到IO

    然后写入新的向量表

    • 发布于2018-09-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

嵌入式C语言中printf函数