总结stm32的printf相关知识
来源:互联网 发布:讯龙数据恢复 免费 编辑:程序博客网 时间:2024/06/05 21:02
转载自http://bbs.csdn.net/topics/390342482
biyuntian1012:
调试stm32,发现printf无法打印,貌似死在里面了
后来按照网上别人的方法,选上use microLIB选项,确实是可以了,但是为什么呢?
youzi722:
因为printf虽然是C语言的标准函数,但是是针对有stdin, stdout设备的系统的,在嵌入式平台上是没有标准的stdin, stdout的,需要映射到串口后某个输出对象的,而嵌入式平台各不相同,如果又没有操作系统的支持,就只能靠自己实现了,因此STM32下的printf不在标准库里,而在定制的库里。
而且一般在嵌入式平台一般也不用printf,可以自己使用sprintf()函数先将数据格式化到缓冲里,然后数据想输出到哪里就输出到哪里。
ymm198606:
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可以重定向到文件,也可以转向到一些接口设备。
biyuntian1012
多谢楼上各位
是不是这样啊
在没有选择microLIB时,默认printf输出的目的接口并不是串口,此时虽然在code中定义了fputc函数,但printf并没有调用fputc,所以无法从串口输出
选择microLIB选项后,lib库中将printf的输出接口定向到了串口,也就是通过调用fputc函数来输出字符,此时printf就可以正常从串口输出了
youzi722:
差不多是这个意思吧,你也可以自己实现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的功能,网上可以找到很多资料的。
- 总结stm32的printf相关知识
- 关于STM32软硬件兼容性相关的知识
- 操作系统相关知识的总结
- MYSQL的相关知识总结
- 接口的相关知识总结
- 数据库相关知识的总结
- session相关的知识总结
- 进程的相关知识总结
- Servlet相关知识的总结
- 总结数组的相关知识
- STM32 keil printf的使用
- STM32 keil printf的使用
- STM32 printf函数的调用
- STM32 printf的重定向
- STM32 printf函数的调用
- stm32的printf重定向
- STM32存储器 — <2>STM32存储器知识的相关应用(IAP、Bit Banding)
- STM32存储器 — <2>STM32存储器知识的相关应用(IAP、Bit Banding)
- UVa 539 & POJ 2258 - The Settlers of Catan
- leetcode之Jump Game && Jump Game II
- Node.js可以做什么?
- 一个可扩展的php验证类
- Oracle学习笔记安装篇之在Redhat Enterprise Linux 7.0 x86_64下安装Oracle11g R2
- 总结stm32的printf相关知识
- Android下抓包流程
- 开启技术人生
- 黑马程序员_java中的多线程
- IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容
- [设计模式]--创建型模式
- monkey --pkg-whitelist
- xcode环境设置
- hdu4501(多重背包)小明系列故事——买年货