我在Racket中有一个串口输入,我只想在检查时读取新的输入数据。在Python中,我可以在阅读之前使用my_serial_port.flush()
轻松完成此操作。但是,我无法弄清楚如何在Racket中做类似的事情。当我刚从端口用(read-bytes 1 in-port))
读取时,我得到的是“旧”数据,我想在读取之前将其清除。
有一个flush-output
函数,但是我找不到任何类似于刷新输入缓冲区的函数。我在该页面上尝试过各种各样的东西,但似乎没有任何东西可以实现这个功能。看起来这应该是非常简单的,所以我觉得我必须遗漏一些东西。
答案 0 :(得分:2)
我们讨论的是“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)