在Racket

时间:2017-11-27 17:11:49

标签: serial-port racket

我在Racket中有一个串口输入,我只想在检查时读取新的输入数据。在Python中,我可以在阅读之前使用my_serial_port.flush()轻松完成此操作。但是,我无法弄清楚如何在Racket中做类似的事情。当我刚从端口用(read-bytes 1 in-port))读取时,我得到的是“旧”数据,我想在读取之前将其清除。

有一个flush-output函数,但是我找不到任何类似于刷新输入缓冲区的函数。我在该页面上尝试过各种各样的东西,但似乎没有任何东西可以实现这个功能。看起来这应该是非常简单的,所以我觉得我必须遗漏一些东西。

1 个答案:

答案 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)