串行编程/RS-232 连接
串行编程: 简介和OSI网络模型 -- RS-232布线和连接 -- 典型的RS232硬件配置 -- 8250 UART -- DOS -- MAX232驱动器/接收器系列 -- Windows中的TAPI通信 -- Linux和Unix -- Java -- Hayes兼容调制解调器和AT命令 -- 通用串行总线(USB) -- 形成数据包 -- 错误纠正方法 -- 双向通信 -- 数据包恢复方法 -- 串行数据网络 -- 实际应用开发 -- 串行连接上的IP
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 年代初期,使用调制解调器拨打电话相互连接并交换各种信息的“电子公告板系统”(BBS) 很常见。
现在想象一下,这两台计算机都在同一个房间里。它们不需要通过物理调制解调器连接,而是通过一个“空模式调制解调器”连接,或者说一个并不存在的调制解调器。为了实现这一点,您需要“交叉”一些线,这样当您在一端发送一些信息时,另一台计算机能够检测并接收相同的信息。
除了简单地允许计算机相互通信和传输数据之外,空模式调制解调器连接还可以用来“模拟”DCE 设备的行为。这在本文系列的后续讨论中将非常重要,您可以在其中尝试编写自己的串行通信软件。根据我的经验,我曾在很多情况下编写过这些“模拟器”,要么是因为我试图通信的设备还没有完成,要么是因为很难获得该设备的样本,而我只有通信协议规范。
有时,您可能希望测试传输设备本身,而不是尝试与另一台计算机通信。一种实用的方法是在终端设备(例如具有串行数据连接的 PC)上添加一个“回环”连接器。此连接器没有连接电缆,但将发送线回环到接收线。通过这样做,您可以模拟数据传输和接收。一般来说,这仅用于实际测试设备,但也可以用于测试软件组件。当使用这种连接器时,您将接收您发送的每个字节。如果您将传输子例程与数据捕获子例程分开,它可以为测试您的应用程序提供一个受控系统。
当检查设备传输的串行数据变得非常困难时,有时能够获取传输信息的“快照”会很不错。这是通过某种协议分析器来完成的。
所做的是对布线进行修改,以使第三台计算机能够简单地读取正在传输的数据。有时通信协议可能会变得非常复杂,以至于您需要查看整个交换过程,并且需要“实时”进行检查,而不是通过某种软件调试器。此方法的另一个目的是检查数据交换,以进行逆向工程,如果您试图发现设备的工作原理。通常,尽管有书面规范,但实际传输数据时发生的情况的实现可能与最初计划的完全不同。基本上,这是一个用于开发串行通信协议和软件的强大工具,不容忽视。
以下将讨论连接协议分析器的常用方法。
监控和分析串行端口数据的最方便的工具之一是 RS232 协议分析器。此软件允许拦截所有串行控制代码并记录有关它们的详细信息。捕获的数据可以在所有 4 种不同的视图中同时查看,即表格、行、转储或终端模式,每个显示都提供了一种独特的方式来表示 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 插座制作,如果使用 2 脚双色 LED(3 脚 LED 不适用),则 LED 的布线很简单。每个信号线应通过一个这样的 LED 和一个 680 欧姆电阻与 GND(信号接地)串联连接。自制分解盒通过一对 RS232 连接器(可能还包括一个连接协议分析器的连接器)和一些简单的金属或塑料外壳完成。
另一个对开发和测试串行应用程序和设备非常有用的巧妙硬件和/或软件是字符序列生成器。这种生成器会产生重复的串行线路数据序列。例如,这种生成器可能会以无限循环的方式重复著名的“The quick brown fox …” 句子。另一个常见的测试序列是循环生成从 0x00 到 0xFF 的所有 8 位代码。这种循环包含所有 7 位 ASCII 和 8 位 ISO Latin 1 字符,以及前 32 个不可打印的控制字符,并且可以例如揭示解码错误或传输错误。还非常常见的是调制解调器测试序列,使用通用调制解调器命令(串行编程: 调制解调器和 AT 命令)建立调制解调器连接,发送一些数据,然后在循环中拆除调制解调器连接。
市售硬件字符生成器提供了许多额外的功能,通常与协议分析仪结合使用。因此,它们相当昂贵。但是,就像 BOB 一样,也可以用少量资金构建一个实用的 DIY 字符序列生成器。这可以通过普通计算机上的软件(一些简单的无限软件循环将相同数据一遍又一遍地发送到串行接口)或一些廉价的电子元件来实现。在现场和开发中,一些小型独立硬件比例如带有软件的 PC 或笔记本电脑更便于快速测试。
一个简单的经典硬件字符生成器基本上由一个波特率生成器、一个 UART(串行编程:8250 UART 编程)、一个 (E)EPROM、一个二进制计数器和一个线路驱动器(串行编程:MAX232 驱动器接收器)组成。通常,这些组件中的每一个都是一个简单的单片 IC。(E)EPROM 应该包含字符序列。波特率生成器驱动 UART 和二进制计数器。二进制计数器驱动 (E)EPROM 的地址线。结果是字符序列在 (E)EPROM 的数据线上产生。这些数据线被馈送到 UART 的输入。UART 的输出连接到串行线路驱动器。所有这些都可以轻松地安装在一个小型原型板上,并放在一个简单的箱子里。
一个更现代的硬件字符生成器可以围绕这些小型微控制器之一构建(例如,Atmel AVR)。这特别容易,因为这些微控制器已经包含串行接口,只需要一点点串行编程 - 这是这本书的主题。
连接类型
[edit | edit source]如果您想进行一般的 RS-232 连接,您可以取一些长电线,并将它们直接焊接到您正在使用的设备的电子电路板上,但这往往会造成很大的混乱,而且这些焊点往往会断裂,还会出现其他问题。为了解决这些问题,并使设置或拆卸设备更容易,一些标准连接器已经开发出来,这些连接器通常存在于大多数使用 RS-232 标准的设备上。
这些连接器有两种形式:公头和母头。母头有孔,允许公头上的针脚插入连接器中。
EIA/TIA 574:DE9
[edit | edit source]这是一个 DE9 母头连接器(错误地称为“DB-9”)(正确地称为 DE9F)
DE-9 母头连接器通常用作插入典型 PC 的“插头”。如果您在计算机背面看到其中一个,它很可能不用于串行通信,而是用于早期 VGA 或 CGA 显示器(不是 SVGA)或一些特殊的控制/操纵杆设备。
这是一个公头“DE-9”连接器(正确地称为 DE9M)
这是您在“通用”PC 上用于串行通信的连接器中更有可能看到的连接器。您经常会看到两个并排放置(用于 COM1 和 COM2)。您可能与之通信的特殊设备将具有任一连接器,甚至可能是下面列出的 DB-25 连接器之一。
RS-232C:DB-25
[edit | edit source]这是一个 DB-25 母头连接器(也称为 DB25S)
这个 DB25S 是您通常在 IBM 兼容 PC 上用作并行(打印机)端口的连接器。它还在具有 25 针串行端口连接器的旧 PC 的调制解调器电缆的计算机端。这种连接器类型也经常用于符合 RS-232 串行数据通信的设备,因此,如果您看到其中一个连接器,不要总是假设它总是并行的。当最初的 RS-232 规范编写时,这就是预期的连接器类型,但由于许多针脚很少使用,因此 IBM 兼容 PC 串行端口后来切换到 DE-9 DE9S 连接器,它们携带与原始 IBM-PC 中的 DB 连接器上所有必需的信号。 (是的,对于这个标准来说,这比较新的设备)。
这是一个公头 DB-25P 连接器(也称为 DB25P)
公头 DB-25 连接器通常用于 PC 打印机电缆一端用于并行数据通信,这超出了本系列文章的范围。DB25P 也用于外部调制解调器电缆的调制解调器端。您应该知道,此连接器也用于许多不同类型设备上的串行通信,使用许多不同类型的通信协议。事实上,如果您有一个随机的设备,您试图弄清楚它的工作原理,您可以假设它是一个串行设备。破解随机连接器也超出了本文档的范围,但它本身可能是一个有趣的爱好。
迷你立体声插头连接器
[edit | edit source]这是一个公头迷你立体声插头连接器
一些数码相机和计算器附带一根电缆,电缆的一端有一个迷你立体声插头连接器,插在相机上,另一端有一个 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:RJ45 上的 RS232
[edit | edit source]RS-232D 定义了一个比 DE-9 插头小得多的标准连接器。[9].
(RJ45 模块化插孔上的 RS-232 也称为“EIA/TIA - 561”)
RJ11 上的 RS232
[edit | edit source]将 RS-232 的 TX、RX、GND 连接到 RJ11 连接器的 4 个针脚是否有标准?
- Luhan Monat 使用 DE9-5 ---> RJ11-1;DE9-3 ---> RJ11-2;DE9-2 ---> RJ11-3。(RJ11-2 和 RJ11-3 是“内对”)。
- Paul Campbell 说:“我把 GND 连接到黄线,TXD 连接到黑线,RXD 连接到红线。”
- Russell McMahon 提到了几种将 RS-232 连接到 RJ11 连接器的 4 个针脚或 RJ45 连接器的 8 个针脚的不同“标准”。
布线针脚说明
[edit | edit source]RS-232 设备的布线首先涉及识别正在使用的实际针脚。
还要注意,在“PC COMx 端口上下文”的末端,一些信号是“输入”,而另一些是“输出”,而在“调制解调器上下文”中,这些相同的信号名称现在被称为“输出”,而它们之前是“输入”,反之亦然。这就是多年来造成很多混乱的原因,因为“输入”或“输出”的意义性质在大多数关于该主题的图表中都没有被注意到,但在现实世界中,两个“输出”引脚很少能和谐地工作在 RS-232 相关的 ±[3–10] V 东西中,其中 -3 V 到 +3 V 的范围不是真正的“高”或“低”,除了可能给驱动器带来额外的负担,使其不希望地烧坏之外。
以下是母DE-9 连接器的编号方式(注意,电脑上的连接器通常是公连接器,所以与下图相比是镜像的)
如果数字难以辨认,从右上角开始为 "1",向左一直到行末,然后从下一行的第 6 个引脚开始,一直到左下角的第 9 个引脚。"顶部" 定义为有 5 个引脚的那一行。
以下是 PC COMx 端每个引脚的通常定义
9-pin | 25-pin | 引脚定义 | 方向(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> -sense- 相反,即使它们具有相同的助记符名称。
通常,您在环路中没有连接调制解调器,但您仍然在理论层面上将设备视为调制解调器。至少,您以某种方式将<输出>连接到每个<输入>,并且没有两个<输出>发生冲突,或者没有将任何 "浮动" <输入>连接到任何<输出>。
以下是关于每个信号功能的更正式的解释,从其一般用途的角度来看
DCD(数据载波检测)
[edit | edit source]这是一个来自通信设备 (DCE) 的信号,指示电话线仍然 "连接" 并从另一端的调制解调器接收载波信号。据推测,编写良好的软件或串行设备可以从该逻辑状态检测到电话何时在另一端 "挂断"。空连接器通常将 DCD 连接到每个端的 DTR,因为没有载波信号参与。
RX(接收数据)
[edit | edit source]从另一个发射机接收数据的输入。
TX(发送数据)
[edit | edit source]RX 的反面,终端设备 (DTE) 使用接收机预期的相同格式和协议发送串行数据。有关具体协议的更多信息,请参见以下内容。就像 RX 一样,在设计将使用此引脚的设备时,可以考虑 "终端发送"。
DTR(数据终端就绪)
[edit | edit source]基本上是来自 DTE 的信号,表示 "你好!,我准备好了,如果你也准备好了"。这是 DTE 向 DCE 发出的一个通用指示器,表明终端已准备好开始发送和接收数据。如果通信设备需要进行一些初始化,这是终端设备 "启动" 接收设备的一种方式。在空连接器设置中,该信号通常连接到 DCD,因此设备向自身发出信号,表明已检测到 (虚构的) 载波,表明传输线已启动。
GND(信号地)
[edit | edit source]这是一个有趣的引脚。它的作用是在被连接的设备之间建立一个共同的 "接地" 参考点,以比较其他信号的电压。通常这是一件好事,因为有时不同的设备具有不同的电源,并且相距一定距离。这根电线不好的地方在于,它通常是一根可以传导不应通过电线的电力的物理铜线,例如短路,更糟糕的是,闪电 (这种情况比您通常认为的这种类型的设备要频繁得多)。这可能会损坏 DCE 和 DTE。光纤转换器和接地隔离器等设备可以帮助防止这种情况发生,但仍然是需要担心的事情。在短距离内,这通常不是问题。
DSR(数据设置就绪)
[edit | edit source]这是通信设备 (或串行线上的计算机外围设备) 对 DTR 的对应信号。当 DTR 被发送为信号时,通信设备应将该信号更改为逻辑 "1",表示它也已准备好通信。如果 DCE 在 DTR 被发出信号时经历 "启动" 序列,则在完成之前不应发出 DSR 信号。但是,许多连接器将此引脚 "硬连线" 直接连接到每个端的 DTR 引脚,以减少电缆所需的电线数量。这对于使用现有电话线连接设备非常有用,但会阻止应用程序使用 DTR 和 DSR 进行握手。
RTS(请求发送)
[edit | edit source]将 RTS 信号设置为逻辑 "1" 表示 DTE 想要向 DCE 发送数据。将 RTS 信号重置为逻辑 "0" 表示 DTE 没有更多数据要发送。
CTS(允许发送)
[edit | edit source]这是 DCE 关于终端设备是否应该传输任何数据的响应信号。当该信号处于逻辑 "1" 时,终端 "允许" 传输数据。与 DTR/DSR 引脚一样,此引脚可以直接连接到 RTS 引脚,以减少所需的电线数量,但这会消除硬件流控制的可能性。一些软件忽略了此引脚和 RTS 引脚,因此也使用其他流控制系统。当我们接触到实际的软件时,会对此进行解释。
RI(振铃指示)
[edit | edit source]再次回到电话调制解调器,这是一个指示电话 "振铃" 的信号。通常,即使在真正的电话调制解调器上,这也只是偶尔设置为 -15 V 用于信号。基本上,当您通常会在电话上听到 "振铃" 时,此引脚就会发出信号。在空连接器上,此电线通常甚至没有连接到任何东西。如果您确实连接到真正的调制解调器,这确实有一些强大的用途,尽管还有其他方法可以让终端设备 (如连接到外部调制解调器的 PC) 通过数据引脚告知调制解调器,可以通过数据引脚告知调制解调器。这将在软件部分略作介绍。
其他 RS-232 引脚
[edit | edit source]DB-25 实现了其他 DE-9 通常不使用的引脚,例如次要发送和接收引脚、用于这些备用引脚的次要 CTS/RTS、用于电源的 -15 V 信号、时钟以及其他一些好主意。实现所有这些引脚的问题在于,您还需要运行单独的电线,而且一整套 DB-25 连接器也意味着要有 25 根物理电线连接 DTE 和 DCE 之间的整个距离。如果距离超过一英尺左右,就会变得很麻烦,尤其是要穿过墙壁或在更永久的环境中。如果电线束中的错误电线被剪断,则必须重新穿线整个电线束,或者您必须像老式的电话线维修人员在修理电话配电箱时一样进行电线测试。通常只使用三根物理铜线连接 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 线路可以承载比普通电话线更多数据的原因,即使是相同的铜线对进入您的家中。
当调制解调器开始达到非常高的速度时,它们遇到了某种砖墙。在 1950 年代,人们决定电话设备只需要承载大约 10 千赫兹的音调信号。对于正常的语音通话来说,这已经足够了,您甚至可以分辨出电话上是男声还是女声。问题在于,这意味着您可以通过家庭电话网络发送的最高正常“波特率”约为 9600 波特,通常约为 4800 波特,因为电话设备本身会在您从一个音调切换到另一个音调时丢弃“比特”。无需进行繁重的数学运算,您至少需要一个完整的“声波”才能能够区分不同的音调或音符。然而,调制解调器制造商确实想到了可以克服这种限制的另一种方法。与其只发送一个音调,不如同时演奏一个完整的“和弦”,或多个不同的音调。最后回到波特率与每秒比特数。以更高的速度,您不是简单地只发送一个比特,而是同时发送两个或多达十六个比特,并使用不同的“音乐”“和弦”。这就是您获得 56K BPS 调制解调器的方式,即使它仍然只以 9600 波特传输。
更多关于调制解调器的信息,请访问 串行编程:调制解调器和 AT 命令。
RS-232 标准中使用了四组传输位。这些位在 RS-232 数据流中的位置是区分一个位与另一个位的全部依据。这也是串行通信真正接触到“金属”的地方,因为每个位都以序列或串行的方式相继出现。所有其他电线、引脚、波特率以及所有其他内容都是为了确保这些位可以被理解。请记住,在这一点上,整个协议都基于单个字符的传输。可以发送多个字符,但它们是单个字符传输事件的序列。字符之间的关系基于软件对下一层协议“层”上的数据所做的事情。
当传输线没有发送任何东西时,它保持在逻辑状态“1”,或电线上为 -15 V。当您要发送一个字符时,您首先将电压更改为 +15 V,表示逻辑“0”状态。每个后续位都基于为每个设备之间的通信建立的波特率。此位表示接收设备应该开始扫描后续位以形成字符。
串行通信的主要目的,也是数据实际发送的地方。这里的位数变化很大,尽管在目前的实践中,通常传输的位数为八位。最初是五位,这足以让早期的电传打字机真正使用字母表中的字母和一些特殊字符。这也对互联网协议有影响,因为早期的电子邮件系统在通过某些 RS-232 链接连接时只用七位进行传输。这是因为早期的字符编码方案(主要是 ASCII)只用七位来编码英语常用的所有字符。由于计算机组件最适合 2 的幂(2、4、8、16、32 等),因此八位变得越来越普遍用于单个字符的数据存储。Unicode 和其他编码方案已经将此概念推广到英语以外的语言,但八位仍然是传输数据的非常常见的单位,也是当今 RS-232 设备最常见的设置。
在这个形成字符的比特序列中,最低有效位 (LSB) 首先被传输。
为了帮助对传输的字符进行有限的错误检查,引入了奇偶校验位。奇偶校验可以检测到一些传输错误,但不能纠正。奇偶校验位的取值取决于数据位串中设置为“1”的位数。
有四种不同的奇偶校验配置需要考虑
当位数的总和最终得到奇数(例如,序列 01110101),则此位将设置为“0”的逻辑状态。
这使用的是试图确定有多少个位设置为“1”的公式。在这方面,它与奇校验的逻辑状态完全相反。例如,对于具有七位的帧,如果帧中“1”的数量为奇数,则奇偶校验位将设置为 1。因此,本质上,整个字节(包括奇偶校验位)必须具有偶数个“1”才能进行偶校验。
使用这个概念,传输协议实际上完全忽略了奇偶校验位。相反,传输配置在应该发送奇偶校验位的位置发送逻辑“1”,而不考虑该序列是否应该具有奇数或偶数个计数。这种配置模式对于可能希望测试接收设备中奇偶校验检查软件或固件的设备很有用。
与标记奇偶校验相反,这会为奇偶校验校验和发送逻辑“0”。同样,对于设备诊断非常有用。
这实际上不是一个奇偶校验公式,而是一种确认,即奇偶校验实际上不起作用,因此设备甚至不会检查奇偶校验。这意味着奇偶校验位甚至没有被使用。这可能会在某些情况下导致总数据吞吐量略微增加。更多内容将在下面介绍。
这实际上并不是一个位,而是一种协议,即一旦字符发送完毕,发送设备将返回到逻辑“1”状态。RS-232 规范要求此逻辑“1”状态至少保持一个完整的时钟周期,表明字符传输已完成。有时协议会指定两个停止位。这样做一个原因是,设备使用的时钟频率可能存在细微的计时差异,在传输数百或数千个字符的过程中,两个不同设备上的两个时钟之间的差异会导致预期位略微偏移,从而导致错误。通过使用两个停止位,传输速度会稍慢,但两个设备之间的时钟信号可以更好地协调。期望一个停止位的设备可以接受由发送两个停止位的设备发送的数据。但是,反过来却行不通。如果您在尝试让两个设备以给定的波特率进行通信时遇到问题,请尝试将第二个停止位添加到发射器。这将是一个不错的选择。
我们讨论了波特率与每秒比特数。即使名义上的每秒比特数与波特率相同,但波特率仍作为传输的比特数的指标是错误的。通过添加起始位、停止位和奇偶校验位,这将为传输协议增加开销。所有数字传输协议都有一定的开销,因此这并不令人惊讶。随着我们更多地了解数据包和其他问题,实际传输的数据量将进一步下降。
请记住,如果您使用 6 位数据、2 个停止位和偶校验进行传输,那么您只传输了 6 位数据和 4 位额外的信息。这意味着即使以 9600 波特率传输,您也只传输每秒 5760 位数据。这确实是巨大的差异,而且这仅仅是数据通过实际串行通信通道后的原始位。更典型的 8 位数据、1 个停止位、无奇偶校验在 9600 波特率下会稍微好一些,因为有 8 位数据,只有 2 位用于开销。这使得总吞吐量达到每秒 7680 位。稍微好一些,但您不能简单地假设波特率表示将传输多少数据。
串行数据通信通过一段电线进行的距离存在物理限制。当您在电线上施加电压时,该电压需要时间才能穿过电线,而且当您在电线上发送“脉冲”并过快地改变电压时,还会发生其他不稳定情况。随着电线长度增加和频率(即波特率)增加,这个问题会更加严重。此距离会根据许多因素而变化,包括所涉及电线的厚度、电线上的射频干扰、制造过程中电线的质量、安装情况……例如,电线中是否存在任何“扭结”迫使它形成一个急弯,以及您传输数据的波特率。
此表格假设电缆相当直且均匀,这是大多数低压应用的典型情况(即,不是使用 110 V 来运行您的冰箱、烤面包机和电视的电源电路)。通常,像 CAT-5 电缆(也用于局域网或电话线)这样的东西应该足以满足此目的。
波特率 | 最大距离(以英尺为单位) | 最大距离(以米为单位) |
---|---|---|
2400 | 3000 | 914.4 |
4800 | 1000 | 304.8 |
9600 | 500 | 152.4 |
19200 | 50 | 15.24 |
距离限制可以得到缓解。有“短距离调制解调器”可以将此距离扩展到几英里的电缆。还有电话线、传统调制解调器和其他长距离通信技术。还有其他方法来处理这种情况下的数据,这些信号可以转换为典型家用计算机可以解释的简单 RS-232 数据格式。距离仍然可能是通信的一个限制因素,但当谈论像卡西尼任务中的土星这样的距离时,串行数据通信涉及的问题不仅仅是由于电缆长度导致的数据丢失。而且,美国宇航局/欧洲航天局正在使用串行数据通信将这些令人惊叹的图像传回地球。
- RS-232 布线标准说明
- RS-232 连接类型说明
- 维基百科关于 RS-232 的文章
- HW-Server 对 RS-232 标准的说明
- 串行引脚图(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