2011-09-26 36 views
1

我用Cygwin中的CLISP打開串口作爲IO流,發現逐字符讀取速度太慢。出於某種原因,該流被分類爲交互式,我相信這會導致它掛起的讀取量小於我的序列大小。爲什麼read-sequence不會在控制檯流結束時返回?

我正在與特殊系統上的調試端口進行交互。我打算花一點時間來編寫一些互動,但最終還是剃掉了一隻犛牛。

我看到幾種不同的方法來解決這個問題。

  1. 一次讀取1個字符,允許讀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))) 
    

所以,每個稱號,爲什麼讀序時不與控制檯流的最後返回?此外,實現該行爲的最佳方式是什麼?我寧願堅持使用基本的CLISP。

回答

1

首先,檢查您的定義READ-SEQUENCE

其次,串行數據並不總是有一個文件結束標記(實際上,通常不會)。也許你的數據已經被ttyS3驅動程序熟化了,但是如果這是一個原始讀取,你應該假設你必須編寫自己的終止條件(或者實現你的設備定義的條件)。

第三,系列IO往往捲起來讓你做犛牛剃鬚。這是非常經典的網絡編碼,你必須考慮數據包,幀,速度同步以及協議的所有常用功能。如果你真的很幸運,你的應用程序很簡單,你可以避免這種情況。

相關問題