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 时,您的程序在串行端口上接收和传输数据时异步执行。只有在异常情况下(例如初始化、错误恢复或软件半双工),您的程序才需要与实际数据传输显式同步。
我正在使用 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 时,您的程序在串行端口上接收和传输数据时异步执行。只有在异常情况下(例如初始化、错误恢复或软件半双工),您的程序才需要与实际数据传输显式同步。