Serial port 为什么读取序列在控制台流结束时不返回?

Serial port 为什么读取序列在控制台流结束时不返回?,serial-port,common-lisp,Serial Port,Common Lisp,我在Cygwin中打开一个带有CLISP的串行端口作为IO流,发现逐字读取速度太慢。出于某种原因,流被分类为交互流,我相信这会导致它挂起,读取的大小小于我的序列的大小 我正在与一个特殊系统上的调试端口进行交互。我本打算花一点时间来编写一些互动脚本,但最后却剃了一头牦牛 我认为有几种不同的方法可以解决这个问题 一次读取1个字符,允许读取字符无挂起。这太慢了 将FFI写入串行库。我想我不该这么做 找到一些方法来确定流的剩余长度。很好的解决方案 了解如何使串行端口非交互,这可能导致读取序列在流结束时返

我在Cygwin中打开一个带有CLISP的串行端口作为IO流,发现逐字读取速度太慢。出于某种原因,流被分类为交互流,我相信这会导致它挂起,读取的大小小于我的序列的大小

我正在与一个特殊系统上的调试端口进行交互。我本打算花一点时间来编写一些互动脚本,但最后却剃了一头牦牛

我认为有几种不同的方法可以解决这个问题

  • 一次读取1个字符,允许读取字符无挂起。这太慢了

  • 将FFI写入串行库。我想我不该这么做

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

  • 了解如何使串行端口非交互,这可能导致读取序列在流结束时返回。对我来说,这似乎是最好的解决办法

    (with-open-file (serial "/dev/ttyS3" 
                            :direction :io
                            :external-format :unix
                            :if-exists :overwrite)
                       (read-sequence *data* serial)))
    

  • 那么,根据标题,为什么读取序列不会在控制台流结束时返回?此外,实现这种行为的最佳方式是什么?我更喜欢使用基本的CLISP。

    首先,检查您的定义

    其次,串行数据并不总是有文件结束标记(实际上,通常没有)。可能您的数据被ttyS3驱动程序篡改,但如果这是原始读取,您应该假设您必须编写自己的终止条件(或实现设备定义的终止条件)


    第三,连续剧IO经常会让你刮牦牛胡子。这是非常经典的网络编码,你必须考虑数据包、帧、速度同步和所有协议的优点。如果你真的很幸运,你的应用程序很简单,你可以避免

    首先,检查您的定义

    其次,串行数据并不总是有文件结束标记(实际上,通常没有)。可能您的数据被ttyS3驱动程序篡改,但如果这是原始读取,您应该假设您必须编写自己的终止条件(或实现设备定义的终止条件)

    第三,连续剧IO经常会让你刮牦牛胡子。这是非常经典的网络编码,你必须考虑数据包、帧、速度同步和所有协议的优点。如果你真的很幸运,你的应用程序很简单,你可以避免