RS-232 目前是 PC 世界中最常见的串行通信标准。它使用多个电路来传输单个比特,以及进行同步。额外的线路可以用于指示载波的存在(由调制解调器使用)和用于握手。Linux 支持各种使用 RS-232 标准的串行卡。
硬件握手是可选的,但非常有用。它允许两个站点中的任何一个站点发出信号,表明它是否准备好接收更多数据,或者另一个站点是否应该暂停,直到接收器完成处理传入的数据。用于此目的的线路分别称为“清除发送 (CTS)”和“请求发送 (RTS)”,这解释了硬件握手的俗称:“RTS/CTS”。您可能熟悉的另一种握手类型称为“XON/XOFF”握手。XON/XOFF 使用两个指定的字符,通常是 Ctrl-S 和 Ctrl-Q,向远程端发出信号,表明它应该分别停止和开始传输数据。虽然这种方法易于实现,并且适用于哑终端,但当您处理二进制数据时,它会引起很大的混乱,因为您可能希望将这些字符作为数据流的一部分传输,而不是将它们解释为流控制字符。它生效也比硬件握手慢一些。硬件握手是干净、快速的,并且在您可以选择时,建议优先于 XON/XOFF。
在最初的 IBM PC 中,RS-232 接口由一个名为 8250 的 UART 芯片驱动。在 486 时代左右的 PC 使用了更新版本的 UART,称为 16450。它比 8250 稍快。几乎所有基于奔腾的机器都配备了更新版本的 UART,称为 16550。一些品牌(最值得注意的是配备 Rockwell 芯片组的内置调制解调器)使用完全不同的芯片,这些芯片模拟 16550 的行为,并且可以类似地处理。Linux 在其标准串行端口驱动程序中支持所有这些。[1]
16550 比 8250 和 16450 有了显著的改进,因为它提供了 16 字节的 FIFO 缓冲区。16550 实际上是一个 UART 设备系列,包括 16550、16550A 和 16550AFN(后来更名为 PC16550DN)。这些差异与 FIFO 是否真正工作有关;16550AFN 是肯定能工作的那一个。还有一个 NS16550,但它的 FIFO 也从未真正工作过。
8250 和 16450 UART 具有简单的 1 字节缓冲区。这意味着 16450 为每个发送或接收的字符生成一个中断。每个中断都需要很短的时间来处理,而这种小的延迟将 16450 的可靠最大比特率限制在典型的 ISA 总线机器中约为 9,600 bps。
在默认配置中,内核检查四个标准串行端口,COM1: 到 COM4:。内核还能够自动检测每个标准串行端口使用了哪个 UART,并将利用 16550 的增强型 FIFO 缓冲区(如果可用)。
[1] | 请注意,我们这里不是在谈论 WinModem™!WinModem 具有非常简单的硬件,并且完全依赖您计算机的主 CPU 而不是专用硬件来完成所有的繁重工作。如果您要购买调制解调器,我们强烈建议不要购买这种调制解调器;购买真正的调制解调器。您可能会发现 Linux 支持 WinModem,但这只会使它们成为稍微更有吸引力的解决方案。 |