我正嘗試從linux上的c中的串行設備讀取二進制數據。 問題是,有時在驅動程序的內部緩衝區中存在字符,但輪詢(使用select(2))返回說明設備尚未準備好被讀取。未讀取uart緩衝區
我已閱讀和重新閱讀的termios的人以及所有相關的人與搜索在互聯網上。我相信我正確設置了所有標誌(即VTIME,VMIN)並取消了ICANON。 我嘗試過使用函數「tcmakewraw」,但它沒有解決問題。
你們有什麼想法我應該怎麼做?
親切的問候&預先感謝 Yannay
我正嘗試從linux上的c中的串行設備讀取二進制數據。 問題是,有時在驅動程序的內部緩衝區中存在字符,但輪詢(使用select(2))返回說明設備尚未準備好被讀取。未讀取uart緩衝區
我已閱讀和重新閱讀的termios的人以及所有相關的人與搜索在互聯網上。我相信我正確設置了所有標誌(即VTIME,VMIN)並取消了ICANON。 我嘗試過使用函數「tcmakewraw」,但它沒有解決問題。
你們有什麼想法我應該怎麼做?
親切的問候&預先感謝 Yannay
當你後,你直接(不通過C)/dev/ttyS0
(或同等)閱讀setserial
您的參數會發生什麼。您是否能夠獲得select()
以外的所需數據?
您應該向我們顯示代碼。我將開始在串行端口上使用cfmakeraw。 一旦你在原始模式下工作,你可以進行修改,看看它是如何工作的。 這裏有問題或事情的清單,你可以檢查:
修改屬性之後,使用例如cfmakeraw,你叫tcsetattr(...),以 應用更改?
,你如何證明還有在驅動程序的數據接收緩衝區?
你檢查你的系統調用的錯誤?
是什麼stracing程序的結果呢?
編輯根據您的意見: 你的協議 「保證」 .... =>檢查你的假設!未選中,晶瑩剔透保障是「不可能的錯誤」
基本上是一個良好的coandidate:要麼select is broken,或您的串口驅動程序。串行驅動程序被破壞的原因是硬件FIFO不足以觸發未中斷或丟失中斷。
附加代碼... – BlueDog 2011-01-06 17:57:46
你記住要重新填充`readfds`之前* *每次調用`選擇()`? – caf 2011-01-06 23:49:59
什麼類型的串口? (即真正的16550,16550克隆,一個USB轉換器,藍牙,紅外線,...) – 2011-01-09 23:56:10