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

问题描述 投票:0回答:2

我正在尝试通过 UART 以 4Mbps 的速度使用 Raspbian 在 2 个 Raspberry Pi 之间(单向)传输数据。我正在使用 UART0(BCM2835 外设第 175 页)。

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

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

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

有什么方法可以知道这两个缓冲区中哪一个溢出了?如果是的话,怎么办?

谢谢!

linux serial-port raspberry-pi raspbian uart
2个回答
3
投票

使用

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
进行工作,没有任何问题。


0
投票

我用CM4 RS485做了几次实验。 配置: 隔离内核,init_uart_clock=320MHz, 8N2,CPU 1.5GHz 性能,CPU 上有散热器(无节流), 无硬件控制。 无需任何流量即可读取高达 4Mbit。 20Mbit - 每 10MB 丢失少于 1 个字节。

© www.soinside.com 2019 - 2024. All rights reserved.