为什么read-sequence不会在控制台流结束时返回?

时间:2011-09-26 02:22:15

标签: serial-port common-lisp

我在Cygwin中打开一个带有CLISP的串口作为IO流,发现按字符读取太慢了。出于某种原因,该流被分类为交互式,我相信它会导致它以小于我的序列大小的读数挂起。

我正在与特殊系统上的调试端口进行交互。我打算花一点时间来编写一些交互,但结果却刮了牦牛。

我看到了几种不同的解决方法。

  1. 一次读取1个字符,允许read-char-no-hang。这太慢了。

  2. 将FFI写入串行库。我认为我不应该这样做。

  3. 找到一些方法来确定流的剩余长度。好的解决方案。

  4. 弄清楚如何使串行端口非交互式,这可能导致读取序列在流结束时返回。这对我来说似乎是最好的解决方案。

    (with-open-file (serial "/dev/ttyS3" 
                            :direction :io
                            :external-format :unix
                            :if-exists :overwrite)
                       (read-sequence *data* serial)))
    
  5. 那么,根据标题,为什么read-sequence不会在控制台流结束时返回?此外,实现这种行为的最佳方法是什么?我更愿意坚持使用基本的CLISP。

1 个答案:

答案 0 :(得分:1)

首先,检查READ-SEQUENCE的定义。

其次,串行数据并不总是具有文件结束标记(实际上,通常不会)。也许您的数据是由ttyS3驱动程序熟悉的,但如果这是一个原始读取,您应该假设您必须编写自己的终止条件(或实现您的设备定义的条件)。

第三,连续IO常常会让你做牦牛剃须。这是非常经典的网络编码,你必须考虑数据包,帧,速度同步和协议的所有常见的好处。如果你真的很幸运,你的应用程序很简单,你可以避免这种情况。