打开设备时Linux串口缓冲区不为空

我有一个系统,我看到奇怪的行为与我不期望的串行端口。 我以前曾经见过这种与USB串口适配器,但现在我也看到它在本地串行端口以及更大的频率。

系统设置为运行自动化testing,并首先执行一些任务,导致大量的数据从串行设备输出,而我没有打开端口。 该设备也将自行重置。 只有tx / rx线路连接。 没有stream量控制。

完成这些任务后,testing件打开串口并立即失败,因为它会得到意外的响应。 当我重现这一点时,我发现如果我在terminal程序中打开串口,我看到几千字节的旧数据(在端口closures时显示已经发送)立即被刷新。 一旦我closures了这个程序,我就可以按照预期运行testing了。

什么可能导致这种情况发生? 当设备closures时,Linux如何处理缓冲串行端口? 如果我打开一个设备,使它发送输出,然后closures它没有读取它,这会导致同样的问题?

Solutions Collecting From Web of "打开设备时Linux串口缓冲区不为空"

Linux终端驱动程序缓冲输入,即使它没有打开。 这可能是一个有用的功能,特别是如果速度/奇偶性等。 适当设置。

要复制较小操作系统的行为,请立即从端口读取所有未决输入:

... int fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) exit (1); set_blocking (fd, 0); // disable reads blocked when no input ready char buf [10000]; int n; do { n = read (fd, buf, sizeof buf); } while (n > 0); set_blocking (fd, 1); // enable read blocking (if desired) ... // now there is no pending input void set_blocking (int fd, int should_block) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { error ("error %d getting term settings set_blocking", errno); return; } tty.c_cc[VMIN] = should_block ? 1 : 0; tty.c_cc[VTIME] = should_block ? 5 : 0; // 0.5 seconds read timeout if (tcsetattr (fd, TCSANOW, &tty) != 0) error ("error setting term %sblocking", should_block ? "" : "no"); }