单片机通过如何发送字符串?

关于printf的知识很零碎,感觉成体系的总结有点麻烦,这里就用列出的方法。

  1. printf 与 fputc、putchar…的关系

    无论是51还是ARM,都可以在标准输入输出头文件“iostd.h”中找到printf函数;

    printf函数可以方便的选择输出的内容,包括字符串,甚至是汉字形式的字符串;

    当使用printf函数输出字符串的时候,肯定是一个字节一个字节的输出,而fputc和putchar是printf的子函数,就是用来输出一个字节的;

    fputc是STM32里面的,putchar是51里面的,他们都是printf的子函数;

    在vc中,使用printf默认输出到当前输出设备——一般是显示屏;
    在单片机里面,可以通过更改putchar函数或fputc函数,自己设定printf输出的方向。

  2. 通过串口实现高级打印函数printf

    很简单,在单片机里面,只需要对putchar函数做出如下定义:

    单片机通过如何发送字符串?_第1张图片

    在STM32里面,需要对fputc函数做出如下定义:

    单片机通过如何发送字符串?_第2张图片

    很明显,以上工作都是有芯片库的支持,比如printf函数的搭建,定义printf和putchar函数的关系,把字符串变量转换为单个字节,识别%d,%f……等工作的完成。我们不需要关心这个,只要会调整printf函数的方向就好了。

    还有一个哥们,说用printf实现OLED屏幕的显示很方便;

    我们可以想一下这样的话,需要做什么条件:
    1.假如OLED显示屏是SPI或者I2C通信,要在fputc函数中换成响应写一个字节的函数;
    2.它的这个OLED屏要有相应的软件或硬件库,把接收到的字符串按照通信标准(ASCII或者其他)转化为字节;

  3. 自己写串口打印程序prints

    prints是自己写的函数,名字是随便取的;

    发送之前我们需要了解,当我们用printf发送字符串的时候,我们发送的实际是什么?

    英文字符串,发送的其实是ASCII编码对应的十进制序号;
    比如h在ASCII中对应序号为104,那就拿出一个字节,用来发送104;
    由于计算机常用16进制表示,所以在串口助手上会显示“68”;
    实际上,发送的既不是10进制,也不是16进制,而是104表示成8位的二进制代码,一串01而已;

    中文的话,会有另外一种编码机制(UCS2?),但这个不重要,我们只要在串口助手里面写上中文,点击16进制发送,就可以得到中文字节,每个中文占两个字节;
    其他和英文字符串没有区别;

    使用printf函数,发送的其实是表示字符串的一个个字节,字符串与字节的对应关系就是上面说的,是固定的。

    单片机通过如何发送字符串?_第3张图片

    每次发送字符串,发送的都是字符串的表示字节
    字符串和表示字节之间有转化规则,我们不用知道是什么规则,用指针发送就省去了这个规则——无论什么规则,转化成什么字节,我都可以通过指针寻址找到这些字节,并发送。

    比如,我写发送:
    prints(“hello world”);

    执行的是:
    单片机通过如何发送字符串?_第4张图片

    其中,“hello world”字符串,作为输入参数,说明字符串其实表示的这个字符串的首地址

    自己写的字符串打印程序,只能输出字符串,不能处理%d,%f等,不能随意设定输出的格式。

你可能感兴趣的:(单片机通过如何发送字符串?)