pySerial中的flush和reset_input_buffer + reset_output_buffer有什么区别?

6

我正在尝试使用pySerial==3.4,但发现serial.Serial.flush()文档缺乏:

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


问题

  • 什么是“文件类对象”?
  • 什么被清除了?
  • 何时使用flush而不是单独重置输入/输出缓冲区?
serial = Serial("COM3")

# Option 1
serial.flush()

# Option 2
serial.reset_input_buffer()
serial.reset_output_buffer()

相关问题

1个回答

5

看起来像这样:

什么是“类似于文件的对象”?

Python中的“类似于文件的对象”到底是什么?

类似于文件的对象主要是StringIO对象、连接的套接字还有实际的文件对象。如果一切顺利,urllib.urlopen()也会返回支持必要方法的类似于文件的对象。

类似于文件的对象
文件对象的同义词。

文件对象
向底层资源公开面向文件的API(例如read()或write()等方法)的对象。根据它的创建方式,文件对象可以协调访问真实的磁盘文件或另一种类型的存储或通信设备(例如标准输入/输出、内存缓冲区、套接字、管道等)。文件对象也被称为类似于文件的对象或流。

实际上存在三种类型的文件对象:原始二进制文件、缓冲二进制文件和文本文件。它们的接口在io模块中定义。使用open()函数是创建文件对象的规范方式。

io — 处理流的核心工具

io模块提供了Python处理各种类型I/O的主要功能。有三种主要类型的I/O:文本I/O、二进制I/O和原始I/O。这些是通用类别,可以为每个类别使用各种后备存储。属于这些类别之一的具体对象称为文件对象。其他常见术语是流和类似于文件的对象。

什么被刷新?

输出缓冲区中保存的数据。

何时使用刷新而不是仅单独重置输入/输出缓冲区?

已经输出(write())的数据,并且它会在关闭前被调用。

flush()与输入缓冲区或reset_input_buffer()无关。

flush()的功能与reset_output_buffer()不同。
flush()将输出缓冲区中的所有数据发送到对等方,而reset_output_buffer()则丢弃输出缓冲区中的数据。

reset_output_buffer()
清除输出缓冲区,中止当前输出并丢弃缓冲区中的所有内容。

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


1
谢谢@kunif!还有一个问题:这是否意味着在每次serial.write之后,我都应该调用serial.flush?逻辑是确保在继续向前之前已经写入了所有内容。 - Intrastellar Explorer
1
当需要在严格的时间内进行轮询或响应,或整个系统负载高且写入和传输之间的时间延迟经常发生时,这可能是必要的。如果没有问题,则不必要。 - kunif

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