何时刷新 Pyserial 缓冲区?

When to flush Pyserial buffers?

我正在使用 Pyserial,对有关刷新输入和输出缓冲区的最佳实践有疑问。目前我在发送命令之前重置输出缓冲区并在读取回复之前重置输入。似乎我偶尔会错过回复的开始,所以我正在考虑修改我的程序以在发送命令之前重置输入缓冲区。我也在考虑链接我的发送和接收函数,以便发送总是调用接收并希望收紧循环。

    def send_cmd(self, cmd_to_send):
        self.ser.reset_output_buffer()
        self.ser.write(cmd_to_send)

    def receive_cmd(self):
        self.ser.reset_input_buffer()
        # Read logic below

考虑过渡到这样的东西

    def send_cmd(self, cmd_to_send):
        self.ser.reset_output_buffer()
        self.ser.reset_input_buffer()
        self.ser.write(cmd_to_send)
        self.receive_cmd()

    def receive_cmd(self):
        # Read logic below

在端口配置中,关键timeout让你在每次与端口通信时等待一些时间。

我通常使用这个参数来防止端口缓冲区出现问题。试试这个,也许不需要冲洗。

这个 post 获得了不错的访问量,所以我只想让大家知道我从来没有找到这个问题的答案。我尝试了多种配置,但最终刷新似乎更多地依赖于硬件本身而不是软件。我确实最终过渡到了我提到的代码,它似乎有所帮助,尽管有点帮助。所以我会推荐这样的东西:

def send_cmd(self, cmd_to_send):
    self.ser.reset_output_buffer()
    self.ser.reset_input_buffer()
    self.ser.write(cmd_to_send)
    self.receive_cmd()

def receive_cmd(self):
    # Read logic below

如果有人能提供更好的答案,我将不胜感激:)

编辑:我也根据需要单独读取字节。正如 Eduardo 在另一个答案中提到的那样,使用 readlines() 可能会取得更大的成功。

def send_cmd(self, cmd_to_send):
    self.ser.reset_output_buffer()
    self.ser.reset_input_buffer()
    self.ser.time.sleep(0.1)
    self.ser.write(cmd_to_send)
    self.ser.time.sleep(0.1)
    self.receive_cmd()

def receive_cmd(self):
    # Read logic below