下一页 上一页 目录

23. 附录 C: EIA-232 (RS-232) 串行通信

23.1 串行通信简介

(本节的大部分内容现在可以在 Serial-HOWTO 中找到。)在类 Unix 系统(和 PC)上的文本终端通常连接到计算机的异步 232 串行端口。通常是 RS-232-C、EIA-232-D 或 EIA-232-E。这三者几乎是相同的。最初的 RS 前缀变为 EIA(电子工业协会),在 EIA 与 TIA(电信工业协会)合并后又变为 EIA/TIA。EIA-232 规范也提供了同步(sync)通信,但 PC 上几乎总是缺少支持同步的硬件。RS designation 已过时,但仍在使用。本文将使用 EIA。

串行端口不仅仅是计算机或终端背面的物理连接器。它包括相关的电子设备,这些设备必须产生符合 EIA-232 规范的信号。标准连接器有 25 个引脚,其中大多数未使用。另一种连接器只有 9 个引脚。一个引脚用于发送数据字节,另一个用于接收数据字节。另一个引脚是公共信号地。其他“有用”的引脚主要用于信号目的,稳定的负电压表示“关”,稳定的正电压表示“开”。

UART(通用异步接收器-发送器)芯片完成了大部分工作。如今,此芯片的功能通常内置于另一个芯片中。

23.2 电压

一个比特的电压

在 EIA-232 串行端口,电压是双极性的(相对于地为正或负),幅度应约为 12 伏(较新的为 5 伏,但此处给出了 12 伏的示例)。对于发送和接收引脚,+12 伏是 0 比特(有时称为“space”),-12 伏是 1 比特(有时称为“mark”)。这被称为反向逻辑,因为通常 0 比特既为假又为负,而 1 比特通常既为真又为正。虽然接收和发送引脚是反向逻辑,但其他引脚(调制解调器控制线)是正常逻辑,正电压为真(或“开”或“asserted”),负电压为假(或“关”或“negated”)。零电压没有意义(除非它通常意味着 PC 已关闭)。

允许一定的电压范围。规范指出,发送信号的幅度应在 5 到 15 伏之间,但绝不能超过 25 伏。任何低于 3 伏的接收电压都是未定义的(但某些终端会接受较低的电压作为有效电压)。有时会看到错误的说法,即电压通常为 5 伏(甚至 3 伏),但在较旧的 PC 上通常为 11-12 伏。如果您在 Mac 计算机上使用 EIA-422 端口作为 EIA-232(需要专用电缆)或 EIA-423,则电压实际上仅为 5 伏。此处的讨论假设为 12 伏。互联网上关于电压有很多困惑。

请注意,正常的计算机逻辑通常只有几伏(5 伏曾经是标准),因此,如果您尝试在 12 伏串行端口上使用为测试 3-5 伏计算机逻辑 (TTL) 而设计的测试设备,则可能会损坏测试设备。

一个字节的电压序列

当没有数据发送时,发送引脚 (TxD) 在空闲时保持在 -12 伏(mark)。为了开始一个字节,它跳到 +12 伏(space)作为起始位,并在起始位的持续时间(周期)内保持在 +12 伏。接下来是数据字节的低位。如果是 0 比特,则没有任何变化,线路在另一个比特周期内保持在 +12 伏。然后是下一个比特,等等。最后,可能会发送一个奇偶校验位,然后是一个 -12 伏(mark)停止位。线路保持在 -12 伏(空闲)直到下一个起始位。请注意,没有返回到 0 伏,因此没有简单的方法(除非通过同步信号)来判断一个比特在哪里结束,下一个比特在哪里开始,对于 2 个连续比特极性相同(均为零或均为一)的情况。

第二个停止位也将是 -12 伏,与第一个停止位相同。由于没有信号来标记这些比特之间的边界,第二个停止位的唯一作用是线路必须保持在 -12 伏空闲两倍的时间。接收器无法检测到第二个停止位和字节之间更长的空闲时间之间的差异。因此,如果一端使用一个停止位,另一端使用 2 个停止位,则通信可以正常工作,但仅使用一个停止位显然更快。在极少数情况下,使用 1 1/2 个停止位。这意味着线路保持在 -12 伏 1 1/2 个时间周期(就像一个比正常宽度宽 50% 的停止位)。

23.3 奇偶校验解释

字符通常以 7 位或 8 位(数据)传输。可能会(也可能不会)向其附加一个额外的奇偶校验位,从而导致字节长度为 7、8 或 9 位。一些终端仿真器和较旧的终端不允许 9 位。如果使用 2 个停止位,则有些会禁止 9 位(因为这将使总位数过大:总共 12 位)。

奇偶校验可以设置为奇校验、偶校验或无校验(mark 和 space 奇偶校验可能是某些终端上的选项)。对于奇校验,选择奇偶校验位,使字节中 1 比特的数量(包括奇偶校验位)为奇数。如果这样的字节被翻转的比特损坏,结果将是一个非法的偶校验字节。将检测到此错误,如果是到终端的传入字节,屏幕上将显示一个错误字符符号。偶校验的工作方式类似,所有合法的字节(包括奇偶校验位)都具有偶数个 1 比特。在设置过程中,每个字符的位数通常仅表示每个字节的数据位数(对于真正的 ASCII 为 7 位,对于各种 ISO 字符集为 8 位)。

“mark”是 1 比特(或逻辑 1),“space”是 0 比特(或逻辑 0)。对于 mark 奇偶校验,奇偶校验位始终为 1 比特。对于 space 奇偶校验,它始终为 0 比特。Mark 或 space 奇偶校验只会浪费带宽,应在可行的情况下避免使用。“无奇偶校验”表示不添加奇偶校验位。对于不允许 9 位字节的终端,在使用 8 位字符集时必须选择“无奇偶校验”,因为没有奇偶校验位的空间。

23.4 字节构成(成帧)

在通过 EIA-232 端口串行传输字节时,始终首先发送低位。PC 上的串行端口使用异步通信,其中有一个起始位和一个停止位来标记字节的开始和结束。这称为成帧,成帧的字节有时称为帧。因此,每个字节总共发送 9、10 或 11 位,其中 10 位是最常见的。8-N-1 表示 8 个数据位、无奇偶校验、1 个停止位。当计算起始位时,总共加起来为 10 位。一个停止位几乎被普遍使用。在 110 位/秒(有时在 300 位/秒)时,曾经使用过 2 个停止位,但如今第二个停止位仅在非常特殊的情况下使用(或由于错误,因为它似乎仍然可以正常工作)。

23.5 EIA-232 的局限性

低速和短距离

传统的 EIA-232 串行端口本质上是低速的,并且在距离上受到严重限制。广告中经常写着“高速”,但它只能在非常短的距离内高速工作,例如到位于计算机旁边的调制解调器。所有电线都使用公共接地回路,因此在没有额外硬件的情况下,无法使用双绞线技术(高速所需)。然而,一些计算机具有更现代的接口。请参阅 EIA-232 的后继者

令人遗憾的是,1969 年的 RS-232 标准没有使用双绞线技术,该技术可以快大约一百倍。自 1800 年代后期以来,双绞线已用于电话电缆。在 1888 年(110 多年前),“电缆会议”报告说它支持双绞线(用于电话系统),并指出了其优势。但在“电缆会议”批准后的 80 多年里,RS-232 未能利用它。由于 RS-232 最初旨在将终端连接到附近的低速调制解调器,因此显然没有认识到对高速和更长距离传输的需求。

EIA-232 的后继者

有关非 EIA-232 端口的更详细讨论,请参阅 Serial-HOWTO 部分“其他串行设备”。已经制定了许多 EIA 标准,用于使用双绞线(平衡)技术实现更高的速度和更长的距离。平衡传输有时可以比不平衡 EIA-232 快一百倍。对于给定的速度,使用双绞线,距离(最大电缆长度)可能会长很多倍。似乎很少有终端支持它们。虽然许多终端也支持 EIA-423,但它几乎像 EIA-232,但只有 5 伏,速度稍高(不使用双绞线)。双绞线包括 EIA-422、EIA-530-A、HSSI(高速串行接口)、USB(通用串行总线),当然还有以太网。

线路驱动器

对于文本终端,EIA-232 速度足够快,但可用的电缆长度通常太短。平衡技术可以解决这个问题。使用文本终端获得平衡通信的常用方法是在串行线路中安装 2@ 线路驱动器,以将不平衡转换为平衡(反之亦然)。它们是专用物品,如果购买新的则很昂贵。

23.6 同步与同步

“异步”是如何同步的

根据 EIA-232,发送(或接收)线只有两种状态:mark (-12 伏) 或 space (+12 伏)。没有 0 伏状态。因此,1 比特的序列仅通过稳定的 -12 伏传输,比特之间没有任何类型的标记。为了让接收器检测到各个比特,它必须始终具有与发送器时钟同步的时钟信号。这样的时钟会生成一个与每个发送(或接收)的比特同步的“tick”。

对于异步传输,通过用起始位和停止位对每个字节进行成帧(由硬件完成)来实现同步。接收器在行上侦听起始位,当检测到起始位时,它开始其时钟滴答。它使用此时钟滴答来定时读取接下来的 7、8 或 9 位。(实际上这比这稍微复杂一些,因为通常会采集一个比特的几个样本,这需要额外的定时滴答。)然后读取停止位,时钟停止,接收器等待下一个起始位。因此,异步实际上在单个字节的接收期间是同步的,但在一个字节和下一个字节之间没有同步。

定义异步与同步

异步 (async) 意味着“非同步”。在实践中,异步信号是异步串行端口发送和接收的信号,这是一个字节流,每个字节都由起始位和停止位分隔。同步 (sync) 是几乎所有其他内容。但这并没有解释基本概念。

理论上,同步意味着字节以恒定的速率一个接一个地发送,与时钟信号滴答同步。通常有一根单独的电线或通道用于发送时钟信号。异步字节可能会以不规则的方式发送,字节之间有各种时间间隔(就像有人在键盘上键入字符一样)。

有一些需要分类为同步或异步的临界情况。异步串行端口通常以稳定的流发送字节,这将使其成为同步情况,但由于它们仍然具有起始/停止位(这使得可以不规则地发送它们),因此称为异步。另一种情况是将数据字节(没有任何起始-停止位)放入数据包中,数据包之间可能存在不规则的间隔。这称为同步,因为每个数据包中的字节必须同步传输。

同步通信

您是否想过串行端口的 25 针连接器上所有未使用的引脚是做什么用的?它们中的大多数用于同步通信,这在 PC 上很少实现。有用于同步定时信号以及同步反向通道的引脚。EIA-232 规范同时提供了同步和异步,但 PC 使用 UART(通用异步接收器/发送器)芯片,例如 16450、16550A 或 16650,并且无法处理同步。对于同步,需要 USART 芯片或等效芯片,其中“S”代表同步。由于同步是一个小众市场,因此同步串行端口可能非常昂贵。

除了 EIA-232 的同步部分外,还有各种其他 EIA 同步标准。对于 EIA-232,连接器的 3 个引脚保留用于时钟(或定时)信号。有时,调制解调器的任务是生成一些定时信号,这使得在没有同步调制解调器(或没有称为“同步调制解调器消除器”的设备来提供定时信号)的情况下无法使用同步通信。

虽然很少有串行端口是同步的,但同步通信通常通过电话线使用使用 V.42 纠错的调制解调器进行。这会剥离起始/停止位,并将日期字节放入数据包中,从而导致电话线上的同步操作。

23.7 块模式

块模式简介

块模式很少在 Linux 中使用,主要具有历史意义。在块模式下,当在终端上键入内容时,结果会保存在终端内存中,并且不会立即发送到主机计算机。这样的终端通常具有内置的编辑功能。当用户按下某些键(例如发送键)时,保存在终端内存中的内容将发送到主机计算机。现在,Linux 编辑器 vi 和 emacs 必须对键入某些键立即做出反应,因此块模式是不可行的。此类编辑器和其他交互式程序不允许将击键发送到计算机的长时间延迟,而这是块模式固有的。因此,它们不能使用块模式。

旧的 IBM 大型机接口使用块模式(参见 IBM 终端 因此许多 IBM 终端仅是块模式,并且也是同步的(参见“同步与同步”部分))。

块模式的类型,表单

块模式本身可能具有各种子模式,例如“页”(一次一页)和“行”(一次一行)。一些终端同时具有块传输模式和传统的字符模式,并且可以在一种模式和另一种模式之间切换。具有块模式的异步终端包括 HP2622A、Wyse60、VT130、VT131、VT330、VT340 和 Visual500。许多较新型号的终端可以模拟块模式。但 Linux 控制台不能。块模式可能包括表单功能,其中主机计算机将表单发送到终端。然后,用户填写表单并按下发送键,该键仅将表单中的数据发送回主机计算机。表单本身(不是数据)显示在屏幕上的受保护字段中,这些字段不会传输到主机。

效率

块模式减轻了主机计算机的负载,特别是当主机计算机的硬件专为块模式设计时(如 IBM 大型机)。在字符模式下,键入的每个字符都会立即发送到串行端口,并且通常会在主机计算机上引起中断。接收字节的主机必须停止正在执行的任何操作,并从端口硬件中获取该字符。即使使用具有 FIFO 硬件缓冲区的 UART,硬件超时通常也仅为 3 个字节的传输时间,因此通常为键入的每个字符发出中断。

在真正的块模式下,接收长字符块仅使用一次中断。如果块模式与传统的异步 FIFO 串行端口一起使用,则只需要每 14 个字节中断一次,因为它们具有 16 字节的硬件缓冲区。因此,消除了中断处理的大部分负载和开销,并且在使用块模式时,计算机有更多时间来执行其他任务。

如果终端通过网络连接到其主机,则块模式会节省大量资源。如果没有块模式,则键入的每个字符(字节)都会在其自己的数据包中发送,包括所有开销字节(在 Internet 上使用的 TCP/IP 数据包中为 40 个字节)。使用块模式,大量字符在一个数据包中发送。

块模式的问题

虽然块模式更有效,但它几乎已经绝迹,这是有充分理由的。更快更便宜的计算机使更高的效率变得不那么重要。例如,56k 调制解调器每秒会导致数百次中断(每 14 个字符),而在终端上键入内容每秒仅导致几次中断(每个键入的字符一次)。因此,在终端上键入内容引起的中断次数不是很重要(除非您有数百个终端连接到同一台计算机)。

另一点是,在用户不键入太多内容的情况下,效率并不重要。编辑器是用户键入大量内容的主要示例。但是,如果您使用块模式进行编辑,则必须使用终端中内置的粗糙编辑器。像 vim 和 emacs 这样的现代编辑器要好得多,但不能使用块模式。即使在带有终端的大型机时代,块模式除了 IBM 之外也没有被广泛使用。一个主要原因是使用它的软件没有广泛可用(IBM 除外)。terminfo 数据库似乎不包含它,这将使为其编写软件变得复杂。

23.8 EIA-232 (RS-232) 书籍

(注意:第一本书涵盖的内容远不止 EIA-232。)

23.9 串行软件

请参阅 串行软件,了解 Linux 串行端口软件,包括 getty 和端口监视器。


下一页 上一页 目录