Pyserial 什么时候应该使用 flush?

Pyserial when should I use flush?

我正在使用 pyserial 并尝试在 arduino 板上写入和读取数据。我看到几个例子表明在读写时应该使用 flush。即使在阅读了 pyserial 文档之后,我也不明白 flush 的作用是什么。我还注意到有:

flushInput()
flushOutput()
flush()

每一个的作用是什么,为什么以及什么时候应该使用它。非常感谢您的解释。

严重过度简化

pyserial(一般是串口)使用通信缓冲区(实际上是2个)

一个用于输入[ M | M | M | | | ]

还有一个用于输出 [ | | | M | M ]

如果这些缓冲区之一已满,则该缓冲区无法继续运行,并且可能会阻止程序执行

flush ... 告诉缓冲区丢弃它的数据,这样新数据就可以开始进来了

[引用自 pySerial API documentation]

flushInput()

"Deprecated since version 3.0: see reset_input_buffer()"
刷新 输入缓冲区,丢弃其所有内容。”

通常仅在更改串口参数(例如端口初始化)或错误恢复后使用。


flushOutput()

"Deprecated since version 3.0: see reset_output_buffer()"
"清除输出缓冲区,中止当前输出并丢弃缓冲区中的所有内容。

请注意,对于某些 USB 串行适配器,这可能只会 刷​​新 OS 的缓冲区,而不是 USB 部分中可能存在的所有数据。 “

通常仅用作中止过程的一部分。


注意:底层操作系统可能会规定上述过程的使用。
在(现代)Linux 系统上,接收和发送系统缓冲区通常在串行 port/terminal 打开时被清除。 Windows 可能不是这种情况。


flush()

"刷新 文件类对象。在这种情况下,请等待所有数据写入。"

在POSIX termios行话中,这个函数被称为tcdrain()
请注意 "flush" 和 "drain" 有时(容易混淆地)互换使用 "wait until all transmiting is done" 函数。
但是术语 "flush" 也可以用来表示 "discard"(例如,在旧的 flushXput() 函数名称中)。
例如,请注意在 pySerial API 文档中仍然不一致地使用 "flush" 一词,即使在重命名两个函数以减少混淆之后也是如此。
因此,每当您看到单词 "flush" 时,您应该验证它在该上下文中的含义(即破坏性丢弃或非破坏性等待操作)。

程序中通常不需要此 flush() 函数,尤其是在使用阻塞 I/O 时(即 OS 正在缓冲所有数据,并将自动有效地让您的程序在必要时等待)。
使用 OS 时,您的程序在串行端口上接收和传输数据时异步执行。只有在异常情况下(例如初始化、错误恢复或软件半双工),您的程序才需要与实际数据传输显式同步。