考虑我想要连接两个微控制器(一个运行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内核询问接收缓冲区的总大小。
这引出了以下一系列问题:
更新:许多消息来源仍然声明主设备在想要向从设备发送数据时设置RTS(=请求发送)。然后,从设备通过设置CTS(=清除发送)来确认请求。这允许仅在一个方向上进行流量控制。然而,English Wikipedia on RS-232表明,在20世纪80年代,RTS线被重新定义为更适合称为RTR(准备接收)的东西。 RTR / CTS允许双向流量控制。
答案 0 :(得分:0)
只有调制解调器等旧设备以您描述的方式使用硬件流控制,因为它们往往具有非常固定的主/从关系。
微控制器上的UART使用以下配置:
我认为您的误解源于这样一个事实,即您假设现代设备中只有一个RTS / CTS对,实际上有两个 - 每个派对一个。
与TX / RX线对非常相似,RTS / CTS在连接时需要越过,例如参见SiLabs AN0059以获得更深入的描述。这就是拍摄照片的地方。他们还简要描述了“遗留硬件流控制”。
1:https://www.silabs.com/documents/public/application-notes/AN0059.pdf Silicon Laboratories AN0059