2011-01-06 223 views
0

我正嘗試從linux上的c中的串行設備讀取二進制數據。 問題是,有時在驅動程序的內部緩衝區中存在字符,但輪詢(使用select(2))返回說明設備尚未準備好被讀取。未讀取uart緩衝區

我已閱讀和重新閱讀的termios的人以及所有相關的人與搜索在互聯網上。我相信我正確設置了所有標誌(即VTIME,VMIN)並取消了ICANON。 我嘗試過使用函數「tcmakewraw」,但它沒有解決問題。

你們有什麼想法我應該怎麼做?

親切的問候&預先感謝 Yannay

+3

附加代碼... – BlueDog 2011-01-06 17:57:46

+1

你記住要重新填充`readfds`之前* *每次調用`選擇()`? – caf 2011-01-06 23:49:59

+0

什麼類型的串口? (即真正的16550,16550克隆,一個USB轉換器,藍牙,紅外線,...) – 2011-01-09 23:56:10

回答

0

當你後,你直接(不通過C)/dev/ttyS0(或同等)閱讀setserial您的參數會發生什麼。您是否能夠獲得select()以外的所需數據?

1

您應該向我們顯示代碼。我將開始在串行端口上使用cfmakeraw。 一旦你在原始模式下工作,你可以進行修改,看看它是如何工作的。 這裏有問題或事情的清單,你可以檢查:

  • 修改屬性之後,使用例如cfmakeraw,你叫tcsetattr(...),以 應用更改?

  • ,你如何證明還有在驅動程序的數據接收緩衝區?

  • 你檢查你的系統調用的錯誤?

  • 是什麼stracing程序的結果呢?

編輯根據您的意見: 你的協議 「保證」 .... =>檢查你的假設!未選中,晶瑩剔透保障是「不可能的錯誤」

基本上是一個良好的coandidate:要麼select is broken,或您的串口驅動程序。串行驅動程序被破壞的原因是硬件FIFO不足以觸發未中斷或丟失中斷。