串行编程/RS-232 连接
串行编程: 介绍和OSI网络模型 -- RS-232接线和连接 -- 典型的RS232硬件配置 -- 8250 UART -- DOS -- MAX232驱动器/接收器系列 -- Windows中的TAPI通信 -- Linux和Unix -- Java -- Hayes兼容调制解调器和AT命令 -- 通用串行总线 (USB) -- 形成数据包 -- 错误纠正方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP over串行连接
RS-232 是一个用于计算设备之间串行数据通信的标准。该标准可追溯到 1962 年,但多年来已进行过重大修订以适应通信技术的变革。至少,RS-232 连接可能由连接两台设备的单根电线组成。最常见的简单连接包含三根电线:发送 (tx)、接收 (rx) 和接地 (gnd)。但是,完全实现的连接可以包含多达 25 根电线。早期的 RS-232 连接通常用于将终端设备连接到调制解调器,因此这些主题通常交织在一起。
在串行通信领域,有两种不同类型的设备
- DTE - 数据终端设备
- DCE - 数据通信设备
在实践中,数据终端设备 (DTE) 和数据通信设备 (DCE) 之间的区别仅仅是功能上的区别。这是一个调制解调器和串行通信设备主题混合在一起的例子。在这里,调制解调器可以被认为是 DCE,而面向用户的终端是 DTE。几年前,当使用分时计算系统很普遍时,用户会拨打电话,将电话听筒放在声学调制解调器上,然后将该调制解调器连接到一个简单的哑终端,终端使用 RS-232 电缆。典型的连接速度通常为 50 波特或 110 波特,尽管非常快的连接可以达到 300 波特。顺便说一下,当第一个 IMP (互连消息处理器) 形成 ARPAnet (互联网的古老前身) 的第一个节点/路由器时,这正是他们使用的连接系统。这后来让位于其他通信系统,但这是互联网的起源。
在更现代的环境中,想象一下在一个非常危险的地方的一台设备,比如在钢材加工厂中测量轧辊或其他钢材加工设备的温度。这也将是一种我们现在称之为“数据通信设备”的形式,我们也希望能够远程控制它。用于工厂控制室的 PC 将是数据终端设备。还有许多其他类似的设备,并且可以在各种设备上找到 RS-232 连接。
之所以称为“直连”连接,是因为当电缆连接在一起时,每端的每根电线都连接到相同的引脚。
通常你并不总是想将一台设备连接到计算机,但也希望将两台计算机连接在一起。不幸的是,当使用“直连”串行连接将两台计算机连接在一起时,两台计算机会在同一条电线上相互冲突。
一种使此方法起作用的方法是使用一对调制解调器将两台计算机连接在一起。如前所述,这是一项非常常见的任务,在 1980 年代和 1990 年代初期,使用调制解调器让计算机互相呼叫并交换各种信息,这很常见。
现在想象一下,如果这两台电脑在同一个房间里。它们不需要通过物理调制解调器,而是通过一个“空调制解调器”,或者说根本不存在的调制解调器。为了让这工作,你必须“交叉”一些电线,这样当你从一端传输一些信息时,另一台电脑就能检测到并接收相同的信息。
除了简单地允许一台电脑与另一台电脑通信和传输数据外,空调制解调器连接还可以用来“模拟”DCE设备的行为。这在本文系列中的一些讨论中会特别重要,在那里你可以尝试编写一些自己的串行通信软件。根据我个人的经验,我不得不在很多情况下编写这些“模拟器”,要么是因为我要与之通信的设备还没有完成,要么是因为很难获得该设备的样本,而我手头只有通信协议规范。
有时,你并不想与另一台电脑通信,而是想测试传输设备本身。一种实用的方法是在终端设备(例如带有串行数据连接的PC)上添加一个“回环”连接器。这个连接器没有连接任何电缆,而是将传输线回路到接收线。这样,你就可以模拟数据传输和接收。一般来说,这只是为了测试设备,但也可以用来测试软件组件。当使用这种类型的连接器时,你会收到你传输的每个字节。如果你将传输子例程与数据捕获子例程分离,它可以提供一个受控系统来测试你的应用程序。
当检查设备传输的串行数据变得非常困难时,有时能够“快照”正在传输的信息会很方便。这可以通过一种或多种协议分析器来实现。
所做的是修改电缆,允许第三台电脑简单地读取正在传输的数据。有时通信协议会变得非常复杂,以至于你需要看到整个交换过程,并且需要“实时”检查它,而不是通过某种软件调试器。这样做的另一个目的是检查数据交换,以用于反向工程,如果你试图发现一块设备的工作原理。通常,尽管有书面规范,但实际上传输数据时发生的事情的实际实现方式与最初计划的可能会有很大不同。基本上,这是一个用于开发串行通信协议和软件的强大工具,不应该被忽视。
有一些连接协议分析器的常用方法,将在下面讨论。
监控和分析串口数据的最便捷工具之一是RS232协议分析器。该软件允许截取所有串行控制代码并记录有关它们的详细信息。捕获的数据可以在四种不同的视图中同时查看,即表格、行、转储或终端模式,每个显示都提供了一种独特的表示RS232分析器捕获数据的形式。
Y型“电缆”不仅仅是一些电缆,还包含电子元件——假设它不是劣质电缆。它应该放置在串行线之间,并在第三个连接器上镜像所有信号。然后,这个第三个连接器可以连接到协议分析器(例如带有某种显示软件的PC)。
+-----+ serial +---------+ serial +-----+ | DTE |----------| Y Cable |----------| DCE | +-----+ +---------+ +-----+ | | +----------+ | Analyzer | +----------+
建议不要使用无源Y型电缆。这种电缆会使DTE和DCE的发送器过载,这可能导致发送器损坏。RS-233标准要求发送器能够承受短路。然而,现代的高度集成的设备可能不再符合该标准的这一特定方面。
通常,连接到分析器的线路也是一条串行线路,而分析器是带有串行接口和某种显示软件的PC。这种简单的Y型电缆解决方案的缺点是它只支持半双工通信。也就是说,一次只有一个站点(DTE或DCE)可以说话。原因是来自DTE和DCE的两个TX线被合并成一条连接到分析器的TX线。如果DTE和DCE同时发送,它们的信号会在连接到分析器的第三条线上混合,而分析器可能根本看不到任何可解码的信号。
请参阅http://www.mmvisual.de/fbintermdspy.htm,了解有关Y型电缆的一些简单电路的示例。
更高级的Y型电缆解决方案将来自DTE和DCE的TX数据分别提供给分析器。这种分析器能够显示全双工通信。先进的专业系统不仅显示解码的数字信息,还监控模拟信号电平和时序。
在这种情况下,分析器位于DTE和DCE之间。它基本上是一些设备(例如PC),带有两个串行接口。分析器将来自每个站点的每个信号镜像到另一个站点,并显示流量。
+-----+ serial +----------+ serial +-----+ | DTE |----------| Analyzer |----------| DCE | +-----+ +----------+ +-----+
原则上,这种分析器的简单版本可以使用任何带有两个串行接口的PC构建。所需要的只是一些软件,这并不难编写。但是,这种设备会缺少一个方便的功能。专业分析器能够自动检测串行通信的速度。自制解决方案需要配置为匹配串行通信的速度。专业设备也经过优化,以确保电路中的延迟最小。此外,简单的自制基于PC的分析器不能用于分析因信号电压电平问题造成的故障。然而,任何类型的协议分析器都比没有好。即使是最简单的分析器也很有用。
请参阅设置开发环境(用于调制解调器开发),获取更多信息。
RS232分解盒(BOB)是一个相当精巧的硬件,通常将许多功能组合在一起。它基本上由两个RS232连接器和一个接线板(或开关)组成,该接线板(或开关)允许更改连接器之间的布线。接线板和一小段电线比单独使用(DIP)开关更可取,因为接线板允许访问信号以用于其他目的。
如果某个设备的引脚分配(DTE/DCE)未知,则分解盒非常有用。接线板允许快速更改布线,从直连到空调制解调器连接,或设置回环连接。
由于补丁字段提供对所有信号的访问,因此它也允许使用分线盒连接 协议分析仪 或示波器。更好的分线盒还提供一些信号电平信息,通过带有 LED 来指示信号电压。此信息在试图识别未知引脚排列时非常有用。高端 BOB 包含用于测量接地电位差的电路和脉冲陷阱电路,用于查找信号毛刺。
市售的分线盒有多种类型。也可以用电路板上少量简单的零件来构建一个有用的 BOB。补丁字段可以使用 DIL IC 插座制作,如果使用双色双针 LED(三针 LED 不行),则 LED 的布线很简单。每个信号线应该通过这样的 LED 和一个 680 欧姆电阻与 GND(信号接地)串联连接。自制分线盒配有几个 RS232 连接器,可能还有一个用于连接协议分析仪的连接器,以及一些简单的金属或塑料外壳。
另一个用于开发和测试串行应用程序和设备的巧妙硬件和/或软件是字符序列发生器。这样的发生器会产生重复的串行线路数据序列。例如,这样的发生器可能会在无休止的循环中重复著名的“The quick brown fox…”句子。另一个常见的测试序列是生成从 0x00 到 0xFF 的所有 8 位代码,并在循环中重复。这样的循环包含所有 7 位 ASCII 和 8 位 ISO Latin 1 字符,加上前 32 个不可打印的控制字符,例如可以揭示解码错误或传输错误。同样非常常见的是调制解调器测试序列,它使用通用调制解调器命令(Serial Programming:Modems and AT Commands)来建立调制解调器连接,发送一些数据并在循环中拆除调制解调器连接。
商用硬件字符发生器提供了大量附加功能,通常与协议分析仪结合使用。因此,它们相当昂贵。但是,就像 BOB 一样,可以以少量现金构建一个有用的 DIY 字符序列发生器。这可以通过普通计算机上的软件来实现(一些简单的无休止的软件循环将相同的数据反复发送到串行接口),或者通过少量廉价的电子元件来实现。一些小型独立硬件在现场和开发过程中进行快速测试时,通常比例如配备某些软件的 PC 或笔记本电脑更方便。
一个简单的经典硬件字符发生器基本上由一个波特率发生器、一个 UART(Serial Programming:8250 UART Programming)、一个(E)EPROM、一个二进制计数器和一个线路驱动器(Serial Programming:MAX232 Driver Receiver)组成。通常,这些组件中的每一个都是一个简单的单个 IC。(E)EPROM 应该包含字符序列。波特率发生器驱动 UART 和二进制计数器。二进制计数器驱动(E)EPROM 的地址线。结果是字符序列在(E)EPROM 的数据线上产生。这些数据线被馈送到 UART 的输入端。UART 的输出端连接到串行线路驱动器。所有这些都可以很容易地安装在一个简单外壳中的小型原型板上。
一个更现代的硬件字符发生器可以围绕这些小型微控制器之一(例如,Atmel AVR)构建。这特别容易,因为这些微控制器已经包含串行接口,只需要一些串行编程 - 这是 这本书 的主题。
如果你想进行一个通用的 RS-232 连接,你可以取一堆长线,并将它们直接焊接到你正在使用的设备的电子电路板上,但这往往会造成很大的混乱,而且这些焊接连接往往会断裂,并可能出现其他问题。为了解决这些问题,并使设备的安装或拆卸更容易,一些标准连接器被开发出来,这些连接器通常出现在大多数使用 RS-232 标准的设备上。
这些连接器有两种形式:公头连接器和母头连接器。母头连接器有孔,可以让公头连接器上的插脚插入连接器中。
这是一个母头 DE9 连接器(不正确地称为“DB-9”连接器,正确地称为 DE9F)。
母头 DE-9 连接器通常用作插入典型 PC 的“插头”。如果在计算机背面看到这样的连接器,它很可能不是用于串行通信,而是用于早期 VGA 或 CGA 监视器(不是 SVGA)或一些特殊的控制/操纵杆设备。
这是一个公头“DE-9”连接器(正确地称为 DE9M)。
这是你更有可能在“通用”PC 上看到用于串行通信的连接器。通常你会看到两个并排在一起(用于 COM1 和 COM2)。你可能要与之通信的特殊设备将拥有任一连接器,甚至可能是下面列出的 DB-25 连接器之一。
这是一个母头 DB-25 连接器(也称为 DB25S)。
这个 DB25S 是你在 IBM 兼容 PC 上通常用作并行(打印机)端口的连接器。它还在较旧的 PC 上的调制解调器电缆的计算机端,这些 PC 具有 25 针串行端口连接器。这种连接器类型也经常用于符合 RS-232 串行数据通信的设备,因此不要总是假设如果你看到这样的连接器,它就总是并行端口。在最初的 RS-232 规范编写时,这就是预期使用的连接器类型,但由于许多插脚很少使用,甚至根本不使用,因此 IBM 兼容 PC 的串行端口后来切换到 DE-9 DE9S 连接器,它承载着与原始 IBM-PC 上的 DB 连接器相同的必要信号。(是的,对于这个标准来说,这是一种相对较新的设备。)
这是一个公头 DB-25P 连接器(也称为 DB25P)。
公头 DB-25 连接器通常用于 PC 打印机电缆的一端,用于并行数据通信,这超出了本系列文章的范围。DB25P 也用于外部调制解调器电缆的调制解调器端。你应该知道,此连接器也用于许多不同类型设备上的串行通信,使用许多不同类型的通信协议。事实上,如果你有一个随机的设备,你想看看它的工作原理,你可以假设它是一个串行设备。破解随机连接器也超出了本文档的范围,但它本身可能是一个有趣的爱好。
这是一个公头迷你立体声插头连接器。
一些数码相机和计算器附带一条电缆,电缆的一端有一个迷你立体声插头连接器,插到相机上,另一端有一个 DE-9 连接器,插到 PC 上。
这是一个糟糕的连接器,因为它在插拔时会短路部分电路。
“PicAXE”系统使用 [1]
- 1:基环:接地(DE9 的第 5 针)
- 2:中环:从 PicAXE 到 PC 串行输入的串行输出(DE9 的第 2 针)
- 3:插头尖端:从 PC 到 PicAXE 串行输入的串行输出(DE9 的第 3 针)
“LANC”系统通常使用 2.5 毫米立体声插孔:[2][3] [4] [5] [6] [7][8]
- 基环:接地
- 中环:来自相机的 +5 到 +8 VDC
- 尖端:通常通过电阻器拉高到 +5 V(空闲;逻辑 1);拉低(起始位和逻辑 0)以发送命令或状态。(开漏)。通常遥控器发送前 2 个字节的命令。相机回复 6 个字节的状态。
LANC 使用 9600 bit/s 串行。
RS-232D 定义了一个比 DE-9 插头小得多的标准连接器。[9].
(RJ45 模块化插孔上的 RS-232 也称为“EIA/TIA - 561”)
RS-232 的 TX、RX、GND 连接到 RJ11 连接器的 4 个针脚是否有标准?
- 陆瀚·莫纳特 使用 DE9-5 ---> RJ11-1; DE9-3 ---> RJ11-2; DE9-2 ---> RJ11-3。(RJ11-2 和 RJ11-3 是“内对”)。
- 保罗·坎贝尔 说:“我把 GND 连接到黄线,TXD 连接到黑线,RXD 连接到红线。”
- 罗素·麦克马洪 提到了几种将 RS-232 连接到 RJ11 连接器的 4 个针脚或 RJ45 连接器的 8 个针脚的“标准”。
RS-232 设备的连接首先要确定实际使用的针脚。
还要注意,在“PC COMx 端口上下文”一端,一些信号是“输入”,而另一些信号是“输出”,而在“调制解调器上下文”中,相同信号名称现在变成“输出”,而之前是“输入”,反之亦然。这就是多年来产生许多混乱的原因,因为“输入”或“输出”的本质在大多数有关该主题的图表中没有注明,但在现实世界中,两个“输出”引脚很少能在 RS-232 相关的 ±[3–10] V 东西中和谐工作,其中 -3 V 到 +3 V 的范围不是真正的“高”或“低”,除了可能使驱动器向其不希望的烧毁方向倾斜。
以下是如何对 母 DE-9 连接器进行编号(注意,计算机上的连接器通常是 公 连接器,因此与下图相比是镜像的)
如果数字难以辨认,从右上角开始为“1”,向左一直到行尾,然后从下一行开始为引脚 6,直到到达左下角的引脚 9。“顶部”定义为有 5 个引脚的行。
以下是每个引脚在 PC COMx 端的定义
9 针 | 25 针 | 引脚定义 | 方向(PC 视图) |
---|---|---|---|
1 | 8 | DCD(数据载波检测) | 输入 |
2 | 3 | RX(接收数据) | 输入 |
3 | 2 | TX(发送数据) | 输出 |
4 | 20 | DTR(数据终端就绪) | 输出 |
5 | 7 | GND(信号地) | - |
6 | 6 | DSR(数据设置就绪) | 输入 |
7 | 4 | RTS(请求发送) | 输出 |
8 | 5 | CTS(允许发送) | 输入 |
9 | 22 | RI(振铃指示器) | 输入 |
在讨论这些引脚及其含义时,需要注意的是,它们与调制解调器和调制解调器协议密切相关。
在互连任何串行端口时,应注意,无论情况如何,都应始终遵循以下原则:通常情况下,只有一个 <输出> 应该连接到一个或多个 <输入>。此外,需要注意的是,COMx 端的信号名称通常与调制解调器端 <in>-<out> 的本质相反,即使它们具有相同的助记符名称。
通常,您没有在循环中连接调制解调器,但您仍然从理论上将设备视为调制解调器。至少,这样您至少可以以某种方式使 <输出> 连接到每个 <输入>,并且没有两个 <输出> 冲突,或者没有一个“浮动” <输入> 连接到任何 <输出>。
以下是对每种信号功能在一般意义上的更正式的解释
这是一个来自通信设备 (DCE) 的信号,指示电话线仍“连接”并且从另一端的调制解调器接收载波信号。据推测,编写良好的软件或串行设备可以从此逻辑状态检测到电话线何时在另一端“挂断”。零调制解调器通常将 DCD 连接到两端的 DTR,因为没有载波信号参与。
输入以接收来自另一个发射机的數據。
RX 的反向,这是终端设备 (DTE) 使用接收器期望的相同格式和协议发送串行数据的地方。有关更确切的协议,请参见下文。与 RX 一样,在设计将使用此引脚的设备时,请考虑“终端发送”。
基本上是来自 DTE 的信号,表示“你好!,如果可以,我已准备好”。这是一个通用指示器,告诉 DCE 终端已准备好开始发送和接收数据。如果通信设备需要进行一些初始化,那么这是终端设备“启动”接收设备的一种方式。在零调制解调器设置中,此信号通常连接到 DCD,因此设备向自身发出信号,表明已检测到(虚拟)载波,表明传输线已启动。
这是一个有趣的引脚。它所做的是尝试在正在连接的设备之间建立一个公共“地”参考,以比较其他信号的电压。通常这件好事,因为有时不同的设备有不同的电源并且相距很远。此电线不太令人愉快的地方是,它通常是一段可以导电的物理铜线,而这些电线通常不应该沿着电线流动,例如短路,或者更糟的是闪电(对于这种设备,这种情况比您通常认为的要频繁得多)。这可能会烧毁 DCE 和 DTE。光纤转换器和接地隔离器等设备可以帮助防止这种情况发生,但仍然是需要担心的事情。在短距离内,这通常不是问题。
这是通信设备(或串行线上的计算机外设)对 DTR 的对应信号。当 DTR 被发送为信号时,通信设备应将此信号更改为逻辑“1”,表示它已准备好通信。如果 DCE 在 DTR 被发出信号时经历“启动”序列,它应该在完成之前不要发出 DSR 信号。但是,许多连接器将此引脚“硬连线”直接连接到两端的 DTR 引脚,以减少电缆中所需的电线数量。这对于使用现有电话线连接设备很有用,但会阻止应用程序使用 DTR 和 DSR 进行握手。
将 RTS 信号设置为 逻辑“1” 表示告诉 DCE DTE 想向它发送数据。将 RTS 信号重置为 逻辑“0” 表示告诉 DCE DTE 没有更多数据要发送。
这是 DCE 关于终端设备是否应该发送任何数据的响应信号。当此信号处于 逻辑“1” 时,终端“允许”发送数据。与 DTR/DSR 引脚一样,此引脚可以直接连接到 RTS 引脚以减少所需的电线数量,但这会消除硬件流控制的可能性。一些软件会忽略此引脚和 RTS 引脚,因此也会使用其他流控制系统。当我们进入实际软件时,这将得到解释。
再次回到电话调制解调器,这是一个指示电话“振铃”的信号。通常,即使在真正的电话调制解调器上,此信号也只偶尔设置为 -15 V。基本上,当您通常会在电话上听到“振铃”时,此引脚会发出信号。在零调制解调器上,此电线通常甚至没有连接到任何东西。如果您真的连接到真正的调制解调器,这确实有一些强大的用途,尽管还有其他方法可以让终端设备(例如连接到外部调制解调器的 PC)通过数据引脚接收此信息。这将在软件部分简要介绍。
DB-25 有一些 DE-9 通常不使用的引脚,例如辅助发送和接收引脚,用于这些备用引脚的辅助 CTS/RTS,-15 V 电源信号,时钟,以及其他一些好主意。实现所有这些引脚的问题是您还需要运行独立的电线,并且完整的 DB-25 连接器集也意味着在 DTE 和 DCE 之间有 25 根物理电线贯穿整个距离。如果距离超过一英尺左右,就会变得很麻烦,特别是如果您要穿过墙壁或在更永久的环境中。如果线束中不小心剪断了错误的线,则整个线束都必须重新穿线,或者您必须像老式电话线修理工一样进行电线测试,才能修复电话配电箱。通常,只有三根物理铜线用于连接 DTE 到 DCE,即 RX、TX 和 GND。其余的可以在连接器端轻松“伪造”,这足以满足大多数软件和硬件应用程序的需求。
波特率和 BPS(每秒比特数)通常并不相同,尽管它们经常被互换使用,尤其是在营销文献中。确定特定设备的实际数据速率有几种方法,但在流行的营销文献中,甚至是一般的参考文本中,它们几乎总是会提到“波特率”,即使它们指的是每秒比特数。
波特率是指调制信号中每秒传输介质变化的次数。如果每个传输事件包含多个信息位,那么波特率和 BPS 就不一样了。例如,如果每个事件包含两个位(两个位在事件中被调制),那么这种传输的 BPS 将是波特率的两倍。这不是一个理论情况。典型的“高速”调制解调器在电话线上使用复杂的调制,其中比特率和波特率在电话线上有很大差异。在为特定协议构建测量设备、解码器(解调器)、编码器(调制器)和各种传输设备时,了解这一点很重要。
然而,软件开发人员通常喜欢忽略比特率和波特率之间的区别,因为一位可以是真或假 - 一个“事件”(一位)总是只有两种可能的状态。它们没有可以容纳例如四个不同状态的基本单位。换句话说,在软件端,调制已经被解调器展平了。如果使用了可以例如在一个事件中传输 8 位的调制,软件开发人员已经看到它们是一系列 8 个连续的位,每个位都是真或假。解调器负责处理这个。当它收到一个事件时,它会将单个 8 位事件转换为八个单个位事件。软件开发人员看不到具有 256 种不同状态(电压、相位)的原始单个实体。由于调制已被展平,他们不再体验波特率和比特率之间的区别。这不是定义波特率或 BPS 的人的错。这只是数字计算机硬件的一个(受欢迎的)限制。
波特率实际上是一个缩短的术语,是为了纪念埃米尔·鲍多,他是早期电传打字机机器的法国发明家,这些机器用莫尔斯电码取代了电报键。基本上是两台可以连接在一起的打字机,通过一些电线连接在一起。他提出了第一个数字字符编码方案,并且这些字符代码通过串行数据连接传输。请记住,这在计算机发明之前就已经在很大程度上实现了。事实上,一些早期的电传打字机设备连接到像 ENIAC 或 UNIVAC 这样的第一台计算机,仅仅是因为它们相对便宜并且当时已经大量生产。
为了使串行数据通信发生,您需要就时钟信号或波特率达成一致,以便所有内容都能被正确传输和接收。这就是语言纯粹主义者参与的地方,因为正是这个时钟信号实际上驱动了“波特率”。让我们从埃米尔·鲍多的电传打字机开始,从更开始的地方解释波特率。
埃米尔的早期电传打字机使用 5 个数据位和 1 个停止位来传输一个字符。我们将在第二部分介绍格式问题,但重要的是,六个信号以某种方式通过电线发送,这将表明正在传输一个字符。通常,设备被设计成以 50 波特的速度运行,或者换句话说,设备每秒传输或接收一个“位”数据。法国电力系统也恰巧使用 50 赫兹的交流系统,因此这很容易被用来确定何时应该传输一个新字符。
电传打字机不断发展,最终西联公司在世界各地发送电传打字机“电报”。如果您听说过 TELEX 号码,那么这就是这个系统的遗迹,即使在互联网时代,它仍然在使用。快速概述一大堆有趣的历史,您最终会看到美国司法部 (DOJ) 起诉 AT&T。请注意,这是 1982 年著名的/臭名昭著的和解之前的一起反垄断诉讼。这之所以重要,是因为 DOJ 坚持认为西联公司获得了所有数字业务(电报... 不幸的是,这也意味着计算机设备),而 AT&T 获得了调制频率,或者换句话说,您可以在他们的设备上给妈妈打电话过母亲节。当计算机在 1950 年代被制造出来时,人们希望有一种方法将不同的计算机设备连接在一起,以便相互“通信”。这最终导致了我们在本页讨论的 RS-232 标准。
虽然西联公司被允许传输数字流量,但连接通常不在或不靠近计算机中心。此时,AT&T 在反垄断和解中发现了一个漏洞,可以帮助他们进入作为计算机数据“运营商”的业务。他们还提供以比西联公司收费低得多的价格传输计算机数据。因此,调制解调器诞生了。
调制解调器的长描述是“调制解调器”,这个描述很重要。由于 AT&T 只能传输“音调”,比如来自广播网络的音乐或您母亲的声音,他们创建了一种设备,可以电子方式创建可以传输到其网络上的“音乐”或“音调”。然后,他们会将计算机“1”或“0”调制为一个频率,比如 2600 赫兹。(确切的音调根据波特率和其他因素而有所不同,但这里有确切的频率规格。)匹配的设备能够在“音乐”中查找该“音符”或“音调”,并能够将其转换回计算机“1”或“0”,或者换句话说,对音乐进行解调。由于您和您的伙伴在电话两端只是相互播放音乐,因此 AT&T 在其网络上播放这种音乐是合法的。尽管西联公司提出了反对意见,但只有计算机才能理解这种音乐,这一点无关紧要,而且 DOJ 对整个做法视而不见。
您可以租用的原始调制解调器是 AT&T Bell 103 调制解调器。这些笨重的盒子大约有一个鞋盒大小,外边有一堆开关,还有一个连接到您正在使用的计算机设备的 RS-232 电缆。这些盒子是为老式手柄电话设计的,上面有一些橡胶片可以绕着电话的“扬声器”和“麦克风”部分(当时没有与电话设备的直接铜线连接)。如果您想拨打电话,您必须使用电话本身的转盘... 计算机无法访问这种设备。请记住,FCC 对与电话设备有关的几乎所有事情都进行了监管,而 AT&T 拥有与电话有关的一切。您甚至必须从 AT&T 处“租用”调制解调器,并且租金费用包含在您的每月电话费中。
Bell 103 最初是 110 波特,尽管它最终有一个开关可以“提高”到 220 波特。在整个 1960 年代和 1970 年代,300 波特调制解调器也相当普遍。请记住,AT&T(或您的当地电话公司)是您唯一可以租用调制解调器的公司,无论您是否需要。到 1982 年,调制解调器被广泛使用,POTS 电话网络非常普及,因此这种通过电话发送“音乐”的系统得以保留,尽管这样做的法律原因已不再有效。随着 ISDN 和 DSL 线路的出现,情况不再是这样,电话公司现在发送的是纯数字信号。这也是 DSL 线路能够传输比普通电话线多得多的数据的原因,尽管进入您家的铜线对还是一样的。
当调制解调器开始以非常高的速度运行时,它们遇到了某种程度的障碍。早在 20 世纪 50 年代就决定,电话设备只需要传输大约 10kHz 的音调信号。对于正常的语音通话,这已经足够了,你甚至可以通过电话辨别出男人和女人的声音。问题在于,这意味着你可以在家庭电话网络上传输的最高正常“波特率”大约为 9600 波特,通常约为 4800 波特,因为电话设备本身会在你从一个音调切换到另一个音调时丢弃“位”。不进行复杂的数学运算,你需要至少有一个完整的“声波”才能区分不同的音调或音符。然而,调制解调器制造商确实想到了另一种方法来克服这种限制。与其一次只发送一个音调,不如演奏一个完整的“和弦”,或同时演奏几个不同的音调。最后回到波特率与每秒位数。在更高的速度下,你不再仅仅发送一位,而是同时使用不同的“音乐”和弦发送两位或多达十六位。这就是即使 56K BPS 调制解调器仍然只以 9600 波特传输,却能达到这种速度的原因。
有关调制解调器的更多信息,请参阅 串行编程:调制解调器和 AT 命令。
在 RS-232 标准中,使用了四组传输位。这些位在 RS-232 数据流中的位置是区分各个位的唯一依据。这也是串行通信真正接触“金属”的地方,因为每个位都以顺序或串行方式跟随。所有其他线、引脚、波特率以及其他一切都是为了确保这些位能够被理解。请记住,此时整个协议都是基于单个字符的传输。可以发送多个字符,但它们是单个字符传输事件的序列。字符之间的关系取决于软件在下一层协议“层”上对数据的处理方式。
当传输线没有发送任何东西时,它将保持在“1”的逻辑状态,或者在导线上保持 -15V。当你想发送一个字符时,你首先将电压更改为 +15V,表示“0”的逻辑状态。每个后续位都基于为每个设备之间的通信建立的波特率。此位表示接收设备应该开始扫描后续位以形成字符。
这是串行通信的主要目的,数据实际上传输的地方。这里的位数变化很大,尽管在目前的实践中,传输的位数通常为八位。最初是五位,这对于早期电传打字机来说已经足够了,它们只需要用来生成字母和一些特殊字符。这对于互联网协议也有影响,因为早期的电子邮件系统在通过一些 RS-232 链接连接时只用七位传输。这是因为早期的字符编码方案(主要是 ASCII)只用了七位来编码英语中常用的所有字符。因为计算机组件在 2 的幂次方(2、4、8、16、32 等)上工作得最好,所以八位成为更常用的单个字符数据存储单元。Unicode 和其他编码方案将这一概念推广到英语以外的其他语言,但八位仍然是传输数据的非常常见的单位,也是当今 RS-232 设备最常见的设置。
在这个位序列中,最低有效位 (LSB) 是第一个被传输的,以形成一个字符。
为了帮助对传输的字符进行有限的错误检查,引入了奇偶校验位。奇偶校验可以检测到一些传输错误,但不能纠正。奇偶校验位的取值取决于数据位串中设置为“1”的位数。
需要考虑四种不同的奇偶校验配置。
当位数的总和最终得到一个奇数(例如,序列 01110101),则此位将被设置为“0”的逻辑状态。
它使用的是试图确定是否有偶数个位设置为“1”的公式。在这方面,它是奇校验的完全相反状态。例如,对于一个有七位的帧,其中有奇数个 1,奇偶校验位将被设置为 1。所以实际上,包括奇偶校验在内的整个字节必须有偶数个 1 才能实现偶校验。
使用此概念,传输协议实际上完全忽略了奇偶校验位。相反,传输配置在应该发送奇偶校验位的地方发送了一个逻辑“1”,无论该序列应该具有奇数个 1 还是偶数个 1。此配置模式对于可能希望测试接收设备中的奇偶校验检查软件或固件的设备很有用。
与标记校验相反,它在奇偶校验校验和处发送一个逻辑“0”。同样,对于设备诊断非常有用。
这实际上不是一个奇偶校验公式,而是一种承认奇偶校验实际上并不起作用的认可,因此设备甚至不检查它。这意味着奇偶校验位甚至不会被使用。这在某些情况下会导致总数据吞吐量略微增加。更多信息请见下文。
这实际上不是一个位,而是一种协议,即在发送完字符后,传输设备将返回到“1”的逻辑状态。RS-232 规范要求这种“1”的逻辑状态至少保持一个完整的时钟周期,表示字符传输已完成。有时协议会指定两个停止位。这样做的一个原因是,设备使用的时钟频率可能略有不同,在传输数百或数千个字符的过程中,两个不同设备上的两个时钟之间的差异会导致预期的位发生轻微的偏移,从而导致错误。通过使用两个停止位,传输速度会略微降低,但两个设备之间的时钟信号可以更好地协调。预期一个停止位的设备可以接受发送两个停止位的设备传输的数据。然而,反过来却行不通。如果你在尝试让两台设备以给定的波特率进行通信时遇到问题,可以尝试在发射器中添加第二个停止位。
我们讨论了波特率与每秒位数。这里,即使名义上的每秒位数与波特率相同,波特率作为正在传输的位数仍然是不正确的。通过添加起始位、停止位和奇偶校验位,传输协议将增加开销。所有数字传输协议都具有一定的开销,所以这并不令人惊讶。当我们更多地涉及数据包和其他问题时,实际传输的数据量将进一步下降。
请记住,如果您使用 6 个数据位、2 个停止位和奇校验进行传输,您实际上只传输了 6 个数据位和 4 个额外的信息位。这意味着即使以 9600 波特率传输,您每秒也只传输 5,760 个数据位。这是一个很大的区别,而且这只是经过实际串行通信信道后原始数据的比特数。更典型的 8 个数据位、1 个停止位、无奇偶校验将在 9600 波特率下稍微好一些,其中有 8 个数据位,只有 2 个位用于开销。这使得总吞吐量为每秒 7,680 个比特。好一些,但不能简单地认为波特率指示将传输多少数据。
串行数据通信通过一根电线进行的距离存在物理限制。当您在电线上施加电压时,该电压需要时间才能穿过电线,并且当您沿电线发送“脉冲”并过快地改变电压时,还会发生其他不稳定的情况。随着电线变长和频率(即波特率)增加,这个问题会变得更严重。此距离会根据多种因素而变化,包括所涉及的电线的厚度、电线上的射频干扰、制造过程中电线的质量、安装方式......例如,电线中是否存在迫使它发生急弯的“扭结”,以及最终的传输数据波特率。
此表假设一条相当笔直且均匀的电缆,这对于大多数低压应用来说很典型(例如,不是使用 110 伏运行您的冰箱、烤面包机和电视机的电源电路)。通常,类似于 CAT-5 电缆(也用于局域网或电话线)应该足以满足此目的。
波特率 | 最大距离(英尺) | 最大距离(米) |
---|---|---|
2400 | 3000 | 914.4 |
4800 | 1000 | 304.8 |
9600 | 500 | 152.4 |
19200 | 50 | 15.24 |
距离限制可以得到缓解。有一些“短距离调制解调器”可以将此距离扩展到几英里的电缆。还有电话线或传统调制解调器以及其他长距离通信技术。还有其他方法可以处理这种情况下的数据,这些信号可以转换为典型家用计算机可以解释的简单 RS-232 数据格式。距离仍然可能是通信的限制因素,尽管当您谈论像卡西尼任务到土星的距离时,串行数据通信涉及的问题不仅仅是由于电缆长度导致的数据丢失。是的,NASA/ESA 正在使用串行数据通信将这些令人惊叹的图像传回地球。
- RS-232 接线标准说明
- RS-232 连接类型说明
- 维基百科关于 RS-232 的文章
- RS-232 标准由 HW-Server 解释
- 串行引脚分配(D25 和 D9 连接器)(还包含有关 PC 中使用的 UART 的更多技术信息)
- RS232 连接以及串行设备的接线包含几个图表,其中包括一个显示如何让一台 PC 监控另外两台 RS232 设备之间的串行通信的图表。
- Lammert Bies,RS232 规范和标准 包含有关 RS-232 信号的技术规范和有关奇偶校验的更详细的信息。
- Tronisoft 的可打印 ASCII 串口备忘单
- jSSC 库(Java 简单串行连接器)。在 Win32 和 Win64 下工作
串行编程: 介绍和OSI网络模型 -- RS-232接线和连接 -- 典型的RS232硬件配置 -- 8250 UART -- DOS -- MAX232驱动器/接收器系列 -- Windows中的TAPI通信 -- Linux和Unix -- Java -- Hayes兼容调制解调器和AT命令 -- 通用串行总线 (USB) -- 形成数据包 -- 错误纠正方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- IP over串行连接