串行(UART)缓冲器高速溢出

时间:2014-12-05 18:05:40

标签: linux serial-port raspberry-pi raspbian uart

我正试图通过UART以4Mbps的速率在Raspberry Pi(单向)和Raspbian之间传输数据。我正在使用UART0(BCM2835 Peripherals第175页)。

我已经成功配置了UART时钟源,因此我能够以如此高的速度进行发送/接收,实际上它可以工作。我可以发送字节并在另一侧正确接收它们。

但是,如果我尝试连续传输数据,会丢失几个字节(~2%),所以我猜我在接收时溢出缓冲区(因为高达1Mbps,连续传输工作正常)。 / p>

据我所知,接收时有两个缓冲区,硬件缓冲区在Raspberry Pi的UART0的情况下为16字节,主存储器上的软件缓冲区。内核将数据从硬件缓冲区移动到软件缓冲区,我的应用程序从那里获取数据。

有没有办法知道这两个缓冲区中哪一个溢出?如果是这样,怎么样?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用Hardware Flow Control (CTS & RTS)解决了这个问题。在更高的速度下,您必须使用HSUART (UART with DMA capabilities)。如果您的serial-port支持16550A或类似内容,则可以在Linux内核中配置CONFIG_8250CONFIG_DWCONFIG_DMA并开始使用DMA-capable UART。我使用High-Speed UART (HSUART)使用baud rates 3M/4Mh/w flow control一起工作progress = (data) -> return if(data.percent < 0.66) do_something() player.off('timedupdate', progress) player.on('timedupdate', progress) ,没有任何问题。