我在Cygwin中打开一个带有CLISP的串口作为IO流,发现按字符读取太慢了。出于某种原因,该流被分类为交互式,我相信它会导致它以小于我的序列大小的读数挂起。
我正在与特殊系统上的调试端口进行交互。我打算花一点时间来编写一些交互,但结果却刮了牦牛。
我看到了几种不同的解决方法。
一次读取1个字符,允许read-char-no-hang。这太慢了。
将FFI写入串行库。我认为我不应该这样做。
找到一些方法来确定流的剩余长度。好的解决方案。
弄清楚如何使串行端口非交互式,这可能导致读取序列在流结束时返回。这对我来说似乎是最好的解决方案。
(with-open-file (serial "/dev/ttyS3"
:direction :io
:external-format :unix
:if-exists :overwrite)
(read-sequence *data* serial)))
那么,根据标题,为什么read-sequence不会在控制台流结束时返回?此外,实现这种行为的最佳方法是什么?我更愿意坚持使用基本的CLISP。
答案 0 :(得分:1)
首先,检查READ-SEQUENCE的定义。
其次,串行数据并不总是具有文件结束标记(实际上,通常不会)。也许您的数据是由ttyS3驱动程序熟悉的,但如果这是一个原始读取,您应该假设您必须编写自己的终止条件(或实现您的设备定义的条件)。
第三,连续IO常常会让你做牦牛剃须。这是非常经典的网络编码,你必须考虑数据包,帧,速度同步和协议的所有常见的好处。如果你真的很幸运,你的应用程序很简单,你可以避免这种情况。