2010-03-10 66 views
1

我試圖使用串行電纜將文本數據從一臺PC發送到其他PC。其中一臺PC運行linux,我使用write(2)系統調用從它發送數據。日誌大小約爲65K字節,但write(2)系統調用返回大約4K字節(即傳輸大量數據)。我試圖用4K塊分解數據,但是寫(2)返回-1。串行端口:無法寫入大塊數據

我的問題是「在串口上寫數據時是否有緩衝區限制?或者我可以發送任何大小的數據?當我寫入4K數據塊時,還需要從其他PC連續讀取數據」

是否需要在termios結構中進行特殊配置以發送(巨大)數據?

+0

您是否可以輕鬆發佈將數據寫入4K塊的代碼段? – mtrw 2010-03-10 07:17:46

回答

1

發送緩衝區的一個頁面(拍了一下的Linux 2.6.18源) - 這是大多數(如果不是全部)的情況下的4K。

另一端必須讀取(不知道接收緩衝區的大小),但更重要的是你不應該寫的比串口可以傳輸的速度快,如果你使用115200 bps 8-N-1你可以每秒寫入4K塊大約3次。 (115200/9/4096 = 3.125)

1

是的,有一個緩衝區限制 - 但是當您達到該限制時,應該阻止write()

write()返回-1,什麼是errno設置爲?

0

確保接收器正在讀取。

您應該更新與寫(當前位置是您的緩衝區),並從那裏繼續接下來的寫。如果你得到一個錯誤回來以後寫(適用於所有的寫操作(),如果不管fd是一個串行端口,TCP套接字或文件。)

。通過manpage判斷,它可以安全地重試以下errnos的寫入:EAGAIN,EINTR和可能的ENOSPC。使用perror()來看看你得到了什麼。 (..併發布它,我很好奇。)

EFBIG似乎表明你正在嘗試使用一個太大的緩衝區(或更確切地說,計數)來編寫,但這可能比64k大得多。

如果內部緩衝區填滿了,因爲你正在寫快,儘量(納米)睡覺寫入間一點點。有幾個聰明的方法可以做到這一點(比如tcp),但是如果速率已知,只需以固定速率寫入即可。

如果你想接收器實際上是讀書,但沒有太大的情況,看看串行端口流量控制選項,如果電纜是有線DTS/RTS。

+0

W. Richard Stevens的「UNIX環境下的高級編程」(或者其他任何人的書)都是強制性閱讀,如果你要做任何重要的事情。 – KarlP 2010-03-10 11:30:14