精华内容
下载资源
问答
  • 关于printf重定向到串口的问题简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosTIng(半主机模式),标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用...

    关于printf重定向到串口的问题

    简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosTIng(半主机模式),

    标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数。

    例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:

    e61214aff80c46f82a3c4528289cb4fe.png

    #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;今天参考了一下论坛,使用微库可以很好的解决这个问题。

    2.另一种方法:(其实大同小异)

    需要添加以下代码

    (论坛里应该有完整介绍这个的帖子,但是我没搜到,也许是沉了。)

    #pragma import(__use_no_semihosting)

    /******************************************************************************

    *标准库需要的支持函数

    ******************************************************************************/

    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;

    /// 《summary》

    /// 定义_sys_exit()以避免使用半主机模式

    /// 《/summary》

    /// 《param name=“x”》《/param》

    /// 《returns》《/returns》

    _sys_exit(int x)

    {

    x = x;

    }

    int fputc(int ch, FILE *f)

    {

    //USART_SendData(USART1, (u8) ch);

    USART1-》DR = (u8) ch;

    /* Loop until the end of transmission */

    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

    {

    }

    return ch;

    }

    semihosting的作用,介绍如下

    Semihosting is a mechanism for ARM targets to communicate input/output requests

    from application code to a host computer running a debugger. This mechanism could be

    used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.

    This is useful because development hardware often does not have all the input and

    output facilities of the final system. Semihosting allows the host computer to provide these facilities.

    Semihosting is implemented by a set of defined software interrupt (SWI) operations.

    The application invokes the appropriate SWI and the debug agent then handles the SWI

    exception. The debug agent provides the required communication with the host.

    In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.

    按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机自己的,也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf()等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。

    用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。

    以上仅为个人理解,如有错误请指正。

    另外,勾选microlib之后,也许编译的时候就不把开启semihosting的文件包进去了,所以没事。

    C库函数重定向:

    用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如下图所示。

    举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。

    下面是实现fputc()重定向的一个例子:

    externvoidsendchar(char*ch);

    intfputc(intch,FILE*f)

    {/*e.g.writeacharactertoanUART*/

    chartempch=ch;

    sendchar(&tempch);

    returnch;

    这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是个另外定义的串口输出函数。在这里,fputc()就似乎目标硬件和标准C库函数之间的一个抽象层。

    STM32中关于串口通信的printf函数重定向问题

    在STM32串口通信程序中使用printf()函数发送数据非常方便,但是需要先进行简单的配置,下面介绍两种配置方法。

    方法一、对工程属性进行配置

    第1步:在main.c中包含“stdio.h” (标准输入输出头文件);

    第2步:在main.c文件中重定义fput()这个C标准库函数(因为printf()在C标准库函数中实质上是一个宏,要调用到fputc()这个函数);

    5c5eadf790f29c14dbdc81f9de9c9894.png

    第3步:在工程属性的”Target“ -》 ”Code Generation“ 选项中勾选”Use MicroLIB“;

    a4e2b86d07113ab873ead6b97877c98e.png

    方法二:在工程中添加“regtarge.c”文件

    第1步:在main.c文件中包含”stdio.h”文件;

    第2步:在工程中创建一个文件保存为“regtarge.c”,然后将其添加到工程中;

    c9ea916afea313dd83fc961142ddc94a.png

    第3步:在main文件中添加定义以下两个函数

    3ebca6ef6bc79a7750cf1f4cf52aa926.png

    至此完成配置,可以在main.c文件中随意调用printf() 。

    展开全文
  • 关于printf重定向到串口

    千次阅读 2016-03-19 18:31:57
    根据搜索,printf函数输出stdout,而fprintf可以指定字符到达的文件。可FILE结构体中,没有一个是与串口相关的。 typedef struct {  char *fpos; /* Current position of file pointer (absolute ...
    我在某个CortextM3的源码里的debug.c找到了fputc。应该说,某些系统是通过fputc建立联系,而不是putchar的。如下:
    
    <span style="font-family:Verdana;font-size:14px;">void fputc_hook(char ch)
    {
        if (DebugType == 0)
        {
            UARTWriteByte(ch, 1000);
        }
        else
        {
            VirtualUartWrite(ch);
        }
    }
    
    int fputc(int ch, FILE *f)
    {
        uint8 dgbBuffer[DEBUG_TIME_LEN];
        uint32 tmpcnt, i;
    
        if (ch == '\n')
        {        
            tmpcnt = SysTickCounter;
            for (i = 0; i < DEBUG_TIME_LEN; i++)
            {
                dgbBuffer[i] = tmpcnt % 10;
                tmpcnt = tmpcnt / 10;
            }
            
            fputc_hook('\r');
            fputc_hook('\n');
            fputc_hook('[');
            for (i = 0; i < DEBUG_TIME_LEN; i++)
            {
                fputc_hook(dgbBuffer[DEBUG_TIME_LEN - 1 -i]+0x30);
                if (DEBUG_TIME_LEN - 1 -i == 2)
                {
                    fputc_hook('.');
                }
            }
            fputc_hook(']');
            
            return OK;
        }
        
        fputc_hook(ch);
    
        return OK;
    }
    </span>

    下面是参考文章的转载:

    http://blog.chinaunix.net/uid-27631233-id-3345008.html

        在实际工作中,遇到了这么一个问题,需要向不同的串口传输ASCII码,无疑使用printf函数是最方便的。然而printf打印出的信息无法选择出口。在网上搜到的程序,printf要调用fputc函数发送字符。该函数如下:


    int fputc(int ch, FILE *f)

    {

      /* 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函数输出到stdout,而fprintf可以指定字符到达的文件。可FILE结构体中,没有一个是与串口相关的。


    typedef struct {

      char *fpos; /* Current position of file pointer (absolute address) */

      void *base; /* Pointer to the base of the file */

      unsigned short handle; /* File handle */

      short flags; /* Flags (see FileFlags) */

      short unget; /* 1-byte buffer for ungetc (b15=1 if non-empty) */

      unsigned long alloc; /* Number of currently allocated bytes for the file */

      unsigned short buffincrement; /* Number of bytes allocated at once */

    } FILE;


        该如何重定向呢?不知道。但有一个弥补的方法。

        自己定义n个FILE*指针,并任意赋值。在fputc中利用if..else来做判断,代码如下:


    FILE* FileUart1 = (FILE*)0x19;

    FILE* FileUart2 = (FILE*)0x28;

    int fputc(int ch, FILE *f) {

      if ( f == FileUart1 ) {

        USART_SendData(COM_USART[0], (uint8_t) ch);

        while (USART_GetFlagStatus(COM_USART[0], USART_FLAG_TC) == RESET){}

      }

      else if ( f == FileUart2 ) {

        USART_SendData(COM_USART[1], (uint8_t) ch);

        while (USART_GetFlagStatus(COM_USART[1], USART_FLAG_TC) == RESET){}

      }

    }


        这样,fprintf(FileUart1,...)和fprintf(FileUart2,...)便能向不同的串口发送数据。哈哈,虽然没有真正做到重定向,只是用了个歪招,但最初的目的还是达到了。

        如果哪位牛人能告知如何真正重定向,感激感激~~~~


        还要请问,如何使用__DEBUG__宏定义才能使fprintf("val is %d", val)或fprintf("val1 is %d, val2 is %d", val1, val2)在程序中任意被编译上或编译掉。当然,不包括#ifdef..#endif方法。不这么做就是为了代码清晰一些,便于阅读。谢谢啊~~
    展开全文
  • 一、MDK中使用printf出问题的原因 二、解决方法 1、使用微库 2、添加代码 三、Semihosting的作用介绍 四、ARM调用printf()总结 --------------------------------------------------------------------------------...
    目录:
    一、MDK中使用printf出问题的原因
    二、解决方法
    1、使用微库
    2、添加代码
    三、Semihosting的作用介绍
    四、ARM调用printf()总结
    -------------------------------------------------------------------------------------------------------------------
    一、MDK中使用printf出问题的原因
    如在MDK中使用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是电脑显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数。
    例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: 
    #ifdef __GNUC__ 
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 
    #else 
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) 
    #endif 

    PUTCHAR_PROTOTYPE 

     USART_SendData(USART1, (uint8_t) ch); 
     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 
     return ch; 
    -------------------------------------------------------------------------------------------------------------------
    二、解决方法
    因为printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法: 
    1、使用微库
    因为使用微库的话,不会使用半主机模式。
    MDK在工程属性的“Target“-》”Code Generation“中勾选” Use MicroLIB。 
    -----------------------------------------------------------
    2、添加代码
    在MDK中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式)。

    #pragma import(__use_no_semihosting)

    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;

    // 定义_sys_exit()以避免使用半主机模式   

    _sys_exit(int x)

    {

      x = x;

    }

    //定义了“stdio.h”文件,下面的语句不需要

    int fputc(int ch, FILE *f)

    {

        //USART_SendData(USART1, (u8) ch);

        USART1->DR = (u8) ch;

        

        // Loop until the end of transmission

        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

        {

        }

        return ch;

    }

    -------------------------------------------------------------------------------------------------------------------

    三、Semihosting的作用介绍
    Semihosting is a mechanism for ARM targets to communicate input/output requests  from application code to a host computer running a debugger. This mechanism could be  used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.  
    This is useful because development hardware often does not have all the input and  output facilities of the final system. Semihosting allows the host computer to provide these facilities.  
    Semihosting is implemented by a set of defined software interrupt (SWI) operations.  
    The application invokes the appropriate SWI and the debug agent then handles the SWI  exception. The debug agent provides the required communication with the host.  
    In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.  
    按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机, 也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf( )等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。 用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。 

    另外,勾选microlib之后,也许编译的时候就不把开启Semihosting的文件包进去了,所以没事。
    C库函数重定向: 用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数。 
    举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。 
    下面是实现fputc()重定向的一个例子: 
    extern void sendchar(char*ch); 
    intfputc(intch,FILE*f) 
    { 
        chartempch=ch;
        sendchar(&tempch);
        returnch;
    } 
    这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是个另外定义的串口输出函数。在这里,fputc()就似乎是目标硬件和标准C库函数之间的一个抽象层。
    第二个问题,路径:D:\Keil3.80\ARM\Examples\ST\STM32F10xFWLib\Examples
     
    -------------------------------------------------------------------------------------------------------------------
    四、ARM调用printf()总结
    为了实现ARM能调用输出函数,把fputc重新定向到ARM的串口了(在标准C库中printf 和scanf是被默认定向到电脑显示器的),禁止使用半主机模式,就是在Link的时候不调用标准C库的函数,但是可能由于在自己的子C文件中用到了某个函数,又没有重定义,它就会去标准库里调用,这样就造成了矛盾,一边禁止使用半主机模式,一边去C库里调用函数,或者如下例中输出到了USART3中, 实际是需要输出到USART1,所以会输出死机。
    STM32关于printf重定向到串口
     
    执行printf就会出错,如下:
    STM32关于printf重定向到串口
     
    -------------------------------------------------------------------------------------------------------------------
    展开全文
  • 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机... 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANCE, s...
    简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 
    
    标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 
    例如: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;今天参考了一下论坛,使用微库可以很好的解决这个问题。 
    2.另一种方法:(其实大同小异)   
    需要添加以下代码  
    (论坛里应该有完整介绍这个的帖子,但是我没搜到,也许是沉了。) 
    #pragma import(__use_no_semihosting)   
    /******************************************************************************   
    *标准库需要的支持函数   
    ******************************************************************************/   
    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;  
    /// <summary>   
    /// 定义_sys_exit()以避免使用半主机模式   
    /// </summary>   
    /// <param name="x"></param>   
    /// <returns></returns>   
    _sys_exit(int x)   
    {   
    x = x;   
    }  
     
    int fputc(int ch, FILE *f)  
    {  
        //USART_SendData(USART1, (u8) ch);  
        USART1->DR = (u8) ch;  
          
        /* Loop until the end of transmission */  
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) 
        {  
        } 
        return ch;  
    }  
    semihosting的作用,介绍如下  
    Semihosting is a mechanism for ARM targets to communicate input/output requests  
    from application code to a host computer running a debugger. This mechanism could be  
    used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.  
    This is useful because development hardware often does not have all the input and  
    output facilities of the final system. Semihosting allows the host computer to provide these facilities.  
    Semihosting is implemented by a set of defined software interrupt (SWI) operations.  
    The application invokes the appropriate SWI and the debug agent then handles the SWI  
    exception. The debug agent provides the required communication with the host.  
    In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library.  
     按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机自己的,也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf()等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。 
    用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。 
    以上仅为个人理解,如有错误请指正。 


    另外,勾选microlib之后,也许编译的时候就不把开启semihosting的文件包进去了,所以没事。
    C库函数重定向: 
    用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如下图所示。 
    举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。 
    下面是实现fputc()重定向的一个例子: 
    externvoidsendchar(char*ch); 
    intfputc(intch,FILE*f) 
    {/*e.g.writeacharactertoanUART*/ 
    chartempch=ch; 
    sendchar(&tempch); 
    returnch; 
    } 
    这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是个另外定义的串口输出函数。在这里,fputc()就似乎目标硬件和标准C库函数之间的一个抽象层。
     
    第二个问题,路径:D:\Keil3.80\ARM\Examples\ST\STM32F10xFWLib\Examples
    展开全文
  • 重定向就是将标准输出函数的出口指向串口,自定义一个int fputc(int c, FILE *stream)将形参的c变量通过串口发送即完成printf重定向...//将c赋给串口1的DR寄存器,即printf重定向到串口1。 while(!__HAL_UART_GET_F...
  • STM32中printf重定向到串口

    千次阅读 2016-10-12 10:04:50
    STM32中printf重定向到串口    学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数   总是有些不放便,...
  • 这时候如果可以将printf重定向到串口输出,则能很好的解决这个问题。 关于printf重定向的方法有很多种,这里只讨论一种我认为相对简单实用的方法。其主要方法步骤如下: 1、配置STM32的串口,确保STM32能输
  • PC机上,printf输出显示设备,在嵌入式linux系统,一般利用printf输出调试信息,需要重定向到串口。以AT91RM9200为例,简要说明如何利用串口输出printf的打印信息。 在u-boot传递给内核(kernel)的参数中,有...
  • 20,8 +20,20 @@ /* Includes ------------------------------------------------------------------*/ #include "usart.h" +#include /* USER CODE BEGIN 0 */ +//增加printf重定向到串口 +#ifdef __GNUC__ +#define...
  • 文章目录 在main.c中添加下面的代码 ...int fputc(int ch, FILE *f) //STM8 printf函数重定向 { while ( (USART2->SR&0x80) == 0 ); USART2->DR = (uint8_t)ch; return ch; } ...
  • 在usart.h中加入 #include "stdio.h" 在usart.c中加入如下函数 int fputc(int ch,FILE *p) //函数默认的,在使用printf函数...就将printf()的输出重定向到串口1了。 但发现打印不出来信息,以为代码有问题检查半天。结
  • IAR STM32——printf重定向到串口

    千次阅读 2019-12-17 14:52:41
    printf函数在底层是用fputc实现的,可以实现fputc将数据打印到串口。 1. 代码实现 int fputc(int ch, FILE *f) { /* Write a character to the USART */ USART_SendData8(USART2, ch); // 发送数据 /* Loop ...
  • http://www.stmcu.org.cn/module/forum/thread-603791-1-1.html
  • 在main.c或者uart.c加上: #include “stdio.h” #ifdef GNUC #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f) #endif PUTCHAR_PROTOTYPE ...
  • 一、前言 ...若需要printf输出到串口,则需要将fputc里面的输出指向串口,这一过程称为重定向。 1.标准库(重定向到USARTx,代码中为USART1) int fputc(int ch,FILE *p) { USART_SendDate(US...
  • Stm32F407用串口输出printf的内容
  • stm32用printf函数重定向到串口USART1发现第一个字符没打印出来具体如下: 刚开始修改fputc函数如下: int fputc(int ch,FILE *f) { USART_SendData(USART1,(uint8_t)ch); while(USART_GetFlagStatus(USART1, ...
  • 效果 keil5工程设置,这一步很重要: 在任意的源文件里重写int fputc(int ch, FILE* f)函数 代码: ...#ifndef __PRINT_H__ ...#define PUT_USART 0x01 // 串口输出 #define PUT_LCD1_44 0x02 // 输出Lcd1.44屏幕
  • STM32CubeIDE之printf重定向串口(USART)输出浮点型数据的修改 STM32CubeIDE Version: 1.0.2 Build: 3566_20190716-0927 (UTC) OS: Windows 10, v.10.0, x86_64 / win32 Java version: 1.8.0_202 板卡:NUCLEO-F...
  • printf重定向,在STM32的IAR环境下的printf重定向实例程序
  • STM32CubeIDE之printf重定向串口(USART)输出浮点型数据的修改 stm32CubeIde里想要实现printf重定向时不能像MDK中那样操作。这里记录一下。 方式一 #include "stdio.h" /* USER CODE END Includes */ /* ...
  • printf重定向

    千次阅读 2021-04-16 03:57:56
    一、printf重定向简介 c语言中printf函数默认输出设备是显示器,如果实现在串口或者LCD上显示,必须重定义标准库函数里面调用的输出设备定义的相关函数。 如:使用printf输出到串口,需要将fputc里面的输出指向...
  • STM32CubeIDE之printf重定向串口(USART)输出浮点型数据的修改(可行) STM32CubeIDE Version: 1.5 printf重定向 首先你得配置好串口的各项变量(这里不再赘述) 用的是USART2 贴入以下代码 不要忘记stdio.h ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,055
精华内容 1,622
关键字:

关于printf重定向到串口