使用UART进行流量控制

时间:2017-09-21 00:10:17

标签: linux serial-port microcontroller uart

考虑我想要连接两个微控制器(一个运行Linux的主机,一个从机)。考虑主设备要求从设备发送一些数据块。为了争论,这块数据大16 KB。

据了解,UART不提供双向流量控制。在我的例子中,主机只有4个UART引脚:TX,RX,RTS和CTS。据我所知,RTS / CTS保护从机的接收缓冲区不会溢出。但是,在上面的例子中,主设备的接收缓冲区实际上可能会溢出。原因是Linux内核似乎确实使用了大约4095字节的接收缓冲区。如果用户空间应用程序没有足够快地读取数据,那么缓冲区就会溢出。例如,用户空间应用程序可能在磁盘或网络I / O上停止。

使用特殊带内转义序列的软件流控制似乎也存在缺陷。基本上,经典的XON / XOFF软件流控制要求主机在其接收缓冲区溢出之前发送一些XOFF控制字符。在用户空间应用程序中执行此操作似乎是错误的,因为用户空间应用程序无法保证及时发送XOFF。因此,除非它是Linux内核驱动程序的一部分,否则它将无法可靠地运行。但是,我找不到有关内核驱动程序是否发送XOFF控制字符(以及何时)的任何信息。此外,从属设备将花费一些时间来响应传入的XOFF。奴隶有多快反应?如果Linux内核驱动程序发送XOFF,它对从属设备有什么假设?

现在,我喜欢TCP所做的某种流量控制:当主机读取数据时,它会向从机发送确认。主机读取的每N个字节,它将向从机发送一个Ack。这告诉从机,现在主机的接收缓冲区中有N个字节可用。如果从器件估计了主器件的初始接收缓冲器大小,则应该可以正常工作。那当然需要向Linux内核询问接收缓冲区的总大小。

这引出了以下一系列问题:

  1. 人们如何使用UART实际实现两个方向的流量控制?
  2. 如何从内核获取接收缓冲区大小?像pyserial这样的API似乎没有提供任何东西。 (我上面给出的4095是我自己实验的结果,并且通过查看内核源代码得到了证实)
  3. 用户空间应用程序可以扩大内核的接收缓冲区吗?同样,像pyserial这样的API不提供任何东西,内核源代码看起来不像缓冲区的大小可调。
  4. 除USB(具有流量控制)外,人们还会使用什么作为UART的替代品来避免这些问题?
  5. 更新:许多消息来源仍然声明主设备在想要向从设备发送数据时设置RTS(=请求发送)。然后,从设备通过设置CTS(=清除发送)来确认请求。这允许仅在一个方向上进行流量控制。然而,English Wikipedia on RS-232表明,在20世纪80年代,RTS线被重新定义为更适合称为RTR(准备接收)的东西。 RTR / CTS允许双向流量控制。

1 个答案:

答案 0 :(得分:0)

只有调制解调器等旧设备以您描述的方式使用硬件流控制,因为它们往往具有非常固定的主/从关系。

微控制器上的UART使用以下配置:

enter image description here

我认为您的误解源于这样一个事实,即您假设现代设备中只有一个RTS / CTS对,实际上有两个 - 每个派对一个。

与TX / RX线对非常相似,RTS / CTS在连接时需要越过,例如参见SiLabs AN0059以获得更深入的描述。这就是拍摄照片的地方。他们还简要描述了“遗留硬件流控制”。

1https://www.silabs.com/documents/public/application-notes/AN0059.pdf Silicon Laboratories AN0059