我正在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软件的大小是多少?有人可以为我启发这个领域吗?
然后我尝试使用read(2)函数从此端口读取
而不是“ port”,实际上是从硬件设备中移走了几层,并从串行终端的系统缓冲区中读取。
我想知道参数计数的最大合理数字是多少,它与UART的FIFO缓冲区有何关系?
首先count
必须不大于提供的用户缓冲区。对于阻塞的[[read(),您可以使此count
与您可以分配的任何缓冲区一样大。对于无阻塞read(),比终端接收缓冲区大的count
毫无意义。请注意,count
仅仅是一个请求,并且read() syscall可以返回的字节数少于请求的字节数。
这是真的吗?如果是,fifo软件的大小是多少?
是,终端接收缓冲区通常为4096字节,尽管您可以编写自己的具有不同大小的线路规则,或者重新定义宏。来自
include / linux / tty.h
:#define N_TTY_BUF_SIZE 4096