switch 语句中缓存刷新问题如何解决?

switch 语句中缓存刷新问题如何解决?

1、switch 语句中缓存刷新问题?

1.适用范围
在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个 printf 就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在  print(); 后加上 fflush(stdout);  强制马上输出,避免错误。

2.原理概述

2.1问题描述

当一个任务往消息队列中发送一帧数据后,在另一个线程中读取数据并进入 Switch 进行判断,发现第一帧数据没有获取到,只有第二针数据发过来后,第一帧数据才能打印信息。

2.2解决描述

经排查发现并不是消息队列存在问题,而是再 Switch 判断语句中 printf 函数中提前写了 \n 换行符导致提前刷新了缓冲区,印后后面的信息就没有打印。将打印的换行符 \n 写到语句最后面或者在 printf 函数下面添加函数 fflush 刷新函数即可。
当 printf 读进字符串的时候,并不会马上打印,而是先储存在 buff 里面,当遇到下面 4 种条件的时候才进行刷新打印:
1、程序结束 return 0;  或  exit(0);
2、遇到 "\n"
3、主动刷新  fflush(stdout);
4、缓冲区满。

3.解决方法

3.1 换行符 \n

如果需要输出前打印 \n,可在输出信息后追加一个 \n 来刷新当前的缓存进行数据输出。如果不需要提前打印换行符,则只需要再
出信息后打印一个换行符 \n 即可。


3.2 fflush 刷新缓存

第二种方式则是采用 fflush 刷新当前的缓存来将未打印的信息刷新出来:
在这里插入图片描述

4.fflush 函数说明

4.1函数定义

int fflush __P((FILE *));

4.2函数说明

fflush()会强迫将缓冲区内的数据写回参数指定的文件中.,如果参数为 NULL ,fflush() 会将所有打开的文件数据更新。

4.3其他用法

fflush() 也可用于标准输入 (stdin) 和标准输出 (stdout) ,用来清空标准输入输出缓冲区。
stdin 是 standard input 的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。
stdout 是 standard output  的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。

4.4函数功能

清空标准输出缓冲区,刷新输出缓冲区,即将缓冲区的东西输出到屏幕上
如果圆括号里是已写打开的文件的指针,则将输出缓冲区的内容写入该指针指向的文件,否则清除输出缓冲区。
这里的 stdout 是系统定义的标准输出文件指针,默认情况下指屏幕,那就是把缓冲区的内容写到屏幕上。

    • Related Articles

    • IDE 中如何刷新所有文件的索引

      问:在使用3.8.3版本的 IDE 的过程中,发现如果在头文件 a.h 中定义结构体或宏后,有其他源文件 b.c 需要间接包含该头文件使用该结构体或宏时,使用 CTRL+ 右键跟踪该结构体成员或宏跟踪不到,但是编译又不会报错,IDE 中如何刷新所有文件的索引? 可以使用下图所示方法,刷新一下工程中所有文件的索引,右击工程或者工程管理框中的空白地方右键。 更多 IDE 配置见: 参考文章:RealEvo-IDE 获取地址 参考文章:IDE 窗口布局介绍 参考文章:IDE 中如何高亮变量 ...
    • 打印指定线程的调用栈

      Q:线程运行不正常,发现阻塞了,需要打印其调用连。 SylixOS 支持通过命令可以获取指定线程的调用链。 通过 shell 交互输入:kill -n 47 线程 id
    • 汇编中使用串口打印调试方式

      问:如何在汇编中使用串口打印调试方式 BSP 调试中经常会遇到汇编中需要打印相关状态的情况,如下代码基于全志 T3(ARM Cortex A7)平台展示如何在汇编中打印一个字符的串口调试信息。类似的方式经过简单修改也可以移植到其他平台上。(注意:打印串口信息过程中会使用到 R0、R1 两个寄存器,注意相关寄存器的上下文关系) LDR R1, =0x01c2807C ; /* 读取串口状态寄存器 */ 1: LDR R0, [R1] MOV R0, R0, LSR#2 ; /* ...
    • SylixOS系统 shell 执行界面如何显示代码中打印的中文字符?

      Q:SylixOS 系统 shell 执行界面如何显示代码中打印的中文字符? A:SylixOS 默认支持的中文字符是 GB2312 编码,在 shell 界面操作时需要将您使用的串口打印工具更改为对应的字符编码即可。 如:在支持 GB2312 编码的串口或网络调试工具中直接更改,重新链接后即可显示中文打印。 如使用 Putty 工具,可以更改编码为 ISO-8859-1:1998(latin-1,West Europe)编码即可显示打印的中文。
    • printk 在 telnet 终端输出打印信息

      Q:printk 在 telnet 终端上输出打印信息 通过logfiles命令查看文件描述符是否添加成功。 更多扩展知识: 参考文章:telnet 输入输出重定向