C BeagleBone黑色UART软件FIFO大小?

C BeagleBone黑色UART软件FIFO大小?,c,debian,uart,beagleboneblack,fifo,C,Debian,Uart,Beagleboneblack,Fifo,我正在BeagleBone Black上开发一个定制应用程序,它必须通过运行在BBB上的Debian Linux使用设备的UART功能来读取大块数据。为了从UART读取数据,我打开了一个/dev/ttyO0、/dev/ttyO1等设备,其中的open()处于非阻塞模式。然后我尝试用read(2)从这个端口读取: 我想知道参数计数的最大合理数字是多少,它与UART的FIFO缓冲区有什么关系? 在AM335x技术参考手册(TI文件spruh73p,第4328页,第19.3.6节)中,我可以看到硬件缓

我正在BeagleBone Black上开发一个定制应用程序,它必须通过运行在BBB上的Debian Linux使用设备的UART功能来读取大块数据。为了从UART读取数据,我打开了一个/dev/ttyO0、/dev/ttyO1等设备,其中的
open()
处于非阻塞模式。然后我尝试用
read(2)
从这个端口读取:

我想知道参数
计数的最大合理数字是多少,它与UART的FIFO缓冲区有什么关系?

在AM335x技术参考手册(TI文件spruh73p,第4328页,第19.3.6节)中,我可以看到硬件缓冲区的长度为64字节。但是,正如我通过使用
read()
函数所怀疑的那样,我的程序没有直接与硬件fifo缓冲区通信,而是从Linux串行驱动程序的软件缓冲区读取(如果有)。这是真的吗?如果是,软件fifo的大小是多少?有人能为我介绍一下这个领域吗

然后我尝试用read(2)函数从这个端口读取数据

与“端口”不同,您实际上是从硬件设备中移除了几层,并从串行终端的系统缓冲区读取数据

我想知道参数计数的最大合理数字是多少,它与UART的FIFO缓冲区有什么关系

首先,
计数必须不大于提供的用户缓冲区。
对于阻塞read(),您可能会将此
计数为您可以分配的任何缓冲区的大小。
对于非阻塞read(),大于终端接收缓冲区的
计数几乎没有意义。
请注意,
count
只是一个请求,而read()系统调用返回的字节数可能小于请求的字节数

UART FIFO和串行端口驱动程序缓冲区的大小与来自用户空间的任何read()请求无关。

。。。它是从Linux串行驱动程序的软件缓冲区读取的(如果有)。这是真的吗

差不多了。
来自用户空间的read()系统调用从终端缓冲区获取数据。
终端驱动程序是比串行端口驱动程序更高级的驱动程序

终端缓冲区与UART FIFO没有直接连接。
如果采用DMA,则数据从UART FIFO传输到DMA缓冲区。
如果采用PIO,则数据将从UART FIFO传输到驱动程序缓冲区。
无论哪种情况,串行端口驱动程序最终都会将数据传输到tty翻转缓冲区。
在非中断模式下,来自tty翻转缓冲区的数据传输到终端/线路规程缓冲区。
再次提及

如果是,软件fifo的大小是多少

终端接收缓冲区通常为4096字节,但您可以使用不同的大小编写自己的行规程,或重新定义宏。
来自Linux内核中的源代码:

#define N_TTY_BUF_SIZE 4096

终端驱动程序对于Linux支持的所有体系结构都是通用的,因此您的BBB应该有一个4096字节的终端缓冲区

人工读取
:在Linux上,read()(和类似的系统调用)最多传输0x7ffff000(2147479552)字节,返回实际传输的字节数。(32位和64位系统都是如此。)@MarcoBonelli谢谢,我也读过这篇文章。但我几乎不相信嵌入式环境中的串行(UART)fifo缓冲区会有2GB大……我真的很感谢你的回答,但我的BBB的/usr/include/linux/tty.h中没有这样的定义。。此外,此文件夹中的所有文件都不包含字符串
N\u TTY\u BUF\u SIZE
。文件引用是内核源代码,而不是用户空间代码。只有内核驱动程序需要该宏。为了使用重新定义的tty缓冲区大小,您必须重新构建内核。我并不是想暗示这样的改变是微不足道的。我以为你明白这都是内核的一部分。我不习惯Linux已经不是什么秘密了,但我开始了解它了。据我所知,我们可以非常安全地假设BBB’linux上的串行驱动程序缓冲区是4k,对吗?
#define N_TTY_BUF_SIZE 4096