Pyserial何时应该使用flush?

3

我正在使用pyserial与arduino板进行数据的读写。我看到一些示例显示在读写时应该使用flush。即使阅读了pyserial文档,我仍然不理解flush的作用。我还注意到有:

flushInput()
flushOutput()
flush()

每个角色的作用是什么,为什么以及何时应该使用它。我需要解释一下。
2个回答

5

[来自pySerial API文档的引用]

flushInput()

"自3.0版本以后已弃用:请参见reset_input_buffer()"
"清空输入缓冲区,丢弃其所有内容。"

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


flushOutput()

"自3.0版本起已弃用:请参阅reset_output_buffer()"
"清除输出缓冲区,中止当前输出并丢弃缓冲区中的所有内容。

注意,对于某些USB串行适配器,这可能仅会刷新操作系统的缓冲区,并非所有可能存在于USB部分的数据。"

通常只作为中止过程的一部分使用。


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

flush()

"文件流刷新函数。在此情况下,等待所有数据被写入。"

在 POSIX termios 术语中,此函数称为 tcdrain()
请注意,“flush”和“drain”有时(令人困惑地)交替使用于“等待所有传输完成”的功能。
但术语“flush”也可以用来表示“丢弃”(例如,旧的 flushXput() 函数名称中)。
例如,请注意在 pySerial API 文档中重命名两个函数以减少混淆后,“flush”一词的持续不一致使用。
因此,每当您看到单词“flush”时,都应验证在该上下文中它意味着什么(即破坏性丢弃或非破坏性等待操作)。

flush()函数通常在程序中不需要使用,特别是当使用阻塞I/O时(即操作系统正在缓冲所有数据,并且将自动高效地使您的程序等待必要的时间)。
使用操作系统时,您的程序与串口接收和传输数据的异步执行。仅在异常情况下(例如初始化、错误恢复或软件半双工)时,您的程序需要显式地与实际数据传输进行同步。


这个比我的答案更正确...但我看到有很多情况下缓冲区中会有一些先前响应的部分或其他垃圾,这可能会使解析命令结果更加困难。 - Joran Beasley
@JoranBeasley -- 谢谢。 "但我看到很多情况......" - 但这并不是(盲目)丢弃接收但未读数据的理由。有些情况下,未读数据被认为是垃圾(部分原因是由于程序与实际数据接收的同步不足)。因此,在经过词法扫描和/或解析后,输入过程可能应该只丢弃接收到的字节。 - sawdust
如果你要求我提供当前传感器值,而我不关心自上次向你请求某些内容以来你说过的任何其他话,那么直接清除缓存是可以接受的...这只是我的个人看法。 - Joran Beasley

-1

以下是过度简化的内容

pyserial(串行通信)使用通信缓冲区(实际上有两个)

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

另一个用于输出[ | | | M | M ]

如果其中一个缓冲区已满,则无法在该缓冲区上执行其他操作,并且可能会阻止程序执行

刷新...告诉缓冲区丢弃其数据,以便新数据可以开始进入


那么在我读取或写入之后,我应该刷新缓冲区吗?对于读和写,我应该使用哪种刷新方法? - user11829835
通常在写入之前刷新。 - Joran Beasley
谢谢您的帮助。 - user11829835

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接