【问题标题】:Pyserial when should I use flush?Pyserial 什么时候应该使用flush?
【发布时间】:2020-05-16 10:06:26
【问题描述】:

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

flushInput()
flushOutput()
flush()

每一个的作用是什么,为什么以及何时应该使用它。我会很感激你的解释。

【问题讨论】:

    标签: python python-3.x serial-port pyserial


    【解决方案1】:

    [来自pySerial API documentation的报价]

    flushInput()

    “自 3.0 版起已弃用:请参阅 reset_input_buffer()”
    “刷新输入缓冲区,丢弃所有内容。”

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


    flushOutput()

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

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

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


    注意:底层操作系统可能会规定使用上述程序。
    在(现代)Linux 系统上,接收和发送系统缓冲区通常在打开串行端口/终端时被清除。 Windows 可能并非如此。


    刷新()

    “刷新文件类对象。在这种情况下,等到所有数据都被写入。”

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

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

    【讨论】:

    • 这比我的回答更正确......但我看到很多情况下,缓冲区中存在某些先前响应的某些部分或其他一些垃圾,这会使解析命令结果更加困难
    • @JoranBeasley -- 谢谢。 “但我看到很多实例......” - 但这不是(盲目地)丢弃收到但未读数据的理由。很少有未读数据被认为是垃圾的情况(即,部分原因是程序与实际数据接收缺乏同步)。因此,输入进程可能应该只在通过词法扫描和/或解析检查后丢弃接收到的字节。
    • 如果你说给我你当前的传感器值,我不关心自从上次我问你之后你可能说的任何其他内容。我认为只是冲洗它是可以接受的......只是我的 2c
    【解决方案2】:

    严重过度简化

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

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

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

    如果其中一个缓冲区已满,则该缓冲区将无法继续运行,并且可能会阻塞程序执行

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

    【讨论】:

    • 所以每当我读或写我应该在那之后刷新缓冲区?我应该使用哪种刷新方法进行读取,使用哪种方法进行写入?
    • 通常在你写之前刷新
    • 感谢您的帮助
    猜你喜欢
    • 2012-12-02
    • 2023-04-02
    • 2011-04-15
    • 2017-04-10
    • 2012-03-19
    • 2018-05-12
    • 2018-12-11
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多