无论是51还是ARM,都可以在标准输入输出头文件“iostd.h”中找到printf函数; printf函数可以方便的选择输出的内容,包括字符串,甚至是汉字形式的字符串; 当使用printf函数输出字符串的时候,肯定是一个字节一个字节的输出,而fputc和putchar是printf的子函数,就是用来输出一个字节的; fputc是STM32里面的,putchar是51里面的,他们都是printf的子函数; 在vc中,使用printf默认输出到当前输出设备——一般是显示屏;
在单片机里面,可以通过更改putchar函数或fputc函数,自己设定printf输出的方向。
很简单,在单片机里面,只需要对putchar函数做出如下定义: 在STM32里面,需要对fputc函数做出如下定义: 很明显,以上工作都是有芯片库的支持,比如printf函数的搭建,定义printf和putchar函数的关系,把字符串变量转换为单个字节,识别%d,%f……等工作的完成。我们不需要关心这个,只要会调整printf函数的方向就好了。还有一个哥们,说用printf实现OLED屏幕的显示很方便;
我们可以想一下这样的话,需要做什么条件:
1.假如OLED显示屏是SPI或者I2C通信,要在fputc函数中换成响应写一个字节的函数;
2.它的这个OLED屏要有相应的软件或硬件库,把接收到的字符串按照通信标准(ASCII或者其他)转化为字节;
prints是自己写的函数,名字是随便取的; 发送之前我们需要了解,当我们用printf发送字符串的时候,我们发送的实际是什么? 英文字符串,发送的其实是ASCII编码对应的十进制序号;
比如h在ASCII中对应序号为104,那就拿出一个字节,用来发送104;
由于计算机常用16进制表示,所以在串口助手上会显示“68”;
实际上,发送的既不是10进制,也不是16进制,而是104表示成8位的二进制代码,一串01而已; 中文的话,会有另外一种编码机制(UCS2?),但这个不重要,我们只要在串口助手里面写上中文,点击16进制发送,就可以得到中文字节,每个中文占两个字节;
其他和英文字符串没有区别; 使用printf函数,发送的其实是表示字符串的一个个字节,字符串与字节的对应关系就是上面说的,是固定的。 每次发送字符串,发送的都是字符串的表示字节;
字符串和表示字节之间有转化规则,我们不用知道是什么规则,用指针发送就省去了这个规则——无论什么规则,转化成什么字节,我都可以通过指针寻址找到这些字节,并发送。 比如,我写发送:
prints(“hello world”); 执行的是:
其中,“hello world”字符串,作为输入参数,说明字符串其实表示的这个字符串的首地址! 自己写的字符串打印程序,只能输出字符串,不能处理%d,%f等,不能随意设定输出的格式。