51单片机中为什么很少出现 printf 的身影?是用不了吗?
不是的,51单片机可以用 printf,只是不建议使用。
平时我们在操作系统上写C语言代码,使用 printf 可以把数据写到标准输出流:
#includeint main() { printf("helloworld "); return 0; }
然后在屏幕上就能看到它的输出。
但是51单片机属于裸机开发,没有所谓的标准输出流,他能跟外部交互的,只有串口。
51单片机用的开发语言是C语言,虽然跟标准C有点区别,但是 printf 函数还是可以用的,只要修改 printf 的输出方式,让他从串口输出,也能在电脑上看到输出信息。
printf 函数把数据格式化后,最终调用 putchar 函数把数据写出,所以我们要做的,就是实现 putchar 函数。
int putchar(char c) { SBUF = ch; // 将数据发送到SBUF寄存器 while (!TI); // 等待发送完成 TI = 0; // 清除发送中断标志 return c; }
这些操作都跟串口相关,不去详细介绍。
使用的时候,包含 stdio.h 头文件,语法跟我们以前使用的一样。
那为什么不建议在 51 单片机中使用 printf,有这么几个原因。
首先 printf 实现起来比较复杂,要考虑到多种输出格式,还要额外开辟存储空间。
51单片机资源和性能都有限,使用 printf 开销比较大。
其次,51 编译器对 printf 的处理,跟我们经常使用的也有差距。
比如定义一个 char 类型的变量,初始化成 0x01,使用 %u 输出,虽然类型不一样,应该不影响它输出 1。
void main() { unsigned char num1 = 0x01; printf("%u", num1); }
实际上结果是 256,一个字节的 char 类型,转换成两个字节的 int,前面补0,由于 51 是大端存储,输出的时候反了。
void main() { unsigned char num1 = 0x01; unsigned char num2 = 0x02; printf("%u%u", num1, num2); }
再比如两个 char 类型,一个 0x01 一个 0x02,同时输出的话,第二个变量变成了 0。编译器对参数入栈的处理也不太一样。
基于种种原因,在 51 中很少用 printf,调试的话,可以借助开发工具,也可以使用一些日志相关的库,都比 printf 要好用。
-
51单片机
+关注
关注
274文章
5702浏览量
123476 -
函数
+关注
关注
3文章
4327浏览量
62567 -
Printf
+关注
关注
0文章
83浏览量
13647
原文标题:51单片机为什么不用printf
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论