串口清空输入输出缓存

Linux串口编程——清空输入输出缓存

背景

在我们的工作中,串口是一种比较常用的数据传输方式。在某些应用场景下,当程序启动并打开串口后,我们不希望读出串口打开之前的输入缓存数据(即内核驱动已接收但是并未被应用层读出的数据),因此需要对输入缓存数据进行清空(刷清、丢弃)操作。下面以Linux系统上串口编程为例进行说明:

测试环境
硬件环境:PC
操作系统:Ubuntu 14.04虚拟机

测试代码

1
2
#include <termios.h>
#include <unistd.h>

方法一

1
2
3
4
5
6
fd = open("devpath", O_RDWR|O_NOCTTY);
usleep(200000);
tcflush(fd, TCIFLUSH); //清空输入缓存
tcflush(fd, TCOFLUSH); //清空输出缓存
tcflush(fd, TCIOFLUSH); //清空输入输出缓存
tcsetattr(m_ifd, TCSANOW, &strctNewTermios);

方法二

1
2
3
4
5
6
fd = open("devpath", O_RDWR|O_NOCTTY);
usleep(200000);
ioctl(fd, TCFLSH, 0); //清空输入缓存
ioctl(fd, TCFLSH, 1); //清空输出缓存
ioctl(fd, TCFLSH, 2); //清空输入输出缓存
tcsetattr(fd, TCSANOW, &strctNewTermios);

总结

必须在open和tcflush(或ioctl)操作间进行延时操作(具体时间未做验证),否则没有清空效果,原因未知,可能跟Linux内核版本有关
可自由选择只清空输入或只清空输出或两者都清空
tcflush和ioctl两种方法均有效,注意ioctl的第二个参数是TCFLSH


原文