2014-12-05 347 views
2

我試圖通過UART以4Mbps在Raspberry Pi(單向)與Raspbian之間傳輸數據。我正在使用UART0(BCM2835 Peripherals,第175頁)。高速串行(UART)緩衝區溢出

我已經成功地配置了UART時鐘源,所以我能夠以如此高的速度發送/接收,而且的確可以工作。我可以發送字節並在另一側正確接收它們。但是,如果我嘗試連續傳輸數據,則會丟失幾個字節(〜2%),所以我想我在接收時溢出緩衝區(因爲高達1Mbps的連續傳輸可以正常工作)。

據我所知,有在接收兩個緩衝區,硬件緩衝區,在樹莓派的UART0的情況下爲16個字節,在主存儲器中的軟件緩衝區。內核將數據從硬件緩衝區移動到軟件緩衝區,我的應用程序從那裏獲取數據。

有什麼辦法可以知道哪兩個緩衝區溢出了?如果是這樣,怎麼樣?

謝謝!

+2

硬件緩衝區可能溢出。在4 Mbps時,它每32 ** **微秒填充**;可靠的服務是艱難的。 – duskwuff 2014-12-05 18:52:14

+0

但是,有什麼方法可以證明它嗎?任何FLAG或類似的?順便說一句,由於它是8N1,所以每個字節有10位(8 + 1 start + 1 stop),所以我認爲緩衝區填滿需要大約40微秒。儘管如此,與32位的差別不大。謝謝。 – 2014-12-05 19:01:48

+0

嘗試在開放式串行端口文件描述符上使用** TIOCGICOUNT ** ioctl()。計數器統計數據中收到超支和緩衝超支。但是有一個用戶報告使用ioctl()的困難:http://stackoverflow.com/questions/11791813/retrieval-of-the-error-counters-via-tiocgicount-returns-always-error-1 – sawdust 2014-12-06 23:38:41

回答

1

這個問題通過使用Hardware Flow Control (CTS & RTS)解決了。在更高的速度下,您必須使用HSUART (UART with DMA capabilities)。如果您的serial-port支持16550A或類似,您可以在您的Linux內核中配置CONFIG_8250,CONFIG_DW,CONFIG_DMA並開始使用DMA-capable UART。我一直在High-Speed UART (HSUART)baud rates高達3M/4M使用h/w flow control沒有任何問題。