首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于stm32的printf,该怎么解决

2013-01-26 
关于stm32的printf昨天调试stm32,发现printf无法打印,貌似死在里面了后来按照网上别人的方法,选上use micr

关于stm32的printf
昨天调试stm32,发现printf无法打印,貌似死在里面了
后来按照网上别人的方法,选上use microLIB选项,确实是可以了,但是为什么呢?
[解决办法]
因为printf虽然是C语言的标准函数,但是是针对有stdin, stdout设备的系统的,在嵌入式平台上是没有标准的stdin, stdout的,需要映射到串口后某个输出对象的,而嵌入式平台各不相同,如果又没有操作系统的支持,就只能靠自己实现了,因此STM32下的printf不在标准库里,而在定制的库里。

而且一般在嵌入式平台一般也不用printf,可以自己使用sprintf()函数先将数据格式化到缓冲里,然后数据想输出到哪里就输出到哪里。
[解决办法]

1. C语言是没有I/O的语言 
    C语言本身就是没有I/O能力的语言(毕竟C语言是高级语言嘛),是依靠函数模块来完成的。如printf()就是一个I/O函数,在编译时,编译器并不编译printf()函数,而把他留在链接(link)阶段由链接器来处理。

    这样做的优点是: 提高了C编译器的可移植性。因为I/O与计算机的硬件关系密切,如果C语言本身具备I/O能力,那么在不同的计算机上,编译器就会因为I/O的差异而必须重新设计。如果把I/O功能从编译器中分离出来成为独立的函数,那么编译器就不必因为硬件的变化而修改,只需修改函数模块即可。并且I/O函数模块是单独存在的,因而修改工作大为简化。 


2. I/O转向的概念 
        在设计程序时,必须指定数据的输入来源(如键盘),以及数据处理完毕后的输出目的地(如文件,打印机),所以必须在程序中指定输入/输入设备后才能运行。可是指定了某个输入/输入设备后,如果再想换由其他设备输入/输出,则必须要修改源程序,重新进行编译、链接。为了避免这个缺点,C语言提供的I/O的重定向能力。 
         C语言将键盘与屏幕叫做标准I/O(Standard Input/Output, STDIO),凡是以标准I/O作为输入/输出的程序,均可重定向改由其他文件或设备做输入/输出。所以我们在编写程序时,可先用标准I/O作为输入/输出对象,等到真正运行时,再重定向到真正需要输入/输出的文件。这样就可避免在编写程序时设置输入/输出的文件名,当需要更改时又返回到程序进行修改的烦恼了。 
        大多数操作系统如Linux,Unix及MS DOS都具有I/O重定向的能力,在这些系统上运行程序(不仅限于C程序),都可以使用I/O重定向。许多操作系统把设备视为一个文件,所以I/O可以重定向到文件,也可以转向到一些接口设备。 
[解决办法]
差不多是这个意思吧,你也可以自己实现printf的功能,代码类似下面

#define    TPRINTF_BUF_SIZE    1024
char tprintf_buf[TPRINTF_BUF_SIZE];

int tprintf(const char *_format, ...)
{
    va_list ap;
    int len, i;
    char *pchars;
    
    va_start(ap, _format);
    len = vsnprintf(tprintf_buf, TRINTF_BUF_SIZE, _format, ap);
    va_end(ap);
    pchars = tprintf_buf;
    for(i=0; i<len; i++)
    {
        fputc(*pchars++);
    }
}

这样你就可以自己决定输出到哪里了,当然,如果需要的话,你也可以自己实现类似vsnprintf的功能,网上可以找到很多资料的。

热点排行