我正在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软件的大小是多少?有人可以帮我启发一下这个领域吗?
答案 0 :(得分:2)
然后我尝试使用read(2)函数从该端口读取
实际上是从硬件设备中删除了几层,而不是从“端口” 中读取了串行终端的系统缓冲区。
我想知道参数计数的最大合理数字是多少,它与UART的FIFO缓冲区有何关系?
首先count
不得大于提供的用户缓冲区。
对于阻塞的 read(),您可以将count
设为与您可以分配的任何缓冲区一样大。
对于无阻塞的 read(),比终端接收缓冲区大的count
毫无意义。
请注意,count
只是一个请求, read()系统调用返回的字节数可以少于请求的字节数。
UART FIFO和串行端口驱动器缓冲区的大小与用户空间中的任何 read()请求无关。
参见Linux serial drivers。
...正在从Linux的串行驱动程序的软件缓冲区中读取(如果有的话)。这是真的?
差不多。
用户空间中的 read()系统调用从终端缓冲区中获取数据。
终端驱动程序是比串行端口驱动程序更高级别的驱动程序。
终端缓冲区与UART FIFO没有直接连接。
如果使用DMA,则数据将从UART FIFO传输到DMA缓冲区。
如果使用PIO,则数据将从UART FIFO传输到驱动器缓冲区。
无论哪种情况,串行端口驱动程序最终都会将数据传输到tty翻转缓冲区。
在非中断模式下,来自tty翻转缓冲区的数据将传输到终端/线路规则缓冲区。
再次参考Linux serial drivers。
如果是,fifo软件的大小是多少?
终端接收缓冲区通常为4096字节,尽管您可以编写自己的具有不同大小的线路规则,或者重新定义宏。
来自Linux内核源代码中的include/linux/tty.h:
#define N_TTY_BUF_SIZE 4096
终端驱动程序是Linux支持的所有体系结构所共有的,因此您的BBB应该具有4096字节的终端缓冲区。