C linux中的串行缓冲区有多长?

C linux中的串行缓冲区有多长?,c,buffer,uart,tty,termios,C,Buffer,Uart,Tty,Termios,我的问题是关于。据我所知,通过UART读取数据时存在两个缓冲区——一个存储接收字节的硬件缓冲区和一个加载存储在硬件缓冲区中的数据的软件缓冲区。据我所知,这个软件缓冲区是read(uart\U通道,缓冲区,长度)中的第二个参数 请解释:硬件缓冲区有多长?我能控制它的长度吗?对我来说,读取设备通过UART发送的12个最新字节是至关重要的-我如何确保这一点?我曾经遇到过类似的情况,我所做的是创建一个线程,该线程继续读取UART(阻塞读取),并且在线程之间使用FIFO 如果不能使用线程,可以只使用sel

我的问题是关于
。据我所知,通过UART读取数据时存在两个缓冲区——一个存储接收字节的硬件缓冲区和一个加载存储在硬件缓冲区中的数据的软件缓冲区。据我所知,这个软件缓冲区是
read(uart\U通道,缓冲区,长度)
中的第二个参数


请解释:硬件缓冲区有多长?我能控制它的长度吗?对我来说,读取设备通过UART发送的12个最新字节是至关重要的-我如何确保这一点?

我曾经遇到过类似的情况,我所做的是创建一个线程,该线程继续读取UART(阻塞
读取
),并且在线程之间使用FIFO


如果不能使用线程,可以只使用
select

我见过的大多数uC都有一个硬件FIFO,可以设置为在[1,2,4,8,16]字节之后中断。如果FIFO在当前配置波特率的字符间隔的某个小倍数内处于“部分满”状态,UART仍会中断。如果您确实必须尽快访问字节,则需要将FIFO“长度”设置为1。当然,您的驱动程序在初始化UART时应该这样做


如果做不到这一点,我想您可以对其进行轮询:(

您提供给
read()
的缓冲区是您的应用程序的缓冲区,任何可用的串行数据都将写入该缓冲区。这是应用程序级别,因此它当然不是驱动程序缓冲的一部分。实际的硬件缓冲(FIFO)当然,它将依赖于硬件,你不说你在使用什么。内核中还有一个缓冲区,我没有弄清楚它的大小(以及它是否可以改变).@unwind我使用的是raspberry pi 1型号B+。没有办法清除termios中的硬件缓冲区吗?我见过的大多数uC都有一个硬件FIFO,可以设置为在[1,2,4,8,16]之后中断字节。如果您确实必须尽快访问字节,那么您需要将FIFO“长度”设置为1。当然,您的驱动程序在初始化UART时应该这样做。感谢您的建议。为了澄清,我使用的是Raspberry Pi 1模型B+。我确实有一个读取UART的pthread,但它也会进行过滤,因此读取uart只有在它已经被更多的值填满之后。我已经在使用阻塞读取(VTIME=0,VMIN=12)。有没有办法只清除硬件缓冲区?在另一个线程中也进行过滤。你可以尝试
tcflush
,它应该可以工作。@space_voyager“我已经在使用阻塞读取(VTIME=0,VMIN=12)”--这是一种特殊的非规范模式,通常会导致同步问题。很可能你问的是XY问题。也就是说,你问的问题是错误的。