您不必理解基础知识也能使用串口,但理解这些知识可能有助于在遇到问题时确定问题所在。本节不仅介绍新主题,还会更详细地重复上一节 硬件如何传输字节 中提到的一些内容。
UART 串口(或简称“串口”)是一种 I/O(输入/输出)设备。
I/O 设备只是一种将数据输入和输出计算机的方式。有许多类型的 I/O 设备,例如较旧的串口和并口、网卡、通用串行总线 (USB) 和火线等。大多数 2007 年之前的 PC 都有一到两个串口(在较旧的 PC 上)。每个串口在计算机背面都有一个 9 针连接器(有时是 25 针)。计算机程序可以将数据(字节)发送到发送引脚(输出),并从接收引脚(输入)接收字节。其他引脚用于控制目的和接地。
串口不仅仅是一个连接器。它将数据从并行转换为串行,并改变数据的电气表示。在计算机内部,数据位以并行方式流动(同时使用多条导线)。串行流是单根导线上的比特流(例如在串口连接器的发送或接收引脚上)。为了使串口创建这样的数据流,它必须将数据从并行(计算机内部)转换为发送引脚上的串行(反之亦然)。
串口的大部分电子元件都位于一个计算机芯片(或芯片的一部分)中,称为 UART。有关 UART 的更多详细信息,请参阅 什么是 UART? 部分。但您可能希望先完成本节,以便您有望理解 UART 如何融入整个体系结构中。
旧的 PC 使用 25 针连接器,但实际上只使用了大约 9 个引脚,因此后来大多数连接器只有 9 针。9 个引脚中的每一个通常连接到一根导线。除了用于发送和接收数据的两条导线外,另一个引脚(导线)是信号地。任何导线上的电压都是相对于这个地测量的。因此,用于双向数据传输的导线最少数量为 3 根。但已知在没有信号地线的情况下也能工作,但性能会降低,有时会出现错误。
还有更多的导线仅用于控制目的(信号),而不是用于发送字节。所有这些信号都可以共享在单根导线上,但实际上,每种类型的信号都有单独的专用导线。其中一些(或全部)控制导线称为“调制解调器控制线”。调制解调器控制线要么处于“置位”状态(开启)+5 伏,要么处于“复位”状态(关闭)-5 伏。其中一根导线用于向计算机发出信号,停止从串口电缆发送字节。相反,另一根导线向连接到串口的设备发出信号,停止向计算机发送字节。如果连接的设备是调制解调器,则其他导线可能会告诉调制解调器挂断电话线,或告诉计算机已建立连接或电话线正在振铃(有人试图呼入)。有关更多详细信息,请参阅 引脚排列和信号 部分。
串口(不是 USB)通常是 RS-232-C、EIA-232-D 或 EIA-232-E。这三者几乎相同。最初的 RS(推荐标准)前缀正式变为 EIA(电子工业协会),后来在 EIA 与 TIA(电信工业协会)合并后变为 EIA/TIA。EIA-232 规范也提供了同步(sync)通信,但 PC 上的硬件几乎总是缺少对同步的支持。RS 名称旨在过时,但仍然被广泛使用,并且将在本 HOWTO 中用于 RS-232。其他文档可能使用完整的 EIA/TIA 名称,或仅使用 EIA 或 TIA。有关其他(非 RS-232)串口的信息,请参阅 其他串行设备(非异步 RS-232) 部分。
由于计算机需要与每个串口通信,因此操作系统必须知道每个串口的存在及其位置(其 I/O 地址)。它还需要知道串口必须使用哪根导线(IRQ 编号)来请求计算机 CPU 的服务。它通过在这根导线上发送中断电压来请求服务。因此,每个串口设备都必须在其非易失性存储器中存储其 I/O 地址和中断请求编号:IRQ。请参阅 中断。PCI 总线有自己的中断系统。但由于 PCI 感知 BIOS 将这些 PCI 中断设置为映射到 IRQ,因此它看起来的行为与上述描述相同。除了允许共享 PCI 中断(2 个或更多设备可以使用相同的 IRQ 编号)。
I/O 地址与内存地址不同。当 I/O 地址被放到计算机的地址总线上时,另一根导线被激活。这既告诉主存储器忽略该地址,又告诉所有具有 I/O 地址的设备(例如串口)监听总线上发送的地址,以查看它是否与设备的地址匹配。如果地址匹配,则 I/O 设备读取数据总线上的数据。
某个设备(例如 ttyS2)的 I/O 地址实际上是一个地址范围。此范围中的较低地址是基地址。“地址”通常仅指“基地址”。
串口被命名为 ttyS0、ttyS1 等(通常分别对应于 DOS/Windows 中的 COM1、COM2 等)。/dev 目录中为每个端口都有一个特殊文件。键入“ls /dev/ttyS*”以查看它们。仅仅因为可能存在(例如)ttyS3 文件,并不一定意味着那里存在物理串口。
这些名称(ttyS0、ttyS1 等)中的哪一个指的是哪个物理串口,确定方式如下。串行驱动程序(软件)维护一个表,显示哪个 I/O 地址对应于哪个 ttyS。可以通过“setserial”命令设置和查看名称(例如 ttyS1)到 I/O 地址(和 IRQ)的这种映射。请参阅 什么是 Setserial。这不会
设置硬件本身的 I/O 地址和 IRQ(这是由跳线或即插即用软件设置的)。因此,哪个物理端口对应于例如 ttyS1,取决于串行驱动程序的想法(通过 setserial)以及硬件中设置的内容。如果出现错误,则物理端口可能不对应于任何名称(例如 ttyS2),因此无法使用它。有关更多详细信息,请参阅 串口设备 /dev/ttyS2 等。
当串口接收到一定数量的字节(可以设置为 1、4、8 或 14)到其 FIFO 缓冲区时,它会向 CPU 发送一个电信号(称为中断),通常只由该端口使用,以指示 CPU 获取这些字节。因此,FIFO 会等待直到它接收到一定数量的字节,然后发出中断。
但是,如果在等待下一个字节到达时出现意外延迟(称为超时),也会发送此中断。因此,如果字节接收速度很慢(例如来自某人在终端键盘上打字),则对于接收到的每个字节都可能发出中断。对于某些 UART 芯片,规则是这样的:如果在一段时间内可以连续接收 4 个字节,但这些 4 个字节都没有出现,则端口会放弃等待更多字节,并发出中断以获取当前 FIFO 中的字节。当然,如果 FIFO 为空,则不会发出中断。
每条中断导体(计算机内部)都有一个编号 (IRQ),串口必须知道使用哪条导体来发出信号。例如,ttyS0 通常使用 IRQ 编号 4,称为 IRQ4(或 IRQ 4)。可以在“man setserial”(搜索“配置串口”)中找到它们的列表和更多信息。当串口需要引起 CPU 的注意时,就会发出中断。及时执行此操作非常重要,因为串口内部的缓冲区只能容纳 16 个传入字节。如果 CPU 未能及时删除这些接收到的字节,则将没有空间容纳更多传入字节,并且小缓冲区可能会溢出(过载),从而导致数据字节丢失。
没有 流量控制 来防止这种情况发生。
当串口刚刚从其小型发送 FIFO 缓冲区中向外部电缆发送完所有字节时,也会发出中断。然后它有空间容纳 16 个更多的传出字节。中断是为了通知 CPU 这一事实,以便它可以将更多字节放入小型发送缓冲区以进行传输。此外,当调制解调器控制线的状态发生变化时,也会发出中断。
上面提到的缓冲区都是硬件缓冲区。串口在主内存中也有更大的缓冲区。这将在后面解释。
中断间接地传递大量信息。中断本身只是告诉一个称为中断控制器的芯片,某个串口需要关注。然后,中断控制器向 CPU 发出信号。然后,CPU 运行一个特殊的程序来服务串口。该程序称为中断服务例程(串行驱动程序软件的一部分)。它试图找出串口发生了什么,然后处理问题,例如从(或向)串口的硬件缓冲区传输字节。该程序可以轻松找出发生了什么,因为串口在串行驱动程序软件已知的 IO 地址处具有寄存器。这些寄存器包含有关串口的状态信息。软件读取这些寄存器,并通过检查内容,找出发生了什么并采取适当的措施。
数据(表示字母、图片等的字节)流入和流出您的串口。流速(例如 56k (56000) 位/秒)被(不正确地)称为“速度”。但几乎每个人都说“速度”而不是“流速”。
重要的是要理解,平均速度通常低于指定速度。等待(或空闲时间)会导致平均速度降低。这些等待可能包括由于 流量控制 而导致的可能长达一秒的长时间等待。在另一个极端,字节之间可能存在几个微秒的非常短的等待(空闲时间)。如果串口上的设备(例如调制解调器)无法接受完整的串口速度,则必须降低平均速度。
流量控制是指减慢导线中字节流的能力。对于串口,这意味着能够在不丢失任何字节的情况下停止然后重新启动数据流的能力。调制解调器和其他硬件需要流量控制,以允许瞬时流速的跳跃。
例如,考虑您通过短电缆将 33.6k 外部调制解调器连接到串口的情况。调制解调器通过电话线以 33.6k 位/秒 (bps) 的速度发送和接收字节。假设它没有进行任何数据压缩或纠错。您已将串口速度设置为 115,200 位/秒 (bps),并且您正在从计算机向电话线发送数据。然后,从您的计算机到调制解调器的短电缆上的数据流速度为 115.2k bps。但是,从您的调制解调器到电话线的输出流速仅为 33.6k bps。由于进入调制解调器的流速(115.2k)快于从调制解调器出来的流速,因此调制解调器将多余的流量(115.2k - 33.6k = 81.6k bps)存储在其缓冲区之一中。除非停止高 115.2k 流量,否则此缓冲区很快会溢出(耗尽可用存储空间)。
但现在流量控制来救援了。当调制解调器的缓冲区几乎满时,调制解调器会向串口发送停止信号。串口将停止信号传递给设备驱动程序,并且 115.2k bps 的数据流停止。然后,调制解调器继续以 33.6k bps 的速度发送数据,利用它先前在其缓冲区中累积的数据。由于没有任何数据进入此缓冲区,因此其中的字节数开始下降。当缓冲区中几乎没有剩余字节时,调制解调器向串口发送启动信号,并且从计算机到调制解调器的 115.2k 数据流恢复。实际上,流量控制在短电缆中创建了一个平均流速(在本例中为 33.6k),该平均流速明显低于 115.2k bps 的“开启”流速。这就是“启动-停止”流量控制。
在上面的简单示例中,假设调制解调器没有进行数据压缩。当调制解调器发送已压缩且无法进一步压缩的文件时,可能会发生这种情况。现在让我们考虑相反的极端情况,即调制解调器正在以高压缩率压缩数据。在这种情况下,调制解调器可能需要 115.2k bps 的输入流速才能提供 33.6k bps(压缩数据)的输出(到电话线)。此压缩比为 3.43 (115.2/33.6)。在这种情况下,只要压缩比保持高于 3.43,调制解调器就能够压缩 115.2 bps 的 PC 到调制解调器的数据流,并以 33.6bps 的速度通过电话线发送相同的数据(以压缩形式)。这里不需要流量控制,只要压缩比保持高于 3.43 即可。但压缩比每秒都在变化,如果它降至 3.43 以下,则将需要流量控制。
在上面的示例中,调制解调器是外部调制解调器。但截至 2003 年初,大多数内置调制解调器也存在相同的情况。即使此数据流没有通过外部电缆发生,PC 到调制解调器速度仍然存在速度限制。这使得内置调制解调器与外部调制解调器兼容。
在上述流量控制示例中,数据流是从计算机到调制解调器。但也有用于相反方向数据流的流量控制:从调制解调器(或其他设备)到计算机。每个数据流方向都涉及 3 个缓冲区:1. 在调制解调器中 2. 在 UART 芯片中(称为 FIFO)和 3. 在主内存中,由串行驱动程序管理。流量控制保护所有缓冲区(FIFO 除外)免于溢出。
在 Linux 下,小型 UART FIFO 缓冲区不受流量控制保护,而是依赖于对其发出的中断的快速响应。某些 UART 芯片可以设置为执行硬件流量控制以保护其 FIFO,但 Linux(截至 2003 年初)似乎不支持它。FIFO 代表“先进先出”,这是它处理队列中字节的方式。所有 3 个缓冲区都使用 FIFO 规则,但只有 UART 中的缓冲区被命名为“FIFO”。这是流量控制的本质,但还有一些更多细节。
理解流量控制理论可能具有实际用途。无流量控制的症状是从没有流量控制优势发送的文件中丢失数据块。当发生溢出时,通常会丢失数百甚至数千字节的数据,并且全部都是连续的数据块。
如果可行,最好使用“硬件”流量控制,它使用两条专用的“调制解调器控制”导线来发送“停止”和“启动”信号。串口上的硬件流量控制的工作方式如下:使用两个引脚,RTS(请求发送)和 CTS(清除发送)。当计算机准备好接收数据时,它通过在 RTS 引脚上施加正电压来置位 RTS(表示“请求发送给我”)。当计算机无法接收更多字节时,它通过在引脚上施加负电压来复位 RTS,表示:“停止发送给我”。RTS 引脚通过串行电缆连接到调制解调器、打印机、终端等上的另一个引脚。此另一个引脚的唯一功能是接收此信号。
对于调制解调器的情况,此“另一个”引脚将是调制解调器的 RTS 引脚。但对于打印机、另一台 PC 或非调制解调器设备,它通常是 CTS 引脚,因此需要“交叉”或“零调制解调器”电缆。此电缆将一端的 CTS 引脚与另一端的 RTS 引脚连接(两条导线,因为电缆的每一端都有一个 CTS 引脚)。对于调制解调器,使用直通电缆。
对于相反方向的数据流,使用类似的方案。对于调制解调器,CTS 引脚用于向 PC 上的 CTS 引脚发送流量控制信号。对于非调制解调器,RTS 引脚发送信号。因此,调制解调器和非调制解调器互换了其 RTS 和 CTS 引脚的角色。某些非调制解调器(例如哑终端)可能会使用其他引脚进行流量控制,例如 DTR 引脚而不是 RTS。
软件流量控制使用主接收和发送数据导线来发送启动和停止信号。它为此目的使用 ASCII 控制字符 DC1(启动)和 DC3(停止)。它们只是插入到常规数据流中。软件流量控制不仅反应较慢,而且不允许发送二进制数据,除非采取特殊预防措施。由于二进制数据很可能包含 DC1 和 DC3 字符,因此必须采取特殊措施来区分表示流量控制停止的 DC3 和作为二进制代码一部分的 DC3。DC1 也是如此。
已经提到,每个数据流方向都有 3 个缓冲区(总共 3 对):16 字节 FIFO 缓冲区(在 UART 中)、连接到串口的设备(例如调制解调器)内部的一对更大的缓冲区,以及主内存中的一对缓冲区(例如 8k)。当应用程序将字节发送到串口时,它们首先会被存放在主内存中的发送串口缓冲区中。这对缓冲区的另一个成员由用于字节流相反方向的接收缓冲区组成。这是一个使用浏览器浏览 Internet 的情况的示例图。发送数据流从左到右,而接收数据流从右到左。每个数据流方向都有单独的缓冲区。
application 8k-byte 16-byte 1k-byte tele- BROWSER ------- MEMORY -------- FIFO --------- MODEM -------- phone program buffer buffer buffer line
对于发送情况,串行设备驱动程序每次从主内存中的此发送缓冲区中取出例如 15 个字节,并将它们放入串行 UART 中的 16 字节发送缓冲区中进行传输。一旦进入该发送缓冲区,就无法阻止它们被传输。然后,它们被传输到调制解调器或(连接到串口的其他设备),该设备也有一个相当大的(例如 1k)缓冲区。当设备驱动程序(根据从调制解调器发送的流量控制命令)停止从计算机发送输出字节流时,它实际停止的是从主内存中的大型发送缓冲区发送输出字节流。即使在此发生之后并且到调制解调器的数据流已停止,应用程序也可能继续向 8k 发送缓冲区发送字节,直到它满为止。同时,存储在 FIFO 中的字节继续被发送出去。除非调制解调器从电话线另一端的调制解调器收到调制解调器到调制解调器的流量控制停止,否则存储在调制解调器中的字节将继续通过电话线发送出去。
当内存缓冲区满时,应用程序无法向其发送更多字节(C 程序中的“write”语句会阻塞),并且应用程序暂时停止运行并等待,直到有可用的缓冲区空间。因此,流量控制“停止”最终能够停止正在发送字节的程序。即使此程序停止,计算机也不一定会停止计算,因为它可能会在等待流量控制停止时切换到运行其他进程。
以上在三个方面有些过于简化。首先,某些 UART 可以执行自动硬件流量控制,如果需要,可以停止从 FIFO 缓冲区传输(Linux 尚不支持)。其次,当应用程序进程正在等待写入发送缓冲区时,它可能会执行其他任务。第三,串行驱动程序(位于内存缓冲区和 FIFO 之间)有它自己的小型缓冲区(在主内存中),用于处理字符。
对于许多情况,存在一个涉及多个链接的发送路径,每个链接都有自己的流量控制。例如,我在连接到 PC 的文本终端上键入内容,而 PC(在我的控制下)使用调制解调器拨号连接到另一台计算机。如今,“文本终端”很可能只是另一台模拟文本终端的 PC。主(服务器)PC 除了为我的文本终端提供服务外,还可能有其他人坐在那里做其他事情。请注意,将此 PC 称为“服务器”在技术上是不正确的,但它确实为终端提供服务。
文本终端使用命令行界面,没有图形显示。我在文本终端上键入的每个字母都通过串行电缆传输到我的主 PC,然后通过电话线传输到我拨号连接的计算机。为了拨号,我使用了通信软件:“minicom”,它在我的 PC 上运行。
这听起来像一个简单的数据路径。我按下一个键,该键生成的字节仅通过两条电缆(键盘电缆除外)流动:1. 从我的文本终端到我的 PC 的电缆,以及 2. 到其他计算机的电话线电缆。当然,电话电缆实际上是许多电话系统电缆,并且包括交换机和电子设备,以便单根物理电缆可以传输多个电话呼叫。但我可以将其视为一根电缆(或一个链路)。
现在,让我们计算一下每个击键字节必须通过的电子设备的数量和类型。终端到 PC 电缆的两端都有一个串口。电话电缆的两端都有一个串口和一个调制解调器。这加起来是 4 个串口和 2 个调制解调器。由于每个串口都有 2 个缓冲区,每个调制解调器有 1 个缓冲区,因此加起来是 10 个缓冲区。这只是一个数据流方向。每个字节还必须通过 minicom 软件。
虽然在上述场景中只有 2 条电缆,但如果使用外部调制解调器,则每个调制解调器及其串口之间将有一条额外的电缆。这使得总共有 4 条电缆。即使使用内置调制解调器,调制解调器与其串口之间也好像存在“虚拟电缆”。在所有这 4 个链路(或电缆)上,都会发生流量控制。
现在让我们考虑一个流量控制操作的示例。考虑从电话线另一端的远程计算机到我坐在的文本终端屏幕的字节流。真正的文本终端对其屏幕上可以显示字节的速度有限制,并且会不时发出流量控制“停止”以减慢数据流。此“停止”沿与其控制的字节流相反的方向传播。当发出这样的“停止”时会发生什么?让我们考虑这样一种情况,即“停止”等待足够长的时间,然后再用“启动”取消它,以便它到达电话线另一端的远程计算机。当它到达那里时,它将停止远程计算机上正在发送字节的程序。
让我们追踪一下这个“停止”的流程(在某些链路上可能是“硬件”,而在另一些链路上可能是“软件”)。首先,假设我正在“捕获”远程计算机上的一个长文件,该文件同时发送到我的文本终端和我硬盘上的一个文件。字节的传入速度快于终端可以处理的速度,因此它从其串口向我的 PC 上的串口发送“停止”。设备驱动程序检测到它并停止从主内存中的 8k PC 串行缓冲区向终端发送字节。但 minicom 仍然继续向此 8k 缓冲区发送用于终端的字节。
当此 8k 发送缓冲区(在第一个串口上)已满时,minicom 必须停止向其写入。Minicom 停止并等待。但这也导致 minicom 停止从连接到调制解调器的第二个串口上的 8k 接收缓冲区读取数据。来自调制解调器的数据流继续,直到此 8k 缓冲区也填满并向调制解调器发送不同的“停止”。现在调制解调器的缓冲区停止向串口发送数据,并且也填满了。调制解调器(假设启用了纠错功能)向远程计算机上的另一个调制解调器发送“停止信号”。此调制解调器停止从其缓冲区发送字节,当其缓冲区变满时,会向远程计算机的串口发送另一个停止信号。在远程计算机上,8-k(或其他大小)缓冲区填满,并且远程计算机上的程序无法再向其写入数据,因此暂时暂停。
因此,来自文本终端的停止信号已暂停了远程计算机上的程序。多么漫长的一系列事件!请注意,停止信号通过了 4 个串口、2 个调制解调器和一个应用程序(minicom)。每个串口都有 2 个缓冲区(在一个数据流方向上):8k 缓冲区和硬件 16 字节缓冲区。应用程序可能在其 C_code 中有一个缓冲区。这加起来是数据正在通过的 11 个不同的缓冲区。请注意,小型串行硬件缓冲区不直接参与流量控制。另请注意,与文本终端的串口关联的两个缓冲区将在流量控制暂停期间将其内容转储到屏幕上。这留下了 9 个其他缓冲区,它们可能在流量控制暂停期间被填满。
如果终端速度限制是从远程计算机到终端的数据流的瓶颈,那么它的流量控制“停止”实际上正在停止从远程计算机发送数据的程序,如上所述。但您可能会问:一个“停止”怎么能持续这么长时间,以至于 9 个缓冲区(其中一些很大)都被填满了?这种情况很少发生,但如果当终端发出“停止”时所有缓冲区都接近其上限,则实际上可能会以这种方式发生。
但是,如果您对此运行模拟,您会发现它通常比这更复杂。在某个时间点,某些链路正在流动,而另一些链路由于流量控制而停止。“停止”很少像上面描述的那样整齐地从终端传播回远程计算机。可能需要来自终端的几个“停止”才能导致远程计算机上的一个“停止”等等。要了解正在发生的事情,您真的需要观察一个模拟,这可以针对一个简单的情况完成,例如在桌子上使用硬币。仅使用少量缓冲区,并将每个缓冲区的上限设置为仅几个硬币。
真的需要理解所有这些吗?好吧,理解这一点向我解释了为什么从远程计算机捕获文本会丢失文本。情况与上面的示例完全相同,但调制解调器到调制解调器的流量控制被禁用。本应也到达我硬盘的捕获文本块从未到达那里,这是因为终端的流量控制“停止”导致我的调制解调器缓冲区溢出。即使远程计算机具有通往硬盘的无瓶颈数据流路径,相同的数据流也流向了终端,该终端发出了流量控制“停止”,这对流向硬盘上的文件的分支造成了灾难性后果。流向硬盘的数据流通过了我的调制解调器,并且由于溢出发生在调制解调器处,因此原本用于硬盘的字节丢失了。
串行端口的设备驱动程序是操作串行端口的软件。现在它作为一个串行模块提供。从内核 2.2 开始,如果需要,这个模块通常会自动加载。在较早的内核中,您必须运行 kerneld
才能按需自动加载模块。否则,串行模块需要显式列在 /etc/modules 中。在模块在 Linux 中流行之前,串行驱动程序通常内置于内核中(有时仍然是)。如果是内置的,请不要让串行模块加载,否则您将同时运行两个串行驱动程序。使用 2 个驱动程序会出现各种错误,包括尝试打开串行端口时可能出现的“I/O 错误”。使用 “lsmod” 查看模块是否已加载。
当串行模块加载时,它会在屏幕上显示有关现有串行端口的消息(通常显示错误的 IRQ)。但是,一旦 setserial
使用该模块来告知设备驱动程序(希望是)正确的 IRQ,您应该会看到第二个显示,类似于第一个显示,但具有正确的 IRQ 等。请参阅 串行模块。有关 setserial
的更多信息,请参阅 什么是 Setserial。
串行端口在今天(2011 年)在 PC 上有点过时(通常被称为“遗留”设备),但它仍然在一些较旧的计算机上使用,并用于嵌入式系统、与路由器和销售点设备的通信等。串行端口是慢速的,并且在 2005 年之后,大多数新 PC 都不再配备串行端口。大多数笔记本电脑和 Mac 甚至更早地停止使用它们。在某些新 PC 配备串行端口而另一些没有配备串行端口的时代,没有串行端口的 PC 被委婉地称为“无遗留”。然而,虽然今天的 PC 不再有串行端口,但有些 PC 在“遗留”调制解调器(插入电话线)中内置了串行端口。这种串行端口仅适用于调制解调器,不能用于任何其他设备。它们具有这种“内置”串行端口的原因是模拟调制解调器被设计为只能通过串行端口工作。
PC 背面的物理串行端口(包括与其内部连接的芯片)必须在计算机和外部电缆之间传递数据。因此,它有两个接口:串行端口到电缆接口和串行端口到计算机总线接口。这两个接口都很慢。首先,我们将考虑通过外部电缆连接到外部世界的接口。
传统的 RS-232 串行端口本质上是低速的,并且距离受到严重限制。广告经常写着“高速”,但它只能在非常短的距离内以“高速”工作,例如到位于计算机旁边的调制解调器。与网卡相比,即使这种“高速”实际上也是低速的。所有 RS-232 串行电缆线都使用公共接地回路线,因此在没有额外硬件的情况下无法使用双绞线技术(高速所需)。存在更现代的串行端口接口,但它们不像 RS-232 那样是 PC 上的标准配置。请参阅RS-232 的后继者。一些多端口串行卡支持它们。
有点悲剧的是,1969 年的 RS-232 标准没有使用双绞线技术,该技术可以快大约一百倍。自 1800 年代后期以来,双绞线已用于电话电缆。1888 年(120 多年前),“电缆会议”报告了其对双绞线(用于电话系统)的支持,并指出了其优势。但在“电缆会议”批准 80 多年后,RS-232 未能利用它。由于 RS-232 最初是为将终端连接到附近的低速调制解调器而设计的,因此显然没有认识到对高速和更长距离传输的需求。结果是,由于串行端口无法处理高速,因此设计了可以实现高速的新型串行接口:以太网、USB、火线等。最终的结果是串行端口的消亡,由于其古老的技术,它变得不适用于高速用途。
串行端口通过 PCI 总线、LPC 总线、X 总线或 ISA 总线与计算机通信。PCI 总线现在是 32 位或 64 位宽,但串行端口一次只发送一个字节(8 位宽),这浪费了 PCI 总线带宽。LPC 总线则不然,它只有 4 位宽的总线,因此提供了高效的接口。ISA 总线通常是 16 位宽,与高效的 LPC 和低效的 PCI 相比,其效率介于两者之间。