Serial port 刷新球拍中的输入缓冲区

Serial port 刷新球拍中的输入缓冲区,serial-port,racket,Serial Port,Racket,我在Racket中有一个串行端口输入,我只想在检查时读取新的传入数据。在Python中,在阅读之前,我可以使用my\u serial\u port.flush()轻松完成这项工作。然而,我不知道如何在球拍中做类似的事情。当我刚刚用(在端口中读取字节1))从端口读取数据时,我得到了“旧”数据,我想在读取之前清除这些数据 有一个函数,但我找不到任何类似于刷新输入缓冲区的函数。我在该页面上尝试了各种方法,但似乎都无法实现此功能。看起来这应该很简单,所以我觉得我肯定遗漏了一些东西。我们讨论的是“flus

我在Racket中有一个串行端口输入,我只想在检查时读取新的传入数据。在Python中,在阅读之前,我可以使用
my\u serial\u port.flush()
轻松完成这项工作。然而,我不知道如何在球拍中做类似的事情。当我刚刚用
(在端口中读取字节1))
从端口读取数据时,我得到了“旧”数据,我想在读取之前清除这些数据


有一个函数,但我找不到任何类似于刷新输入缓冲区的函数。我在该页面上尝试了各种方法,但似乎都无法实现此功能。看起来这应该很简单,所以我觉得我肯定遗漏了一些东西。

我们讨论的是“flush”一词的两种稍微不同的用法。在输出缓冲区中,flush确保缓冲数据实际发送到端口。在您的例子中,您谈论的是丢弃输入数据

这可能是实现您想要的功能的正确方法(代码中包含一个示例输入端口,以演示其工作原理)


我们讨论的是单词“flush”的两种稍有不同的用法。在输出缓冲区的情况下,flush确保缓冲数据实际发送到端口。在您的例子中,您谈论的是丢弃输入数据

这可能是实现您想要的功能的正确方法(代码中包含一个示例输入端口,以演示其工作原理)

#lang racket

(define buf-size 20000)

;; given a port, allocate a buffer of size 'buf-size' and
;; repeatedly read available bytes or specials until 0
;; bytes are available.
(define (drain-port port)
  (define buf (make-bytes buf-size))
  (let loop ()
    (define try-read (read-bytes-avail!* buf port))
    (cond [(or (eof-object? try-read)
               (and (number? try-read) (= try-read 0)))
           'done]
          [else
           (loop)])))

(define example-port (open-input-string "abcdef"))
(drain-port example-port)