BeagleBone Black UART软件FIFO大小?

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

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

ssize_t read(int fd, void *buf, size_t count);

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

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

c debian uart beagleboneblack fifo
1个回答
0
投票

然后我尝试使用read(2)函数从此端口读取

而不是“ port”,实际上是从硬件设备中移走了几层,并从串行终端的系统缓冲区中读取。

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

首先count必须不大于提供的用户缓冲区。对于阻塞的[[read(),您可以使此count与您可以分配的任何缓冲区一样大。对于无阻塞read(),比终端接收缓冲区大的count毫无意义。请注意,count仅仅是一个请求,并且read() syscall可以返回的字节数少于请求的字节数。

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

请参见Linux serial drivers

这是真的吗?如果是,fifo软件的大小是多少?

是,终端接收缓冲区通常为4096字节,尽管您可以编写自己的具有不同大小的线路规则,或者重新定义宏。来自

include / linux / tty.h

#define N_TTY_BUF_SIZE 4096
© www.soinside.com 2019 - 2024. All rights reserved.