起因
无聊摸鱼,突然看到一个进度条一样。我就想到了这个进度条是怎么实现的呢?我们下载软件,下载插件,下载东西,编译的时候都可能会出现tty终端的进度条。我就好奇了,cmd和shell那些终端这个命令行不应该是输出一行的吗?就像我串口打印出来的东西,不可能把我已经输出的东西,在显示端删掉啊,在重新打印一边的,肯定就是换行处理了,这个不换行又覆盖打印是怎么做到的呢?
区别
我们一般进行调试,有232也有串口进行对MCU、MPU、ARM-A板子的串口调试,这个时候,处理器是直接使用串口打印的,就是把串口缓冲区立马的数据输出出来,发送给我,而我在把他显示出来,因为,显示肯定是不能丢失接收数据和信息,所以,就会全部打印,换行打印。所以来一条打印一下,显示一条符合要求和调试。
这里就有一个误区了,因为我们使用tty的时候,还没输出出去哦!
这个什么意思呢?意思就是我们这个系统还没对外输出而是内部操作,此时tty不是一个串口输出的过程,而是,直接读取一个缓冲区内部的数据。没错,tty就是一个缓冲区,它不是日志系统,不会记录所有操作,记录操作是其他功能做的,它就是一个缓冲区,也就是说,我们做的一大堆操作,其实都是在缓冲区里进行的操作,此时都没对外输出,当然可以覆盖自己缓冲区数据,然后tty显示这个缓冲区数据。当然,其他的打印和日志系统就会把每个操作,每个情况,每个数据都记录下来啊。
实现
此时直接使用回车就可以,清空本行,重新覆盖输出了,就可以实现进度条的操作了。
这里还有一点就是回车和换行,回车是\r 换行是\n;
我们在学c语言的时候,肯定打印函数和输入函数也即是scanf和printf这两里面用了很多换行,也经常会发现他们两个的效果是很相似。这是因为发送完毕,换行会直接清空缓冲区,而回车是回到首行开头,这个就有点文件io的光标的味道了,缓冲区清空了,这个时候回车肯定就是原地蹦一下而已嘛。
1 |
|
总结
tty终端不是日志系统,它是一个收发缓冲区,它显示的内容是它缓冲区的内容,此时都没对外输出,所以它不会显示所有情况、数据、消息,只会显示缓冲区里有东西。此时,想要覆盖上一次的结果,echo就不要换行 -ne 此时直接回车到开头,然后清空本行,输出就好了,这个是只能在终端才能实现的哦。如果使用那种rt-thread那种FinSH控制台,这个就是串口输出啦,就是对外输出了,此时修改缓冲区是亡羊补牢了,因为缓冲区的数据已经被打印出来了,自然在显示端就会出现换行,而且无法覆盖上一行的操作,也无法实现进度条了捏,呜呜呜。