Modem-HOWTO

David S.Lawyer mailto:dave@lafn.org

v0.39, 2007年1月
关于为PC选择、连接、配置、故障排除和理解模拟调制解调器的帮助文档。

1. 简介

2. Linux PC 的调制解调器

3. 调制解调器池,RAS

4. 串行端口和调制解调器基础知识

5. 配置概述

6. 定位串行端口:IO 地址、IRQ

7. 配置串行驱动程序(高级)"stty"

8. 调制解调器配置(不包括串行端口)

9. 串行端口设备 /dev/ttyS4, (或 /dev/ttys/4) 等

10. 您应该了解的有趣程序

11. 尝试使用您的调制解调器(拨出)

12. 拨入

13. 用于拨入的 Uugetty(来自旧的 Serial-HOWTO)

14. 我的调制解调器应该使用什么速度?

15. 通信程序和实用程序

16. 两个调制解调器(调制解调器加倍)

17. ISDN“调制解调器”

18. 故障排除

19. 闪存升级

20. 其他信息来源

21. 附录 A:模拟调制解调器的工作原理(技术性)(未完成)

22. 附录 B:模拟语音在非语音调制解调器上不可行

23. 附录 C:“baud”与“bps”

24. 附录 D:终端服务器连接

25. 附录 E:电缆和 DSL 调制解调器

26. 附录 F:直接背靠背连接 2 个调制解调器(租用线路)。

27. 附录 G:传真像素(点)

28. 附录 H:Stty 挂起问题(2000 年之前)

29. 附录 G:古董调制解调器


1. 简介

1.1 其他 HOWTO 中的 DSL、有线和 ISDN 调制解调器

本 HOWTO 涵盖了用于 PCI、USB、LPC 和 ISA 总线的 PC 的传统模拟调制解调器。USB 和 ISDN 的覆盖范围较弱。有关其他类型的调制解调器,请参阅

1.2 也未充分涵盖:PCMCIA 调制解调器、PPP

有关 PCMCIA 总线上的调制解调器,请参阅 PCMCIA-HOWTO:PCMCIA 串行和调制解调器设备。本 HOWTO 也不涵盖 PPP(用于通过调制解调器连接到互联网)或通信程序的详细信息。如果您想使用调制解调器连接到互联网,那么您需要使用一个程序来自动为您设置 PPP(例如 wvdial)。有关 ppp 的更多文档应在 /usr/doc/ppp、/usr/share/doc/ppp 或类似位置找到。

1.3 版权、免责声明、商标和鸣谢

版权

版权所有 (c) 1998-2005 David S. Lawyer mailto:dave@lafn.org

请以任何格式自由复制和分发(出售或赠送)本文档。请将任何更正和意见发送给文档维护者。您可以创建衍生作品并分发它,前提是您

  1. 如果它不是翻译作品:将您的衍生作品的副本(LDP 接受的格式)通过电子邮件发送给作者和维护者(可能是同一个人)。如果您没有收到回复,请通过电子邮件发送给 LDP(Linux 文档项目):submit@en.tldp.org。
  2. 以本许可的精神许可衍生作品,或使用 GPL。包括版权声明,以及至少指向所用许可证的指针。
  3. 对以前的作者和主要贡献者给予应有的肯定。

如果您正在考虑制作翻译以外的衍生作品,则请求您与当前的维护者讨论您的计划。

免责声明

虽然我没有故意误导您,但本文档中可能存在许多错误。请告知我这些错误。由于这是免费文档,因此显而易见,我对任何错误均不承担法律责任。

商标。

任何品牌名称(以大写字母开头,例如 MS Windows)都应被视为商标)。此类商标属于其各自的所有者。

“Hayes”是 Microcomputer Products Inc. 的商标。我使用“winmodem”来表示最初需要 MS-Windows 的任何调制解调器,而不是商标意义上的。所有其他商标均属于其各自的所有者。

鸣谢

以下仅是对本文档在 2000 年创建方式的粗略估计:此处约 1/4 的材料直接摘自 Greg Hankins 的 Serial-HOWTO v. 1.11 (1997)。mailto:gregh@twoguys.org (经他许可)。另外约 1/4 取自该 Serial-HOWTO 并进行了修订。其余 1/2 由新作者 David S. Lawyer mailto:dave@lafn.org 新创建。自 2000 年以来,当前作者添加了更多内容,因此旧 Serial-HOWTO 中关于调制解调器的内容所剩无几。

1.4 联系作者

由于我不关注许多不同的调制解调器品牌/型号,请不要通过电子邮件向我发送有关它们的问题(或关于购买哪种型号的建议)。如果您对某个型号感兴趣(以了解它是否在 Linux 下工作等),请参阅 网站 上的庞大列表。此外,请不要问我如何配置调制解调器,除非您已查看本 HOWTO 并且仍然无法做到。我没有基于软件的调制解调器的个人经验。

请告知我事实、观点、逻辑、拼写、语法、清晰度、链接等方面的任何错误。但首先,如果日期超过一两个月,请检查您是否拥有最新版本。请将您认为属于本文档的任何其他信息发送给我。

1.5 本 HOWTO 的新版本

本 Modem-HOWTO 的新版本应每隔几个月发布一次。您的​​问题可能会在最新版本中得到解决。它将在 LDP 镜像站点上提供浏览和/或下载。有关此类站点的列表,请参阅:http://www.tldp.org/mirrors.html 如果您只想快速比较此版本 v0.39(2007 年 1 月)的日期与最新版本的日期,请访问:http://www.tldp.org/HOWTO/Modem-HOWTO.html

1.6 近期版本的新增内容

有关追溯到第一个版本的完整修订历史记录,请参阅源文件(linuxdoc 格式),网址为 http://cvsview.tldp.org/index.cgi/LDP/howto/linuxdoc/Modem-HOWTO.sgml

1.7 什么是调制解调器?

调制解调器(或模拟调制解调器)是一种允许人们在未设计用于数字信号的普通电话线上发送数字信号的设备。如果电话线都是数字的,那么您就不需要调制解调器。但有时,连接到数字电话线的模拟调制解调器的替代品,被不精确地称为“数字调制解调器”。调制解调器允许您的计算机连接到世界其他地方并与之通信。当您使用调制解调器时,您通常使用通信程序或 Web 浏览器来利用调制解调器并在电话线上拨出。高级调制解调器用户可以进行设置,以便其他人可以打电话给他们并远程使用计算机。这称为“拨入”。

简单来说,PC 的模拟调制解调器有四种基本类型:外部串行 (RS-232)、USB(= 外部 USB)、内部和内置。外部串行和 USB 调制解调器放在 PC 外部的桌面上,而其他两种类型是不可见的,因为它们在 PC 内部。外部串行调制解调器插入 PC 背面的一个称为“串行端口”的连接器。USB 调制解调器插入 USB 电缆。请参阅 USB 调制解调器。内部调制解调器是插入计算机内部的卡。内置调制解调器是主板上的一个芯片,主要用于笔记本电脑。本 HOWTO 中关于内部调制解调器的内容通常也适用于内置调制解调器。内部调制解调器进一步细分为 PCI、ISA 和 AMR,具体取决于它们是为 PCI 或 ISA 总线还是为 AMR 插槽设计的。

有关外部与内部的比较,请参阅 外部与内部。当您获得内部或内置调制解调器时,您还会获得一个专用的串行端口(该端口只能与调制解调器一起使用,而不能与外部调制解调器或控制台终端等任何其他设备一起使用)。在 Linux 中,常见的串行端口命名为 ttyS0、ttyS1 等。这些端口通常分别对应于 Dos/Windows 中的 COM1、COM2 等)。但在特殊情况下,名称会更长,例如:ttySHCF0 是一种 winmodem 类型的第 0 个串行端口(HCF = 主机控制系列)。新型串行端口只是在 ttyS 中添加了一些字母。

有关调制解调器和串行端口如何工作的更多详细信息,请参阅 调制解调器和串行端口基础知识。对于 USB 调制解调器,驱动程序模拟一个串行端口,例如 /dev/ttySHCFUSB。

调制解调器通常包括发送传真(传真调制解调器)的功能。有关传真软件列表,请参阅 传真。“语音”调制解调器可以像自动答录机一样工作,并处理语音邮件。请参阅 语音邮件软件

当有人拨打您的电话的普通语音电话时,v.92 协议可以将调制解调器“置于保持”状态,前提是您已从您的电话公司获得“呼叫等待”服务。因此,您可以在在线时接听电话。截至 2003 年 1 月,Linux 似乎不支持它。如果这是本 HOWTO 的最新版本,请告知我任何 Linux 对它的支持。一些 linmodem 驱动程序可能支持它(但是如果您有一个不使用任何 linmodem 驱动程序的硬件调制解调器怎么办?)。

1.8 我的电脑是否包含内置调制解调器?

内部调制解调器通常在计算机背面有一对模块化电话插孔。它们应该彼此相邻,并且每个看起来都像建筑物内墙上的一个插孔,电话插头插入其中。这对插孔之一应标记为“线路”(或类似物),您可以在此处插入电话线。

网卡也有模块化插孔,但它们很少成对出现,并且略宽,因为它们通常有 8 个引脚。内部 DSL“调制解调器”存在并且也有模块化电话插孔,但我认为截至 2002 年它们不是很常见(大多数 DSL 调制解调器都是外部的)。

1.9 快速安装

非常快速的安装

如果您认为您的调制解调器可以在 Linux 下工作并且不需要特殊的驱动程序,那么只需物理安装/连接它即可。启动您的计算机,观看 Linux 的启动时消息以查找调制解调器。请注意它是串行端口号,例如 ttyS2 (/dev/ttyS2)。将电话线连接到它并使用 wvdial 拨出(在配置 wvdial 之后)。如果以上方法不起作用,请继续阅读。

我的调制解调器可以在 Linux 下工作吗?

所谓的“winmodem”只有在存在驱动程序并安装后才能在 Linux 下工作。在这种情况下,它被称为“linmodem”,因为它可以在 Linux 下工作。如果是 2004 年之前制造的,请参阅 旧调制解调器列表基于软件的调制解调器 (winmodems)。安装无法在 Linux 下工作的调制解调器毫无意义。

外部串行调制解调器安装

曾经(2002 年?)没有外部串行调制解调器是 winmodem,但现在情况已不再如此。使用直通或调制解调器电缆,将调制解调器连接到 PC 上未使用的串行端口。确保您知道串行端口的名称:在大多数情况下,COM1 是 ttyS0,COM2 是 ttyS1 等。您可能需要检查 BIOS 设置菜单来确定这一点。插入电源线以向调制解调器供电。有关更多说明,请参阅 所有调制解调器

内部调制解调器(ISA、PCI 和 AMR)

如果调制解调器既是 PnP 又是串行驱动程序(内核 2.4 +)或您已安装的 winmodem 驱动程序直接支持的,那么您无需进行任何配置,因为驱动程序应配置它。

要物理安装调制解调器卡,请卸下 PC 的盖子,方法是/卸下一些螺钉。在其他适配器卡旁边找到与该卡匹配的空闲插槽。在将卡插入插槽之前,卸下 PC 背面的小盖板,以便可以从 PC 背面访问卡上的电话插孔。然后小心地将卡与插槽对齐,并将卡一直向下推入插槽。用安装螺钉固定卡(通常为 3 毫米,螺距为 0.5 毫米——不要使用错误的尺寸)。

您可以观看启动时消息,以查看是否检测到您的调制解调器。使用“dmesg”查看它们,或按 Shift+Page Up 在它们闪过之后向上滚动屏幕。

内部调制解调器:手动配置

通常,您不需要进行此手动配置,因为调制解调器的串行端口可能会在启动时被检测到并分配一个端口。例如:ttyS14,I/O 地址 0x6450(IRQ = 10)。否则(或者如果有一些特殊原因要更改配置),那么您需要自行配置它(或者可能更新您的内核以增加检测到调制解调器的可能性)。如果您的调制解调器没有分配 ttyS 编号,则在获得 ttyS 编号(如 ttyS10)之前,它将无法使用。因此,它无法被拨号器或 minicom 等应用程序检测到。但如果它在 PCI 总线上,则可以使用“lspci -v”找到它。

找到丢失的调制解调器可能不容易,您可能需要阅读本 HOWTO 的更多内容。找到后,您需要使用“setserial”程序手动将其分配给您选择的可用 ttyS? 端口。为此,您需要知道它的 IO 地址(例如 0x6450)及其 IRQ(例如 10)。在最坏的情况下,调制解调器已被 BIOS(或 Linux)未能检测和启用而禁用,并且没有任何 IO 地址或 IRQ 编号。但您可能仍然能够找到它。较旧的调制解调器可以通过卡上的跳线禁用,或者在极少数情况下可以通过 MS 软件禁用。

您可以选择 IRQ 和 IO 地址(包括您可以更改 BIOS 设置的情况)。请参阅 选择串行 IRQ选择地址

旧 ISA 调制解调器

ISA 调制解调器通常使用 ttyS0 - ttyS3。对于带有跳线的旧调制解调器,请查看调制解调器手册或查看调制解调器卡上的印刷内容,其中告诉您跳线的作用。它们具有对应于 ttySx 的标准 IO 地址。例如,您可能会发现使用 IO 地址 0x3e8 和 IRQ 11 的 /dev/ttyS2 是可行的。

如果它没有跳线,那么它很可能是一个即插即用调制解调器,BIOS 可能会在您启动电脑时对其进行配置。输入 “pnpdump --dumpregs” 应该可以找到它。如果您需要设置或更改它们,请使用 “isapnp”。 使用 “pnpdump” 程序查看可能进行的更改。

PCI 和 ISA 都适用: 使用 setserial 告诉串口驱动程序

您必须找到在启动时运行 “setserial” 的文件,并添加类似这样的行:“setserial /dev/ttyS2 irq 5 port 0x0b8”。对于 setserial v2.15 及更高版本,在命令行运行 “setserial” 的结果可能(也可能不会)保存到名为 serial.conf 或 autoserial.conf 的文件中。它可能在 /etc 目录或 /var/lib/setserial 目录中(使用 “locate” 查找)。它在每次启动时运行。请参阅 什么是 Setserial 以获取更多信息。请参阅下一小节 所有调制解调器 以获取关于快速安装的进一步说明。

使用 MS Windows 设置 BIOS(最后的手段)

如果您正在使用 BIOS 进行配置,您可以尝试使用 MS Windows9x “强制” BIOS 设置特定的 IRQ 和/或 IO。它可以将它们设置到 PnP BIOS 的闪存存储器中,在那里它们将被用于为 Linux 以及 Windows 配置。请参阅 “Plug-and-Play-HOWTO” 并搜索 “forced”(在多个地方出现)。对于 Windows 3.x,您可以使用 Windows 3.x 下的 ICU 做同样的事情。少数调制解调器有一种方法可以使用调制解调器附带的软件(在 Windows 下)禁用调制解调器硬件中的 PnP 功能。

所有调制解调器

将调制解调器插入电话线。然后配置拨号程序。如果您有互联网服务提供商 (ISP),您可以配置以下程序之一:wvdial、pppconfig、gnome-ppp、modem lights (Gnome) 或 kppp。它们不仅拨号,还启动 PPP,这是您连接到互联网所需要的。否则,您可以尝试配置 minicom 拨号器,它不是为连接到互联网而设计的,但非常适合测试。无论是 minicom 还是启动 PPP 的拨号器,都应将串口速度设置为比调制解调器比特率高几倍的波特率。有关要使用的“最佳”速度的更多详细信息,请参阅 速度表。告诉它您的串口全名,例如 /dev/ttyS1(或 /dev/ttys/1)。

Minicom 是设置和测试调制解调器的一种方法。设置硬件流控制 (RTS/CTS)。使用 minicom,您可以检查您的调制解调器是否在那里(并准备好拨号)。一旦您设置好 minicom,输入命令:AT,按回车键,您应该看到来自调制解调器的 “OK” 响应。请参阅 使用 Minicom 拨号

1.10 dev/modem

如果您的调制解调器在例如 /dev/ttyS2 上,您可能想将其链接到 /dev/modem。这样做并不是真正必要的,因为您可以写下(或记住)例如 ttyS2,并告诉使用调制解调器的程序。仅仅链接它可能会更简单。要链接它,请输入例如 ln -s /dev/ttyS2 /dev/modem 。注意 “ttyS2” 只是举例。它实际上可能是 ttyS14 等。或者使用 Red Hat 的 modemtool(或类似的工具)来链接它。但是一旦您链接了它,请确保所有使用调制解调器的程序都使用 /dev/modem 而不是 /dev/ttyS2,否则两个程序可能会尝试同时使用调制解调器而不知道它们正在这样做。系统软件在 2000 年左右编写以解决这个问题,但它可能不在最近的内核中(如 2.6)。


2. Linux PC 的调制解调器

2.1 许多 Winmodem 在 Linux 下无法工作

不幸的是,由于缺少 Linux 驱动程序,一些软件调制解调器 (winmodem) 在 Linux 下无法工作。配置可以与 Linux 一起使用的软件调制解调器,其难度从非常容易(自动)到困难不等,这取决于调制解调器、您的技能以及找到关于您的调制解调器的信息有多容易 —— 这些信息并非全部在本 HOWTO 中。如果您购买了一个新的,但不确定它是否能在 Linux 下工作,请尝试达成协议,如果它无法工作,您可以退货并获得退款。

即使您的调制解调器在 Linux 下工作,在它所在的串口被启用并为操作系统所知之前,它也无法使用。有关详细解释(或者如果启动时消息没有显示您调制解调器的串口),请研究本 HOWTO 或参阅 Plug-and-Play-HOWTO。

2.2 外部与内部

用于 PC 的调制解调器可以是内部的、外部串口的或外部 USB 的。内部调制解调器安装在您的 PC 内部(您必须移除螺丝等才能安装它)。外部调制解调器只需插入电缆:USB 电缆(USB 调制解调器)或串口(RS-232 串口调制解调器)。与外部串口调制解调器相比,内部调制解调器更便宜,更不容易因缓冲区溢出而导致数据丢失,并且通常使用更少的电力。内部调制解调器显然不占用任何桌面空间。

外部串口调制解调器通常更容易安装,并且通常配置问题较少,前提是您要连接它的串口配置良好。外部 USB 调制解调器更可能是 winmodem,据报道通常比外部串口调制解调器更难处理。外部调制解调器有指示灯,可以为您提供有关正在发生的事情的线索,并有助于故障排除。串口和调制解调器可以物理分离的事实也有助于故障排除。外部调制解调器很容易移动到另一台计算机。如果您需要关闭电源以重置调制解调器(这很少是必要的),那么使用外部调制解调器,您不必关闭整个 PC 的电源。

不幸的是,大多数外部串口调制解调器没有开关来在不使用时关闭电源,因此即使在关闭时也可能消耗少量电力(除非您从墙上拔下电源插头)。它们消耗的每瓦电力通常每年花费您超过 1 美元。外部调制解调器的另一个可能的缺点是,您将被迫使用现有的串口,该串口可能不支持超过 115,200 bps 的速度(尽管截至 2000 年末,大多数新的内部调制解调器也不支持 —— 但有些支持)。有关详细信息,请参阅 无法设置足够高的速度

2.3 是否需要驱动程序?

当然,任何调制解调器都需要 Linux 自带的串口驱动程序(内置于内核中或作为模块)。对于 PCI,此驱动程序也应该检测到调制解调器,但这并不是真正的调制解调器驱动程序,因为它只是检测到调制解调器所在的串口。

但是调制解调器驱动程序呢?任何软件调制解调器(winmodem、linmodem)都必须有调制解调器驱动程序(如果 Linux 有的话)。硬件调制解调器实际上不需要任何调制解调器驱动程序,除非您想使用特殊功能,例如语音和“调制解调器保持”。

软件调制解调器需要软件来运行它们,并且显然需要驱动程序。MS Windows 的驱动程序是 *.exe 程序,它们无法在 Linux 下运行。因此,您必须使用 Linux 驱动程序(如果存在)。请参阅 基于软件的调制解调器(winmodem、linmodem)

2.4 外部调制解调器

它们都在 Linux 下工作吗?

曾经(2002 年?)所有外部调制解调器都可以在 Linux 下工作。但是后来出现了无控制器外部调制解调器,它不行。如果包装盒上说它需要 Windows,而没有提及 Linux,则可能就是这个意思。是否可能是提供了 Windows 软件用于 “调制解调器保持” 和用作答录机等,但在其他方面它可以在 Linux 下工作?Linux 可能不太好地支持这些功能,或者根本不支持。如果这是最新版本的 Modem-HOWTO,请让我知道您在这方面的经验。

PnP 外部调制解调器

许多外部调制解调器都标有 “即插即用” (PnP)。如果它们是硬件调制解调器,它们都应该像非 PnP 调制解调器一样工作。虽然串口本身可能需要配置(IRQ 号和 IO 地址),除非默认配置没问题,否则外部调制解调器不使用这种 IRQ/IO 配置。您只需将调制解调器插入串口即可。

PnP 调制解调器内置了特殊的 PnP 识别码,PnP 操作系统可以通过串口读取该识别码。这样的操作系统然后会知道您在某个端口上有一个调制解调器,并且也会知道 ID 号。如果是无控制器调制解调器,它可以尝试为它找到驱动程序。它还可以告诉应用程序您的调制解调器在哪个端口上(例如 /dev/ttyS2 或 COM3)。但是 Linux 可能无法做到这一点。因此,您可能需要手动配置您的应用程序,方法是给它 ttyS 号(例如 /dev/ttyS2)。一些程序如 wvdial 可以探测各种端口上的调制解调器。

布线和安装

与将大多数其他设备连接到需要各种类型的 “零调制解调器” 电缆(不适用于调制解调器)的串口相比,连接外部调制解调器很简单。调制解调器使用直通电缆,没有引脚交叉。大多数电脑商店都应该有。确保您获得正确的公母头和引脚数。将您的调制解调器连接到您的一个串口。如果您愿意接受您连接到的端口的默认 IRQ 和 IO 地址,那么您就可以启动您的通信程序并配置调制解调器本身了。

指示灯(LED)的含义(对于某些外部调制解调器)

2.5 内部调制解调器

内部调制解调器通过取下 PC 的外壳并将调制解调器卡插入主板上的空闲插槽中来安装在 PC 中。有用于 PCI 插槽的调制解调器,用于较旧的 ISA 插槽的其他调制解调器,以及用于新的小型 AMR 插槽的 ARM 软件 “调制解调器”。只有一些较新的 PC 会有 ARM 插槽。虽然外部调制解调器插入串口(通过短电缆),但内部调制解调器将串口内置到调制解调器中。换句话说,调制解调器卡既是串口又是调制解调器。

设置串口的 IO 地址和 IRQ 以前是通过卡上的跳线完成的。这些是小的黑色矩形 “立方体”,尺寸约为 5x4x2 毫米,推入卡上的引脚上方。即插即用调制解调器(实际上是调制解调器的串口部分)不使用跳线来设置这些,而是通过向计算机内部总线发送配置命令来配置。此类配置命令可以由 PnP BIOS、isapnp 程序(仅适用于 ISA 总线)、setpci(PCI 总线:无法设置 IRQ)或更新的串口发送,以了解如何配置那些未由串口驱动程序配置 io-irq 的调制解调器。

  1. ISA 总线:使用 “isapnp”,它可能在每次启动时自动运行
  2. 让 PnP BIOS 来做,然后也许告诉 setserial IO 和 IRQ
  3. PCI 总线:使用 lspci -vv 查看它,并使用 setpci 仅配置 IO(无法设置 IRQ)。

有关更多详细信息,特别是对于 PCI 总线,请参阅 快速安装

2.6 基于软件的调制解调器(winmodem、linmodem)

软件调制解调器(winmodem)简介

软件调制解调器将调制解调器的部分(甚至几乎全部)工作转移到您计算机的主处理器 (CPU) 芯片(例如奔腾芯片)。这需要特殊的软件(调制解调器驱动程序)来完成这项工作。直到 1999 年末,此类软件才仅针对 MS Windows 发布,并且无法在 Linux 下工作。更糟糕的是,调制解调器的制造商对调制解调器的接口保密,因此没有人可以为其编写 Linux 驱动程序(即使有一些志愿者愿意编写 Linux 驱动程序)。

但自那时以来,情况有所改善,以至于今天(2001 年末)许多此类调制解调器都有 Linux 驱动程序。没有标准接口,因此不同品牌/型号的软件调制解调器需要不同的驱动程序(除非不同的品牌/型号恰好在内部使用相同的芯片组)。但是,某些驱动程序可能无法完美运行,也可能不具备 MS Windows 驱动程序的所有功能。

软件调制解调器的另一个名称(MS 使用的)是 “基于驱动程序的调制解调器”。传统的基于硬件的调制解调器(在 Linux 下工作)不需要调制解调器驱动程序(但确实使用 Linux 串口驱动程序)。大约在 1998 年中期之后,大多数新的内部调制解调器都是软件调制解调器。

软件调制解调器分为两类:linmodem 和 winmodem。Winmodem 仅在 MS Windows 下工作。Linmodem 将在 Linux 下工作。它们以前大多是 winmodem,因此有些人也称它们为 “winmodem”。术语 “Winmodem” 也是某种型号 “winmodem” 的商标,但这并不是本文档中的含义。

Linmodem

1999 年末,出现了两种可以在 Linux 下工作的基于软件的调制解调器,因此被称为 “linmodem”。Lucent Technologies (LT) 非正式地发布了一个 Linux 二进制代码,以支持其大多数 PCI 调制解调器。PC-TEL(包括 “Zoltrix”)为 Linux 推出了一种新的基于软件的调制解调器。此后,人们对使 winmodem 在 Linux 下工作产生了更大的兴趣。Intel(Modem Silicon Operations)MD563x HaM 芯片组(前身为 Cirrus Logic 的 Ambient 部门)有一个 GPL 驱动程序。截至 2001 年中期,还有以下驱动程序:Conexant HSF 和 HCF、Motorola SM56(支持已终止)、ESS(仅限 ISA)和 IBM 的 Mwave for Thinkpads 600+。请参阅 http://linmodems.org

现在(2001 年)有多少百分比的软件调制解调器在 Linux 下工作?嗯,有一些调制解调器芯片不受支持:Lucent/Agere ARM (Scorpio)、3COM/US Robotics、一些 SmartLink(3 种不同的芯片组)、Ambient HSP 以及可能还有其他的。因此,截至 2001 年末,似乎超过一半的软件调制解调器芯片得到了支持。截至 2005 年,情况似乎变得更糟了。为什么?嗯,Linux 在桌面上的增长不如预期那么快,许多 PC 用户转向了更高速的有线调制解调器和 DSL。

另一个原因是,许多驱动程序是多年前编写的,并且仅适用于旧版本的 Linux 内核。驱动程序代码是保密的,公司不想为他们不再销售的硬件更新驱动程序。

请提前注意,确定您的调制解调器是否是 linmodem 可能不是很简单。您可能需要首先找出您拥有什么芯片组以及谁制造的。仅知道您调制解调器的品牌和型号可能是不够的。一种方法是从 http://linmodems.org 下载 scanModem 工具,但结果可能难以理解,您可能需要向 linmodems 邮件列表寻求帮助。另一种方法是使用例如 “lspci -v”,然后使用长调制解调器编号查找芯片制造商。这需要检查数据库或搜索互联网。还有另一种方法是查看调制解调器卡上芯片上的细小文字。所有这些并非总是简单的。可能会发生这种情况,您会为此付出很多努力,最终却得到坏消息,即您的调制解调器不受支持。但即使它受到支持,支持也可能仅适用于旧版本的内核。有关更多详细信息,请参阅 Linmodem-HOWTO。

Linmodem 站点和文档

基于软件的调制解调器类型

有两种基本类型的软件调制解调器。在一种类型中,软件几乎完成了所有工作。另一种类型是软件仅执行 “控制” 操作(这是除处理数字波形之外的所有操作 —— 稍后解释)。由于硬件不进行控制,因此称为 “无控制器” 调制解调器。第一种类型是全软件调制解调器(有时简称为软件调制解调器)。

对于这两种类型,调制解调器(或主板上)中都必须有模拟硬件来生成电波形以发送到电话线。它由数字信号(这是一种 “数字波形”)生成。它有点像数字电子设备在方格纸上创建了许多离散点,然后调制解调器通过它们绘制一条平滑的电压曲线。还必须有硬件将传入的波形转换为数字信号。这只是模数转换(反之亦然)。它由编解码器(编码器-解码器)完成。

传入的数字波形必须转换为数据字节流。这是解调过程的一部分。回想一下,这些数据字节很可能已被压缩,因此它们与原始消息完全不同。将数据字节转换为数字波形是调制过程的一部分。即使解调完成,调制解调器也不能只是将生成的传入数据字节流发送到串口输入缓冲区,但必须首先进行解压缩、纠错,并将串行转换为计算机的并行总线。但是调制解调器可能会让 CPU 来完成实际工作。对于传出的数据字节流,顺序相反。

两种类型的基于软件的调制解调器之间的区别在于数字调制发生的位置。在全软件调制解调器中,这种调制在 CPU 中完成,称为主机信号处理器 (HSP)。在无控制器调制解调器中,它在调制解调器中完成,但所有其他数字工作都由 CPU 完成。其他数字工作包括处理 AT 命令、数据压缩、纠错和模拟串口。在全软件调制解调器中,仍然有两个项目由硬件处理:编解码器对波形的 A/D 转换和回声消除。

这个调制解调器是软件调制解调器吗?

您如何确定内部调制解调器是否是软件调制解调器?首先查看其名称、描述,甚至其 MS Windows 驱动程序的名称是否表明它是软件调制解调器:HSP(主机信号处理器)、HCF(主机控制系列)、HSF(主机信号系列)、无控制器、主机控制、基于主机和软-... 调制解调器。如果它是这些调制解调器之一,它将仅在有 Linux 驱动程序可用的情况下工作。由于软件调制解调器成本较低,因此价格低是它是软件调制解调器的线索。

如果您不知道调制解调器的型号,并且您的 Linux PC 上也有 Windows,请单击 “控制面板” 中的 “调制解调器” 图标。然后查看 调制解调器列表(2003 年后未维护)。如果以上方法不起作用(或不可行),您可以查看调制解调器随附的包装(或手册)。阅读包装上写着 “最低系统要求” 或仅 “系统要求” 的部分。

硬件调制解调器在旧 CPU(例如 386 或更好)上也能正常工作。因此,如果它需要现代 CPU(例如奔腾或其他 “高速” CPU,例如超过 150 MHz),这是一个线索,表明它是全软件调制解调器。如果它仅需要 486 CPU(或更好),那么它很可能是主机控制的软件调制解调器。说它仅适用于 Windows 也是坏消息。但是,即使在这种情况下,也可能有适用于它的 Linux 驱动程序,或者可能是标签错误。

否则,如果它未能明确说明您必须拥有 Windows,则它可能是硬件调制解调器。通过说它是 “为 Windows 设计的”,可能仅意味着它完全支持 Microsoft 的即插即用,这没问题,因为 Linux 使用相同的即插即用规范(但在 Linux 下配置更难)。因此,“为 Windows 设计的” 并不能说明它是否能在 Linux 下工作。您可以查看制造商的网站或通过电子邮件询问。一些制造商明确声明某些型号在 Linux 下工作。有时它们是 linmodem,需要您获取并安装特定的 linmodem 驱动程序。

我应该购买软件调制解调器吗?

仅当您知道有适用于它的 Linux 驱动程序并且运行良好时才应该购买。但是,如果驱动程序没有得到维护,因此无法与未来版本的内核一起使用,则可能会出现问题。此外,驱动程序可能不具备完整的功能。除了获得令人满意的驱动程序的问题之外,软件调制解调器的优缺点是什么?由于软件调制解调器使用 CPU 来完成其部分(或全部)工作,因此软件调制解调器需要更少的板载电子设备,因此成本更低。与此同时,CPU 工作负载因调制解调器而增加,这可能会导致运行速度变慢。

调制解调器对 CPU 的负载百分比取决于您拥有的 CPU 以及它是否是全软件调制解调器。对于现代 CPU 和仅将 CPU 用作控制器的调制解调器,性能损失很小。即使它是全软件调制解调器,如果在同一时间没有运行其他 CPU 密集型任务,您也不会遭受性能损失。当然,当您不使用软件调制解调器时,根本不会出现性能下降。

节省的调制解调器成本是否值得?在许多情况下是值得的,特别是如果您不经常使用调制解调器,并且/或在使用调制解调器时没有运行任何其他 CPU 密集型任务。节省的调制解调器成本可以用于更好的 CPU,这将稍微加快速度。但是硬件调制解调器的板载电子设备可以比通用 CPU 更有效地完成工作(除了在不使用时根本没有效率)。因此,如果您经常使用调制解调器,最好避免使用全软件调制解调器。

2.7 PCI 调制解调器

PCI 调制解调器卡是一种插入 PC 主板上的 PCI 总线插槽的卡。虽然许多 PCI winmodem 在 Linux 下无法工作(没有可用的驱动程序),但其他 PCI 调制解调器可以在 Linux 下工作。Linux 串口驱动程序已经过修改,以支持某些 PCI 硬件调制解调器卡(但不支持 winmodem/linmodem)。如果是 linmodem,则只有在您安装了特定的 linmodem 驱动程序后才能工作。如果 Linux 串口驱动程序支持您的硬件调制解调器,则驱动程序将为您设置 PnP 配置。请参阅 正在进行的 PCI 总线支持。如果 Linux 串口驱动程序没有对您的 PCI 硬件调制解调器提供特殊支持,它可能仍然可以正常工作,但您必须做一些工作来配置它。

2.8 AMR 调制解调器

这些主要用于笔记本电脑。它们都是 winmodem,插入主板上的特殊 AMR(音频调制解调器升位卡)插槽中。音频卡或组合式音频-调制解调器卡有时在此插槽中使用。该插槽的主要用途是 HSF 型调制解调器,其中 CPU 完成几乎所有工作。这导致了一个小的 “调制解调器” 卡,从而形成了一个短的 AMR 插槽。主板有一个编解码器,它从 CPU 获取数字输出并在 ARM 插槽处生成模拟电压波(反之亦然)。因此,插入插槽的 “调制解调器” 除了将电话线与编解码器接口外,几乎无需做任何事情。Linux 至少支持一个 AMR 调制解调器。lspci -v 应该会显示它。

2.9 USB 调制解调器

USB = 通用串行总线。大多数 USB 调制解调器都是 winmodem,因此许多在 Linux 下无法工作。Linux 支持符合 USB 通信设备类抽象控制模型 (= USB CDC ACM) 的调制解调器。ACM 有一个名为 acm.o 的模块。请参阅内核文档目录中的 /usb/acm.txt 文档(Debian 中为 /usr/share/doc/kernel-doc-2.6.x,在某些发行版中可能为 /usr/doc/kernel...)。第一个(第 0 个)此类调制解调器的 ACM “串口” 是:/dev/usb/acm/0 或可能是 /dev/usb/ttyACM0。无论您是否使用新的 “设备文件系统”,都应该是这种情况。它不是真正的串口,但驱动程序使其看起来像一个串口,供使用调制解调器的软件使用。

由于 USB 上的带宽很高,因此可以将更多内容发送到 USB 调制解调器,而不仅仅是数据。这意味着创建 USB winmodem 是可行的,其中驱动程序在 CPU 上完成调制解调器的大部分工作,并将结果发送到调制解调器。因此,请注意 USB winmodem(除非它们具有 Linux 支持)。

2.10 哪些内部调制解调器可能无法在 Linux 下工作

MWave 和一些 DSP 调制解调器

请注意,现在有一个用于 IBM Thinkpad 600+ 中使用的 ACP (Mwave) 调制解调器的 Linux 驱动程序。请参阅 mini-HOWTO:ACP-Modem。

虽然硬件调制解调器过去使用 DSP(数字信号处理器),但其中一些 DSP 由驱动程序编程,驱动程序必须在使用调制解调器之前从硬盘下载到 DSP 内存中。不幸的是,这种下载通常由 Dos/Windows 程序完成(这不适用于 Linux)。但是,在使其中一些调制解调器与 Linux 一起工作方面已经取得了相当大的成功。例如,有一个 Linux 驱动程序可用于运行 Lucent (DSP) 调制解调器。

通常在 Linux 下正常工作的调制解调器(无需调制解调器驱动程序)通常也有 DSP(并且可能会在包装上提及这一点),但运行 DSP 的程序存储在调制解调器内部。这些在 Linux 下工作良好。在 Linux 下工作有问题的一个 DSP 调制解调器的例子是旧的 IBM Aptiva MWAVE。

使一些 DSP 调制解调器与 Linux 一起工作的一种方法是从 DOS 启动(如果您的 Linux PC 上有 DOS)。您首先在 DOS 下安装驱动程序(使用 DOS 而不是 Window 驱动程序)。然后启动 Dos/Windows 并启动调制解调器的驱动程序,以便对 DSP 进行编程。然后在不关闭计算机的情况下,启动 Linux。

可以编写一个 “批处理” 文件(实际上是一个脚本)来执行此操作。这是一个示例,但您必须对其进行修改以适应您的情况。

rem mwave is a batch file supplied by the modem maker
call c:\mww\dll\mwave start
rem loadlin.exe is a DOS program that will boot Linux from DOS (See
rem Config-HOWTO).
c:\linux\loadlin f:\vmlinuz root=/dev/hda3 ro

可以为 Window 的桌面创建一个图标,该图标指向这样的批处理文件,并将图标属性设置为 “在 MSDOS 模式下运行”。然后通过单击此图标,您可以设置调制解调器并转到 Linux。从 DOS 启动 Linux 的另一种可能方法是按 CTRL-ALT-DEL 并告诉它重新启动(假设您已设置好可以直接启动到 Linux)。调制解调器保持与在 DOS 下使用的相同的 com 端口(相同的 IO 地址)。

Newcom ifx 调制解调器需要一个小内核补丁才能正常工作,因为其模拟串口是非标准的。有关使用此调制解调器与 Linux 的补丁和其他信息,请访问 http://quinine.pharmacy.ohio-state.edu/~ejolson/linux/newcom.html

旧 Rockwell (RPI) 驱动程序

一些较旧的 Rockwell 芯片需要 Rockwell RPI(Rockwell 协议接口)驱动程序来进行压缩和纠错。即使驱动程序软件仅在 MS Windows 下工作,它们仍然可以在 Linux 下使用。这是因为 MS Windows 软件(您没有)仅进行压缩和纠错。如果您愿意在没有压缩和纠错的情况下操作调制解调器,那么可以在 Linux 下使用它。为此,您需要在每次打开调制解调器电源时,通过发送调制解调器(通过初始化字符串)“RPI 禁用” 命令来禁用 RPI。在我的旧调制解调器上,此命令是 +H0。没有可用的数据压缩会使获取网页的速度变慢,但在下载已经压缩的文件时速度一样快。


3. 调制解调器池、RAS

3.1 简介

“调制解调器池” 是一组通常用于接收来电的调制解调器。如今,许多此类调制解调器可能在一张卡上。ISP 曾经使用调制解调器池,以便客户可以呼叫 ISP,但如今,RAS(远程访问服务器)已取代 ISP 的调制解调器池。RAS 适用于接近 56k (V.90 和 V.92) 的来电,并使用相当于 “数字调制解调器” 的东西。调制解调器池使用较旧的模拟调制解调器,对于来电只能达到 33.6 kbps。因此,模拟调制解调器池更可能被不想使用更昂贵的 RAS 的小型组织使用。从某种意义上说,RAS 是一种数字调制解调器池。

模拟调制解调器池可以由模拟多端口调制解调器卡提供。在过去,它是外部机箱中的许多调制解调器(类似于外部调制解调器)。此类调制解调器可以是类似于用于家庭/办公室 PC 的调制解调器的模拟调制解调器(即使它们被标记为 “56k 调制解调器”,也无法发送高于 33.6k 的速度)。RAS 将使用 “数字调制解调器”,它可以以接近 56k 的速度发送(如果您有良好的线路)。“数字调制解调器” 需要与电话线的数字连接,并且根本不使用任何串口。所有这些调制解调器池(或 RAS)都将要求您为其安装特殊的驱动程序。

3.2 模拟调制解调器池,多调制解调器卡

“多调制解调器卡”是“多端口调制解调器卡”的简称。有些人会在“multi”后加一个连字符:multi-modem 或 multi-port。模拟调制解调器池只是许多模拟调制解调器(常见的家用/办公室调制解调器),它们可以安装在内部插卡上或外部机箱中。每个调制解调器都自带一个内置的串行端口。通常会有一个共享中断或由其自身电子设备处理中断的系统,从而减轻 CPU 的大部分负担。请注意,这些调制解调器不是“数字调制解调器”,因此无法为拨入的用户使用 56k 速率。

以下是一些生产模拟多端口调制解调器卡的公司列表,这些卡可以插入 PC 的插槽中。每卡 8 个调制解调器很常见。列出的卡声称可以与 Linux 配合使用,并且这些网站应该会为您提供它们的驱动程序。

多调制解调器卡(模拟,非数字)

3.3 数字调制解调器,RAS

“数字调制解调器”与大多数人在 PC 中使用的模拟调制解调器大不相同。但是它们可以与电话线另一端的模拟调制解调器通信。ISP 使用“数字调制解调器”以接近 56k bps 的速率向家庭和办公室的 56k 调制解调器发送数据。“数字调制解调器”需要与电话线的数字连接(例如 T1、EI、ISDN PRI 等)。除了某些串行 ISDN“调制解调器”外,它们不使用串行端口作为与计算机的接口。相反,它们通过特殊的卡(也可能包含“数字调制解调器”)直接连接到计算机总线。它们通常是“远程访问服务器”(RAS)或“数字调制解调器池”的组成部分。

您可能已经知道,每次您从模拟设备(电话或调制解调器)拨打电话时,电话公司都会将其转换为数字信号。然后,它以数字信号的形式传输到靠近目的地的位置,最后在到达目的地之前再次转换回模拟信号。但是,如果您拥有所谓的“T1”线路等,也可以直接从电话公司接收此数字信号。

来自电话公司携带数字信号的电缆被设计为具有高带宽,以便同一根电缆可以承载多个电话呼叫。这是通过所谓的“时分多路复用”完成的。电缆中的单个电话呼叫在两个不同的通道上进行,每个方向一个通道。因此,RAS 必须将每个这样的通道对连接到为该电话呼叫服务的相应“数字调制解调器”。此类任务由有时称为“... 集中器”的设备完成。

现在,“数字调制解调器”接收到的数字信号可能实际上代表模拟调制解调器发送给它的模拟信号。这是因为当您向电话公司发送模拟信号(包括普通语音)时,它会被电话公司转换为数字信号。数字调制解调器处理此数字信号的一种方法是将其转换为模拟信号,然后通过模拟调制解调器,以获取模拟调制解调器发送的数字数据。但是为什么要进行所有这些工作呢?既然信号已经是数字形式,为什么不以数字方式处理它呢?这就是它的工作方式。数字信号被处理并转换为另一个数字字节流,该字节流表示模拟调制解调器发送的数据字节。“数字信号处理器”(DSP)通常用于此任务。CPU 也可以处理它,但负载会很重。

同样,“数字调制解调器”必须处理从 RAS 向数字电话线发送数字信号的反方向。因此,它只进行数字到数字的转换,根本不处理模拟信号。因此,它实际上根本不是调制解调器,因为它不调制任何模拟载波。因此,“数字调制解调器”这个名称用词不当,但它确实完成了以前由调制解调器完成的工作。因此,一些“数字调制解调器”称自己为“数字信号处理器”或“远程访问服务器”等,甚至可能不提及“调制解调器”一词。

这样的 RAS 系统可以是独立的专有服务器,也可以是包含数字调制解调器的机箱,该机箱通过特殊的接口卡连接到 PC,或者仅仅是一张卡本身。Digi 将其中一张卡称为“远程访问服务器集中器适配器”。成为 ISP 所需条件的一个不完整描述是:请参阅 我需要什么才能成为 ISP?。Cyclades 在此处推广自己的产品,因此在购买任何东西之前请进行比较购物。


4. 串行端口和调制解调器基础知识

您不必了解基础知识即可使用和安装调制解调器。但是,了解它可能有助于确定您遇到问题时的问题所在。阅读完本节后,如果您想更好地理解它,您可能想查看本文档中的 调制解调器如何工作(尚未完成)。有关串行端口的更多详细信息(包括本节的大部分内容)将在 Serial-HOWTO 中找到。

4.1 调制解调器将数字信号转换为模拟信号(反之亦然)

大多数电话主干线已经是数字的,但是通往您家(或企业)的线路通常是模拟的,这意味着它们被设计用来传输电压波,该电压波是您口中发出的声波的精确复制品。这种电压波称为“模拟”。如果在示波器上观察,它看起来像一个频率和幅度变化的 sine 波。数字信号就像方波。例如,3 伏(伏特)可能是 1 位,而 0 伏可能是 0 位。对于大多数串行端口(外部调制解调器使用),+12 伏是 0 位,-12 伏是 1 位(有些是 + 或 - 5 伏)。

为了通过电话线从您的计算机发送数据,调制解调器会从您的计算机获取数字信号并将其转换为“模拟”信号。它通过创建模拟 sine 波然后“调制”它来做到这一点。由于结果仍然表示数字数据,因此也可以将其称为数字信号而不是模拟信号。但是它看起来有点像模拟信号,几乎每个人都称其为模拟信号。在电话线的另一端,另一个调制解调器“解调”此信号,并且恢复了纯数字信号。将上面两个词的“mod”和“dem”部分放在一起,您就得到了“modem”(如果您删除两个 d 中的一个)。因此,“调制解调器”是调制器-解调器。“调制”到底是什么可以在 调制细节 部分找到。

4.2 什么是串行端口?

串行端口简介

UART 串行端口(或简称“串行端口”)是一种 I/O(输入/输出)设备。由于调制解调器和计算机之间有串行端口,因此有必要了解串行端口以及调制解调器。

大多数 PC 都有一到两个串行端口。每个端口在计算机背面都有一个 9 针连接器(有时为 25 针)。计算机程序可以将数据(字节)发送到发送引脚(输出),并从接收引脚(输入)接收字节。其他引脚用于控制目的和接地。

串行端口不仅仅是一个连接器。它将数据从并行转换为串行,并更改数据的电气表示形式。在计算机内部,数据位以并行方式流动(同时使用多根导线)。串行流是单根导线上的位流(例如,在串行连接器的发送或接收引脚上)。为了使串行端口创建这样的流,它必须将数据从并行(计算机内部)转换为发送引脚上的串行(反之亦然)。

串行端口的大部分电子元件都可以在称为 UART 的计算机芯片(或芯片的一部分)中找到。有关 UART 的更多详细信息,请参见 Serial-HOWTO 中的“什么是 UART”部分。但是您可能想先完成本节,以便您希望了解 UART 如何适应事物的整体方案。

引脚和导线

旧的 PC 使用 25 针连接器,但实际上只使用了大约 9 个引脚,因此今天大多数连接器只有 9 针。9 个引脚中的每一个通常都连接到一根导线。除了用于发送和接收数据的两条导线外,另一个引脚(导线)是信号地。任何导线上的电压都是相对于此地测量的。因此,用于双向数据传输的最小导线数量为 3。除非已知在没有信号地线的情况下也可以工作,但性能会降低,有时会出现错误。

还有更多的导线仅用于控制目的(信号),而不是用于发送字节。所有这些信号都可以共享在单根导线上,但是,对于每种类型的信号,都有一根单独的专用导线。这些控制线中的一些(或全部)称为“调制解调器控制线”。调制解调器控制线处于断言状态(开启),电压为 +12 伏,或处于否定状态(关闭),电压为 -12 伏。其中一根导线用于向计算机发出信号,以停止通过串行端口电缆发送字节。相反,另一根导线向连接到串行端口的设备发出信号,以停止向计算机发送字节。如果连接的设备是调制解调器,则其他导线可以告诉调制解调器挂断电话线,或告诉计算机已建立连接或电话线正在响铃(有人试图呼入)。有关更多详细信息,请参见 Serial-HOWTO:引脚排列和信号。

内部调制解调器包含串行端口

对于内部调制解调器,没有 9 针连接器,但是行为几乎与上述电缆导线存在的情况完全相同。内部调制解调器可能只是使用其自身内存(寄存器)中的状态位来确定此不存在的“导线”的状态,而不是使用导线中的 12 伏信号来给出调制解调器控制线的状态。对于计算机而言,内部调制解调器的串行端口看起来就像一个真正的串行端口。它甚至包括可以在普通串行端口上设置的速度限制,例如 115200 位/秒。

不幸的是,对于 Linux 而言,当今许多内部调制解调器都使用软件(在 CPU 上运行)来完成调制解调器的大部分工作。不幸的是,此类软件可能仅适用于 MS Windows 操作系统(尚未移植到 Linux)。因此,您无法在 Linux 中使用其中一些调制解调器。请参阅 基于软件的调制解调器(Winmodem)

4.3 IO 地址和 IRQ

由于计算机需要与每个串行端口通信,因此操作系统必须知道每个串行端口的存在及其位置(其 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 地址实际上是一系列地址。此范围内的较低地址是基地址。“地址”通常仅表示“基地址”。

4.4 名称:ttyS0、ttyS1 等

串行端口的名称为 ttyS0、ttyS1 等(并且通常分别对应于 DOS/Windows 中的 COM1、COM2 等)。/dev 目录为每个端口都有一个特殊文件。键入“ls /dev/ttyS*”以查看它们。仅仅因为可能存在(例如)ttyS3 文件,并不一定意味着那里存在物理串行端口。

这些名称(ttyS0、ttyS1 等)中的哪一个指的是哪个物理串行端口,其确定方式如下。串行驱动程序(软件)维护一个表格,显示哪个 I/O 地址对应于哪个 ttyS。名称(例如 ttyS1)到 I/O 地址(和 IRQ)的这种映射可以通过“setserial”命令设置和查看。请参阅 什么是 Setserial。这不会在硬件本身中设置 I/O 地址和 IRQ(这是由跳线或即插即用软件设置的)。因此,哪个物理端口对应于例如 ttyS1,既取决于串行驱动程序的想法(根据 setserial),又取决于硬件中设置的内容。如果犯了错误,则物理端口可能不对应于任何名称(例如 ttyS2),因此无法使用它。有关更多详细信息,请参见 串行端口设备 /dev/ttyS2 等

4.5 中断

字节通过电话线进入调制解调器,由调制解调器从模拟信号转换为数字信号,然后传递到串行端口,最终到达计算机内部的目的地。当串行端口接收到一定数量的字节(可以设置为 1、4、8 或 14)到其 FIFO 缓冲区时,它会向 CPU 发出信号以获取它们,方法是在通常仅由该端口使用的特定导线上发送称为中断的电信号。因此,FIFO 会等待直到它接收到一定数量的字节,然后发出中断。

但是,如果在等待下一个字节到达时出现意外延迟(称为超时),也会发送此中断。因此,如果字节接收速度很慢(例如来自某人在终端键盘上键入内容),则可能会为接收到的每个字节发出中断。对于某些 UART 芯片,规则如下:如果在一段时间内可以接收到连续 4 个字节,但这些 4 个字节都没有出现,则端口将放弃等待更多字节并发出中断以获取当前在 FIFO 中的字节。当然,如果 FIFO 为空,则不会发出中断。

每个中断导体(在计算机内部)都有一个编号(IRQ),并且串行端口必须知道使用哪个导体来发出信号。例如,ttyS0 通常使用称为 IRQ4(或 IRQ 4)的 IRQ 编号 4。它们的列表和更多信息可以在“man setserial”中找到(搜索“配置串行端口”)。每当串行端口需要引起 CPU 的注意时,就会发出中断。及时执行此操作很重要,因为串行端口内部的缓冲区只能容纳 16 个传入字节。如果 CPU 未能及时删除此类接收到的字节,则将没有剩余空间容纳更多传入字节,并且小缓冲区可能会溢出(超限),从而导致数据字节丢失。

对于外部调制解调器,可能没有办法(例如流量控制)足够快速地停止流量以防止此类超限。对于内部调制解调器,16 字节的 FIFO 缓冲区位于同一张卡上,如果缓冲区已满,则大多数调制解调器都不会写入它。因此,它不会超限 16 字节的缓冲区,但可能需要使用 调制解调器到调制解调器的流量控制来防止调制解调器本身超限。这是内部调制解调器优于外部调制解调器的优点之一。

当串行端口刚刚从其小的发送 FIFO 缓冲区中通过外部电缆发送完所有字节时,也会发出中断。然后,它有空间容纳 16 个更多的传出字节。中断是为了通知 CPU 这一事实,以便它可以将更多字节放入小的发送缓冲区中进行传输。此外,当调制解调器控制线状态更改时,也会发出中断。

上面提到的缓冲区都是硬件缓冲区。串行端口在主内存中也有大型缓冲区。这将在稍后解释

中断传递大量信息,但只是间接地传递。中断本身只是告诉一个称为中断控制器的芯片,某个串行端口需要注意。然后,中断控制器向 CPU 发出信号。然后,CPU 运行一个特殊程序来服务串行端口。该程序称为中断服务例程(串行驱动程序软件的一部分)。它尝试找出串行端口发生了什么,然后处理诸如从(或向)串行端口的硬件缓冲区传输字节之类的问题。该程序可以轻松地找出发生了什么,因为串行端口在串行驱动程序软件已知的 IO 地址处具有寄存器。这些寄存器包含有关串行端口的状态信息。该软件读取这些寄存器,并通过检查内容,找出发生了什么并采取适当的措施。

4.6 数据压缩(由调制解调器完成)

在继续串行端口的基础知识之前,需要了解调制解调器所做的事情:数据压缩。在某些情况下,此任务实际上是由在计算机 CPU 上运行的软件完成的,但不幸的是,目前,此类软件仅适用于 MS Windows。这里的讨论将针对调制解调器本身进行压缩的情况,因为这是调制解调器在 Linux 下工作所必须发生的情况。

为了在电话线上更快地发送数据,可以使用自定义编码方案对其进行压缩(编码),该方案本身取决于数据。编码后的数据小于原始数据(字节数更少),并且可以在更短的时间内通过 Internet 发送。此过程称为“数据压缩”。

如果您从 Internet 下载文件,则它们很可能已经被压缩,并且调制解调器无法尝试进一步压缩它们。您的调制解调器可能会感觉到正在通过的数据已经被压缩,并且不再尝试压缩它。如果您正在接收由另一个调制解调器压缩的数据,则您的调制解调器将对其进行解压缩,并创建比通过电话线发送的字节更多的字节。因此,从您的调制解调器到您的计算机的数据流将高于通过电话线到您的数据流。此流量的比率称为压缩比。压缩比可能高达 4,但不太可能。

4.7 错误纠正

与数据压缩类似,可以将调制解调器设置为进行错误纠正。虽然涉及一些开销成本,这会降低字节/秒的流速,但错误纠正会剥离起始位和停止位,实际上会提高数据字节/秒的流速。

对于串行端口与外部世界的接口,每个 8 位字节都会添加 2 个额外的位:起始位和停止位。在没有错误纠正的情况下,这些额外的起始位和停止位通常会直接通过调制解调器并输出到电话线上。但是,当启用错误纠正时,这些额外的位将被剥离,并且 8 位字节被放入数据包中。这更有效率,并且尽管为数据包标头和错误纠正目的添加了更多字节,但仍可实现更高的字节/秒流速。

4.8 数据流(速度)

数据(表示字母、图片等的字节)从您的计算机流向您的调制解调器,然后输出到电话线上(反之亦然)。流速(例如 56k (56000) 位/秒)被(不正确地)称为“速度”。但是几乎每个人都说“速度”而不是“流速”。如果没有数据压缩,则从计算机到调制解调器的流速将与通过电话线的流速大致相同。

实际上,在电话线的末端,您需要考虑两种不同的速度

当您拨出并连接到电话线另一端的另一个调制解调器时,您的调制解调器通常会向您发送一条消息,例如“CONNECT 28800”或“CONNECT 115200”。这些是什么意思?嗯,它是 DCE 速度或 DTE 速度。如果它高于广告宣传的调制解调器速度,则它必须是 DTE 调制解调器到计算机的速度。对于上面显示的 115200 速度就是这种情况。28800 必须是 DCE(调制解调器到调制解调器)速度,因为串行端口没有这样的速度。可以配置调制解调器以报告任一速度。一些调制解调器报告两种速度,并将调制解调器到调制解调器的速度报告为(例如):CARRIER 28800。

如果您有内部调制解调器,您不会期望从调制解调器到计算机的 DTE 速度有任何速度限制,因为您的调制解调器在您的计算机内部,几乎是您计算机的一部分。但是通常存在速度限制,因为调制解调器在其内部包含专用的串行端口。在某些软件调制解调器上,没有这样的速度限制。

重要的是要理解,平均速度通常低于指定速度,尤其是在短的 DTE 计算机到调制解调器线路中。等待(或空闲时间)会导致平均速度降低。这些等待可能包括长达一秒的等待,原因是 流量控制。在另一个极端,可能存在非常短的等待(空闲时间),几微秒分隔一个字节的末尾和下一个字节的开始。此外,如果电话线路状况不佳,调制解调器将回退到较低的速度。

有关最佳 DTE 速度的讨论,请参阅 我应该使用什么速度 部分。

4.9 流量控制

流量控制是指减慢导线中字节流的能力。对于串行端口,这意味着停止然后再重新启动流量而不会丢失任何字节的能力。调制解调器和其他硬件需要流量控制,以允许瞬时流速的跳跃。

流量控制示例

例如,考虑您通过短电缆将 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)。在这种情况下,调制解调器能够压缩 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”。这是流量控制的本质,但还有一些更多细节。

如果您已设置最高的 PC 到调制解调器速度,则在从调制解调器到 PC 的方向上可能不需要流量控制。有关需要它的复杂示例,请参见 Serial-HOWTO 中的“复杂流量控制示例”。为了减慢此传入流量,您的调制解调器必须告诉另一个调制解调器停止发送。请参阅 M-M_flow_c name="调制解调器到调制解调器的流量控制">。

硬件流量控制与软件流量控制

如果可行,最好使用“硬件”流量控制,它使用两条专用“调制解调器控制”导线来发送“停止”和“启动”信号。串行端口的硬件流量控制的工作方式如下:使用两个引脚 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 也是如此。要使软件流量控制适用于二进制数据,需要调制解调器(硬件)和软件支持。

无流量控制的症状

了解流量控制理论可能具有实际用途。例如,我使用调制解调器访问 Internet,并且似乎工作正常。但是几个月后,我尝试从我的 PC 发送长文件,结果导致大量的重试和错误,但最终成功了。在另一个方向(从我的 ISP 到我)接收工作正常。问题出在调制解调器上,流量控制被禁用。在发送长文件时,我的调制解调器的缓冲区溢出(超限),因为从未向我的计算机发送“停止”信号以停止向调制解调器发送数据。在从调制解调器到我的计算机的方向上没有问题,因为串行端口的容量(例如 115.2 kbps)始终高于来自电话线的流量。但是,在另一个方向上,这是一个问题,因为 PC 将以 115.2 kbps 的速度发送数据,而调制解调器无法处理如此高的流量,从而导致调制解调器缓冲区超限。解决方法是通过在调制解调器的初始化字符串中放入启用流量控制命令来启用流量控制。

调制解调器到调制解调器的流量控制

这是在两个调制解调器之间通过电话线发送的数据的流量控制。只要启用错误纠正,它就可以工作。实际上,即使没有错误纠正,也可以在调制解调器之间启用软件流量控制,但这可能会干扰发送二进制数据,因此不常用。

4.10 数据流路径;缓冲区

有人提到,每个流方向都有 3 个缓冲区(总共 3 对):16 字节 FIFO 缓冲区(在 UART 中)、一对更大的缓冲区(在连接到串行端口的设备内部,例如调制解调器)以及一对缓冲区(例如 8k)(在主内存中)。当应用程序向串行端口发送字节时,它们首先会被存储在主内存中的发送串行端口缓冲区中。这对缓冲区的另一个成员是用于相反字节流方向的接收缓冲区。这是一个使用浏览器浏览互联网的示例图。发送数据流从左到右,而接收流从右到左。每个流方向都有一个单独的缓冲区。

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” 语句会阻塞),并且应用程序会暂时停止运行,并等待直到有可用的缓冲区空间。因此,流控制 “stop” 最终能够停止发送字节的程序。即使这个程序停止了,计算机也不一定会停止计算,因为它可能会切换到运行其他进程,同时等待流控制停止。

以上内容在三个方面被稍微过度简化了。首先,一些 UART 可以进行自动硬件流控制,如果需要,可以停止从 FIFO 缓冲区传输数据(Linux 尚不支持)。其次,当应用程序进程等待写入发送缓冲区时,它可能会执行其他任务。第三,串行驱动程序(位于内存缓冲区和 FIFO 之间)有它自己的小缓冲区(在主内存中),用于处理字符。

4.11 调制解调器命令

发送到调制解调器的命令是通过与发送数据相同的导体,从通信软件发送到调制解调器的。这些命令是简短的 ASCII 字符串。例如,“AT&K3” 用于启用计算机和调制解调器之间的硬件流控制 (RTS/CTS);“ATDT5393401” 用于拨打号码 5393401。请注意,所有命令都以 “AT” 开头。一些命令(例如启用流控制)有助于配置调制解调器。其他命令(例如拨打电话号码)实际上会执行某些操作。大约有一百多个不同的可能命令。当您的通信软件开始运行时,它首先向调制解调器发送一个 “init” 命令字符串来配置它。所有命令都在调制解调器拨号(或接听电话)之前在普通数据线上发送。

一旦调制解调器连接到另一个调制解调器(在线模式),从您的计算机发送到您的调制解调器的所有内容都将直接发送到另一个调制解调器,并且不会被调制解调器解释为命令。有一种方法可以 “逃脱” 这种操作模式,并返回到命令模式,在该模式下,发送到调制解调器的所有内容都将被解释为命令。计算机只需发送 “+++”,并在其前后指定时间间隔。如果此时间间隔正确,调制解调器将恢复到命令模式。另一种方法是通过某个调制解调器控制线上的信号来实现。

互联网上有许多调制解调器命令列表。“网站” 部分提供了指向其中几个网站的链接。不同型号和品牌的调制解调器使用的命令集并不完全相同。因此,适用于一个调制解调器的命令可能不适用于另一个调制解调器。本 HOWTO 的 “调制解调器配置” 部分列出了一些常用命令(不保证适用于所有调制解调器)。

4.12 串行驱动程序模块

串行端口的设备驱动程序是操作串行端口的软件。现在它以串行模块的形式提供。从内核 2.2 开始,如果需要,此模块通常会自动加载。在早期的内核中,您必须运行 kerneld 才能按需自动加载模块。否则,串行模块需要显式列在 /etc/modules 中。在模块在 Linux 中流行之前,串行驱动程序通常内置于内核中(有时仍然是)。如果是内置的,请不要让串行模块加载,否则您将同时运行两个串行驱动程序。使用 2 个驱动程序会出现各种错误,包括尝试打开串行端口时可能出现 “I/O 错误”。使用 “lsmod” 查看模块是否已加载。

当串行模块加载时,它会在屏幕上显示有关现有串行端口的消息(通常显示错误的 IRQ)。但是,一旦模块被 setserial 使用来告知设备驱动程序(希望是)正确的 IRQ,您应该会看到第二个显示,类似于第一个,但具有正确的 IRQ 等。请参阅 Serial-HOWTO 中的 “Serial Module”。有关 setserial 的更多信息,请参阅 “什么是 Setserial”。


5. 配置概述

由于每个调制解调器都有一个关联的串行端口,并且该端口既有硬件又有软件,因此配置调制解调器分为三个部分:

以上省略了 “setserial” 除了定位串行端口之外还能做的一些其他事情。但通常您不需要使用它们。Setserial 将来可能用于启用超高速。

通信程序包括 minicomseyonwvdial(用于 PPP)和 mgetty(用于拨入)。这些通信程序需要您对其进行配置,尽管它们附带的默认配置可能只需要稍作调整。

遗憾的是,通信程序无法定位串行端口。这种 “定位” 是串行端口的低级 PnP 配置:在硬件和驱动程序中设置其 IO 地址和 IRQ。如果幸运的话,这将在您启动 Linux 时自动发生。在硬件中设置这些参数以前是通过跳线器,然后运行 “setserial” 来完成的,但现在是通过 “即插即用” 软件完成的。您可能仍然需要 “setserial”。因此,如果 Linux(或 wvdial 程序等)没有报告您的调制解调器在哪个串行端口上,那么您可以尝试按照下一节自行查找,但这可能不容易。


6. 定位串行端口:IO 地址、IRQ

6.1 我的串行端口在哪个总线上?

如果您需要查找串行端口,了解它所在的总线通常很有帮助。如果串行端口位于卡上,您可能知道该卡插入哪个总线,例如 PCI 插槽。但是,如果串行端口内置于主板中,则可能不清楚它在哪个总线上。对于具有 ISA 总线插槽的旧主板,它很可能在 ISA 总线上,甚至可能不是即插即用。但是,即使您的所有插槽都是 PCI,串行端口也可能位于 ISA 总线或 LPC 总线(也称为 “LPC 接口”)上。LPC 在笔记本电脑上很常见。键入 “lspci” 以查看它是否显示 “LPC”。不幸的是,LPC 总线没有用于在其上低级配置设备的标准即插即用方法。但是根据规范,BIOS 应该进行此类配置(使用 ACPI ??)。要查看您是否有 LPC 总线,请键入 “lspci” 并查找 LPC 桥接器或类似物。

6.2 IO 和 IRQ 概述

为了使串行端口正常工作,首先必须为其提供 IO 地址和 IRQ。对于旧硬件(1990 年代中期),卡上的跳线器或保存的 BIOS 设置可以做到这一点。对于较新的硬件,BIOS 或 Linux 必须在启动时设置它们,并且新硬件在断电后不记得它是如何设置的。启用硬件(通过使用软件)会为其提供 IRQ 和 IO 地址。没有 IO 地址,它就无法使用。没有 IRQ,它将需要使用效率低下的轮询方法,为此必须在串行驱动程序中将 IRQ 设置为 0。使用 BIOS 或 Linux 发送到硬件的数字信号,所有这些都应该自动配置(前提是 BIOS 之前没有设置为禁用它)。因此,只有在遇到问题或想了解其工作原理时,才需要阅读此内容。

驱动程序当然必须知道 IO 地址和 IRQ,以便它可以与串行端口芯片通信。现代串行端口驱动程序(内核 2.4)尝试通过 PnP 方法来确定这一点,因此通常不需要告诉驱动程序(通过使用 “setserial”)。驱动程序也可以在硬件中设置 IO 地址或 IRQ。但不幸的是,有些 PCI 串行端口硬件驱动程序无法识别,因此您可能需要自己启用端口。请参阅 “PCI:启用禁用的端口”。

对于旧的 ISA 总线,驱动程序还会探测可能的串行端口地址,以查看那里是否有任何串行端口。这适用于跳线器的情况,有时也适用于 ISA PnP 端口,当驱动程序不执行 ISA PnP 时(在内核 2.4 之前)。

通过为串行端口提供 IRQ 和 IO 地址来定位它是低级配置。它通常由串行驱动程序自动完成,但有时您必须自己完成。以下内容重复了上面所说的内容,但更详细。

低级配置包括分配 IO 地址、IRQ 和名称(例如 ttyS2 = tts/2)。这个 IO-IRQ 对必须在硬件中设置,并告知串行驱动程序。驱动程序需要为这对分配一个名称(例如 ttyS2)。我们可以简称为 “io-irq” 配置。现代方法是让驱动程序使用 PnP 方法来检测/设置 IO/IRQ,然后记住它所做的。驱动程序执行此操作的一种简单方法是让驱动程序请求内核启用设备,然后内核告诉驱动程序它使用了哪些 IO/IRQ。旧方法是使用 “setserial” 程序来告知驱动程序。对于跳线器,没有 PnP,但如果跳线器设置为通常的 I0/IRQ,则驱动程序可能会检测到端口。如果您需要配置但不了解某些细节,很容易陷入困境。

当 Linux 启动时,会努力检测和配置(低级)串行端口。具体发生什么取决于您的 BIOS、硬件、Linux 发行版、内核版本等。如果串行端口工作正常,则可能不需要您进行任何进一步的低级配置。

如果您在串行端口方面遇到问题,那么您可能需要进行低级配置。如果您使用的是内核 2.2 或更低版本,那么在以下情况下您需要这样做:

从内核 2.2 开始,您也许可以通过共享中断来使用 2 个以上的串行端口,而无需进行任何低级配置。所有 PCI 端口都应该支持这一点,但对于 ISA,它仅适用于某些硬件。如果中断可用,为每个端口分配一个唯一的中断可能同样容易。请参阅 “中断共享和内核 2.2+”。

低级配置(设置 IRQ 和 IO 地址)似乎比高级配置给人们带来更多麻烦,尽管对于许多人来说,它是完全自动的,无需进行任何配置。在端口启用并且串行驱动程序知道正确的 IRQ 和 IO 地址之前,端口通常根本无法工作。

端口可能被禁用,可能是由 BIOS 禁用,也可能是 Linux 无法找到并启用端口。对于现代端口(前提是 BIOS 没有禁用它们),手动 PnP 工具(例如 lspci)应该能够找到它们。应用程序和实用程序(例如 “setserial” 和 “scanport”(仅限 Debian ??))仅探测 I0 地址,不使用 PnP 工具,因此无法检测到禁用的端口。

即使串行驱动程序的探测可以找到 ISA 端口,如果 IRQ 错误,它也可能工作得非常慢。请参阅 “极其缓慢:文本在长时间延迟后才缓慢显示在屏幕上”。PCI 端口不太可能出现 IRQ 错误。

IO 地址、IRQ 等被称为 “资源”,因此我们正在配置某些资源。但是还有许多其他类型的 “资源”,因此该术语还有许多其他含义。总而言之,低级配置包括启用设备,为其命名(例如 ttyS2),并将两个值(IRQ 号和 IO 地址)放入两个位置:

  1. 设备驱动程序(由 PnP 或 “setserial” 完成)
  2. 串行端口硬件本身的配置寄存器,由 PnP 软件(或传统硬件上的跳线器)完成。

您可以观看启动(= 启动时)消息。它们通常是正确的。但是,如果您遇到问题,您的串行端口可能根本不会显示,或者如果您看到来自 “setserial” 的消息,它可能不会显示硬件的真实配置(并且不一定应该显示)。请参阅 “I/O 地址和 IRQ:启动时消息”。

6.3 PCI 总线支持

简介

尽管某些 PCI 调制解调器是 “winmodems”,没有 Linux 驱动程序(并且在 Linux 下无法工作),但其他 PCI 调制解调器通常在 Linux 下可以正常工作。如果是软件调制解调器,则需要为其找到驱动程序,因为 “winmodems” 的支持未内置到其串行驱动程序中。请参阅 Linmodem-HOWTO。

如果您使用的是内核 2.4 或更高版本,那么应该支持 PCI 和 ISA 总线的 PnP(内置或通过模块)。某些 PCI 串行端口可以由串行驱动程序自动检测和低级配置。其他端口可能无法自动检测和配置。

虽然内核 2.2 通常支持 PCI,但它不支持 PCI 串行端口(尽管有些人无论如何都使其工作)。从内核 2.4 开始,串行驱动程序将读取数字存储在串行硬件中的 ID 号,以确定如何支持它(如果它知道如何支持)。它应该为其分配一个 I/O 地址,确定其 IRQ 等。因此,您不需要为此使用 “setserial”。

如果您不使用设备文件系统,则可能会出现问题。驱动程序可能会根据启动时消息将端口分配给 tt/ttyS4(使用 dmesg 查看)。但是,如果您没有 “文件” /dev/ttyS4,则该端口将无法工作。因此,您将需要创建它,使用:
cd /dev; ./MAKEDEV ttyS4
对于设备文件系统,驱动程序应创建设备 tts/1

有关 PCI 的更多信息

PCI 端口没有很好的标准化。有些使用主内存与 PC 通信。有些需要特殊启用 IRQ。 “lspci -vv” 的输出可以帮助确定是否可以支持某个端口。如果您看到一个 4 位 IO 端口,则只需告诉 “setserial” IO 端口和 IRQ,该端口即可工作。有些人已经通过这种方式使 3COM 3CP5610 PCI 调制解调器工作。例如,如果 lspci 显示 IRQ 10,I/O 地址为 0xecb8,并且您决定将其命名为 ttyS2,则命令为:

setserial /dev/ttyS2 irq 10 port 0xecb8 autoconfig

请注意,启动时消息 “Probing PCI hardware” 表示读取 PCI 设备中的 PnP 配置寄存器,这会检测有关所有 PCI 卡和板载 PCI 设备的信息。这与串行驱动程序探测 IO 地址不同,后者表示读取某些 IO 地址以查看读取的内容是否看起来像该地址处有一个串行端口。

6.4 关于低级配置的常见错误

以下是人们常犯的一些错误:

6.5 IRQ 和 IO 地址必须正确

对于 “我的 IO 和 IRQ 是什么?” 这个问题,实际上有两个答案:1. 设备驱动程序认为已设置的内容(这是 setserial 通常设置和显示的内容)。2. 硬件中实际设置的内容。以上 1 和 2 应该相同。如果它们不相同,那就会带来麻烦,因为驱动程序具有关于物理串行端口的不正确信息。在某些情况下,硬件被禁用,因此它没有 IO 地址或 IRQ。

如果驱动程序的 IO 地址错误,它将尝试将数据发送到不存在的串行端口——或者更糟糕的是,发送到其他设备。如果它的 IRQ 错误,驱动程序将不会从串行端口获得中断服务请求,从而导致响应非常缓慢或没有响应。请参阅 “极其缓慢:文本在长时间延迟后才缓慢显示在屏幕上”。如果它的 UART 型号错误,也容易出现问题。要确定 I0-IRQ 对是否相同,您必须找出它们在驱动程序和硬件中是如何设置的。

6.6 驱动程序认为的 IO 地址和 IRQ 是什么?

简介

驱动程序认为的内容不一定是硬件的实际设置方式。如果一切正常,那么驱动程序认为的内容很可能是正确的(在硬件中设置的),您无需调查(除非您好奇或想成为专家)。确定驱动程序认为的内容的方法包括:启动时消息 “I/O 地址和 IRQ:启动时消息”,/proc 目录 “文件” “/proc 目录和 setserial”,以及 “setserial” 命令。

I/O 地址和 IRQ:启动时消息

在许多情况下,您的端口将在启动时自动进行低级配置(但并非总是正确)。要查看正在发生的事情,请查看屏幕上的启动消息。不要忽略检查 Linux 加载之前来自 BIOS 的消息(此处未显示示例)。这些 BIOS 消息可以通过按 Pause 键(同时按住 shift 键)来冻结。冻结它们通常很棘手,您可能需要在 Linux 启动时按 Ctrl-Alt-Del 以开始重新启动并重试。这些消息显示的内容可能会随着启动的进行而变化,并且在正确的单词处冻结它通常很棘手。

使用 Shift-PageUp 向后滚动到消息,以便在它们闪过后查看。Shift-PageDown 将在相反方向滚动。 dmesg 命令(或查看 /var/log 中的日志)将仅显示这两条消息中的第一条。这是一个启动消息的示例(截至 2004 年,与 1999 年几乎相同)。请注意,在旧版本中,ttyS1 在这些消息中显示为 ttyS01 等。

首先,您会看到检测到的内容(但 irq 只是一个大胆的猜测)

Serial driver version 4.27 with no serial options enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
ttyS2 at 0x03e8 (irq = 4) is a 16550A
ttyS4 at port 0xeff0 (irq = 10) is a 16550A

请注意,ttyS0-ttyS2 是通过探测标准地址检测到的,而 ttyS4 是通过探测 PCI 配置检测到的 PCI 端口。稍后,setserial 会显示保存在配置文件(您可以编辑)中的内容,但这也不一定是正确的。

Loading the saved-state of the serial devices...
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A
/dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A

请注意,配置文件中仅包含 ttyS1-2,因此 ttyS0 和 ttyS4 不受其影响。还存在一些细微的差异:第一条消息显示 ttyS2 的 irq=4,而第二条消息显示其 irq=5。在大多数情况下,第二条消息是正确的。但是,如果您遇到问题,它可能会产生误导。在阅读本节其余部分中对此复杂性的所有解释之前,您不妨先尝试使用您的串行端口,看看它是否工作正常。如果是这样,可能没有必要进一步阅读。

第二条消息来自在启动时从 /etc 目录树中的脚本运行的 setserial 程序。它显示了设备驱动程序认为的正确配置。但这也可能是错误的。例如,irq 实际上可能在硬件中设置为 irq=8(两条消息都错误)。irq=5 可能是因为配置文件不正确。

对于旧的跳线器设置的串行端口,Linux 有时会错误地获取 IRQ,因为它默认情况下不探测 IRQ。它只是假定 “标准” IRQ(第一条消息)或接受配置文件中的内容(第二条消息)。这两者都不一定是正确的。如果串行驱动程序的 IRQ 错误,则串行端口会非常慢,或者似乎根本无法工作。

第一条消息是 Linux 探测 ISA 串行端口地址的结果,但它不探测 IRQ。如果此处显示端口,则该端口存在,但 IRQ 可能错误。Linux 不检查 IRQ,因为这样做并非万无一失。它只是假定 IRQ 与显示的一样,因为它们是 “标准” 值。您可以使用 setserialautoconfigauto_irq 选项手动检查它们,但这也不能保证是正确的。

BIOS 消息(您在 Linux 启动之前首先看到的消息)显示的数据是最初在硬件中设置的内容。如果您的串行端口是即插即用 (PnP) 端口,则 “isapnp” 或 “setpci” 可能会运行并更改这些设置。在 Linux 启动后查找有关此内容的消息。上面示例中显示的最后一条串行端口消息应与 BIOS 消息一致(可能由 isapnp 或 setpci 修改)。如果它们不一致,那么您需要更改端口硬件中的设置,或使用 setserial 告诉驱动程序硬件中实际设置的内容。

另外,如果您有即插即用 (PnP) 串行端口,则只能通过 PnP 软件找到它们,除非 IRQ 和 IO 已通过即插即用软件在硬件内部设置。在内核 2.4 之前,这是启动消息未显示物理存在的串行端口的常见原因。PnP BIOS 可能会自动对其进行低级配置。PnP 配置将在后面解释。

/proc 目录和 setserial

键入 “setserial -g /dev/ttyS*”。还有其他一些方法可以通过查看 /proc 目录中的 “文件” 来查找此信息。请注意,不能保证硬件中设置的是相同的内容。

/proc/ioports 将显示驱动程序正在使用的 IO 地址。/proc/interrupts 显示当前正在运行的进程(已打开设备)的驱动程序使用的 IRQ。它显示了实际发出了多少次中断。/proc/tty/driver/serial 显示了上述大部分内容,以及已接收和发送的字节数(即使设备现在未打开)。

请注意,对于 IO 地址和 IRQ 分配,您仅看到驱动程序认为的内容,而不一定是硬件中实际设置的内容。但是,关于实际发出的中断数和处理的字节数的数据是真实的。如果您看到大量的中断和/或字节,那么这可能意味着设备正在(或曾经)工作。但中断可能来自另一个设备。如果没有接收到字节 (rx:0),但发送了字节(例如 tx:3749),则只有一个流方向正在工作(或正在使用)。

有时,仅显示少量中断并不意味着中断实际上是由任何串行端口物理生成的。因此,如果您看到您尝试使用的端口几乎没有中断,则该中断可能未在硬件中设置。要查看 /proc/interrupts 以检查您当前正在运行的程序(例如 “minicom”),您需要在查看时保持程序运行。

6.7 我的串行端口硬件的 IO 地址和 IRQ 是什么?

简介

如果是 PCI 或 ISA PnP,那么硬件中设置的内容是通过 PnP 方法完成的。即使没有设置任何内容或端口被禁用,仍然可以使用 “lspci -v” 或 “isapnp --dumpregs” 找到 PnP 端口。通过跳线器禁用的端口(或硬件故障)将完全丢失。请参阅 “ISA PnP 端口”、“PCI:已设置哪些 IO 和 IRQ?”、“PCI:启用禁用的端口”。

PnP 端口在断电时不会将其配置存储在硬件中。这与跳线器(非 PnP)形成对比,后者在断电后保持不变。这就是为什么 PnP 端口比旧的非 PnP 端口更可能处于禁用状态。

PCI:已设置哪些 IO 和 IRQ?

对于 PCI,BIOS 几乎总是设置 IRQ,也可能设置 IO 地址。要查看它是如何设置的,请使用 “lspci -vv”(最佳)或查看 /proc/bus/pci(对于内核 <2.2,则查看 /proc/pci)。调制解调器的串行端口通常称为 “通信控制器”。查找此项。如果 lspci 显示 “I/O ports at ... [disabled]”,则串行端口被禁用,并且硬件没有 IO 地址,因此它丢失且无法使用。请参阅 “PCI:启用禁用的端口”,了解如何启用它。

如果显示多个 IO 地址,则第一个更可能是它。您无法更改 IRQ(至少不能使用 “setpci”)。这是因为如果写入 IRQ,则其硬件寄存器上不会采取任何操作。应该是 BIOS 实际设置 IRQ,然后将正确的值写入此寄存器供 lspci 查看。如果必须更改,请使用 “setpci” 通过更改 BASE_ADDRESS_0 或类似项来更改 IO 地址。

PCI:启用禁用的端口

如果端口通过 IO 地址进行通信,则 “lspci -vv” 应显示 “Control: I/O+ ...”,其中 + 表示 IO 地址已启用。如果它显示 “I/O-”(和 “I/O ports at ... [disabled]”),那么您可能需要使用 setpci 命令来启用它。例如 “setpci -d 151f:000 command=101”。151f 是供应商 ID,000 是设备 ID,这两者都从 “lspci -n -v” 或 /proc/bus/pci 或 “scanpci -v” 中获得。“command=101” 表示 101 被放入命令寄存器,该寄存器与 “lspci” 显示的 “Control” 寄存器相同。101h 设置了两位:1 将 I/O 设置为 +,100 部分使 SERR# 保持设置为 +。在这种情况下,当运行 lspci 命令时,最初仅观察到 Control 寄存器的 SERR# 位为 +。因此,我们通过将位 8(其中位 0 是 I/O)设置为 101 中的第一个 1 来保持启用状态为 +。某些串行卡不使用 SERR#,因此如果您看到 SERR#-,则无需启用它,因此请使用:command=1。然后,您需要设置 “setserial” 以告诉驱动程序 IO 和 IRQ。

位 8 实际上是第 9 位,因为我们从位 0 开始计数位。不要惊慌,lspci 显示了很多 - 符号,表明该卡没有很多可用(或启用)的功能。串行端口相对较慢,不需要这些功能。

另一种启用它的方法是让 BIOS 执行此操作,方法是告诉 BIOS 您没有即插即用操作系统。然后 BIOS 应该在您启动 PC 时启用它。如果您的同一台 PC 上安装了 MS Windows9x,那么这样做可能会导致 Windows 出现问题(请参阅 Plug-and-Play-HOWTO)。

ISA PnP 端口

对于 ISA 即插即用 (PnP) 端口,可以尝试 pnpdump 程序(isapnptools 的一部分)。如果您使用 --dumpregs 选项,那么它应该告诉您端口中设置的实际 IO 地址和 IRQ。它还应该找到禁用的 ISA PnP 端口。它 “尝试” 的地址不是设备的 IO 地址,而是用于与 PnP 卡通信的特殊地址。

查找未禁用的端口(ISA、PCI、PnP、非 PnP)

也许 BIOS 消息会在 Linux 开始启动之前告诉您一些信息。使用 shift-PageUp 键向后逐步浏览启动时消息,并查看最先出现的来自 BIOS 的消息。这是 Linux 启动之前的状态。Setserial 无法更改它,但 isapnp 或 setpci 可以。从内核 2.4 开始,串行驱动程序可以对许多(但不是全部)串行端口进行此类更改。

使用 "scanport" (仅限 Debian ??) 将探测所有 I/O 端口,并指示它认为可能是串口的端口。在此之后,您可以尝试使用 "autoconfig" 选项通过 setserial 进行探测。您需要猜测要探测的地址(使用来自 "scanport" 的线索)。请参阅 什么是 Setserial

对于通过跳线设置的端口,IO 端口和 IRQ 根据跳线进行设置。如果端口不是即插即用 (PnP),而是通过使用 DOS 程序设置的,那么它将被设置为运行该程序的人员设置的值。

通过 MS Windows 探索(最后的手段)

对于 PnP 端口,检查其在 DOS/Windows 下的配置可能(也可能不)暗示其在 Linux 下的配置方式。MS Windows 将其配置信息存储在其注册表中,而 Linux 不使用该注册表,因此它们的配置不一定相同。如果您让 PnP BIOS 在您启动 Linux 时自动进行配置(并在启动 Linux 时告知 BIOS 您没有 PnP 操作系统),那么 Linux 应该使用 BIOS 非易失性存储器中的配置。Windows 也使用相同的非易失性存储器,但不一定以相同的方式配置它。

6.8 选择串口 IRQ

如果您有即插即用端口,那么 PnP BIOS 或串口驱动程序可能会为您配置所有设备,这样您可能就不需要选择任何 IRQ。PnP 软件会确定它认为最佳的配置并分配它们(但它并不总是最佳的)。但是,如果您直接使用 isapnp(ISA 总线)或跳线,则您必须选择。如果您已经知道要使用的 IRQ,您可以跳过本节,但您可能想知道 IRQ 0 有特殊用途(请参阅以下段落)。

IRQ 0 不是 IRQ

虽然 IRQ 0 实际上是定时器(在硬件中),但它对于使用 setserial 设置串口具有特殊含义。它告诉驱动程序端口没有中断,然后驱动程序将使用轮询方法。这种轮询会增加 CPU 的负载,但如果存在中断冲突或中断设置错误,则可以尝试使用。分配 IRQ 0 的优点是您不需要知道硬件中设置了什么中断。它应仅用作临时权宜之计,直到您能够找到要使用的真实中断为止。

中断共享,内核 2.2+

IRQ 共享是指两个设备使用相同的 IRQ。一般来说,ISA 总线不允许这样做。PCI 总线可以共享 IRQ,但 ISA 和 PCI 总线之间不能共享相同的 IRQ。大多数多端口板卡可以共享 IRQ。共享效率不高,因为每次给出共享中断时都必须进行检查以确定它来自哪里。因此,如果可行,最好为每个设备分配其自己的中断。

在内核 2.2 之前,串口 IRQ 彼此之间不能共享,除了大多数多端口板卡。从内核 2.2 开始,串口 IRQ 有时可以在串口之间共享。为了使共享在 2.2 中工作,内核必须使用 CONFIG_SERIAL_SHARE_IRQ 编译,并且串口硬件必须支持共享(这样,如果两张串口卡在同一中断线上施加不同的电压,则只有表示“这是一个中断”的电压才会占优势)。由于 PCI 总线规范允许共享,任何 PCI 卡都应允许共享。

选择哪些 IRQ?

串口硬件通常只有有限数量的 IRQ。而且您不希望出现 IRQ 冲突。因此可能没有太多选择。您的 PC 通常可能配备 IRQ 4 上的 ttyS0ttyS2,以及 IRQ 3 上的 ttyS1ttyS3。查看 /proc/interrupts 将显示当前正在运行的程序正在使用的 IRQ。您可能不想使用其中之一。在 IRQ 5 用于声卡之前,它通常用于串口。

以下是 Greg(Serial-HOWTO 的原始作者)如何在 /etc/rc.d/rc.serial 中设置他的。rc.serial 是一个文件(shell 脚本),它在启动时运行(它可能具有不同的名称或位置)。对于 2.15 之后的 "setserial" 版本,不再总是以这种方式完成,但此示例确实显示了 IRQ 的选择。

/sbin/setserial /dev/ttyS0 irq 3        # my serial mouse
/sbin/setserial /dev/ttyS1 irq 4        # my Wyse dumb terminal
/sbin/setserial /dev/ttyS2 irq 5        # my Zoom modem
/sbin/setserial /dev/ttyS3 irq 9        # my USR modem

标准 IRQ 分配

        IRQ  0    Timer channel 0 (May mean "no interrupt".  See below.)
        IRQ  1    Keyboard
        IRQ  2    Cascade for controller 2
        IRQ  3    Serial port 2
        IRQ  4    Serial port 1
        IRQ  5    Parallel port 2, Sound card
        IRQ  6    Floppy diskette
        IRQ  7    Parallel port 1
        IRQ  8    Real-time clock
        IRQ  9    Redirected to IRQ2
        IRQ 10    not assigned
        IRQ 11    not assigned
        IRQ 12    not assigned
        IRQ 13    Math co-processor
        IRQ 14    Hard disk controller 1
        IRQ 15    Hard disk controller 2

在选择中断时,实际上没有正确的方法。尝试找到一个未被主板或任何其他板卡使用的中断。2、3、4、5、7、10、11、12 或 15 是可能的选择。请注意,IRQ 2 与 IRQ 9 相同。您可以称其为 2 或 9,串口驱动程序非常理解。如果您有非常旧的串口板卡,它可能无法使用 IRQ 8 及以上。

确保您不使用 IRQ 1、6、8、13 或 14!这些供您的主板使用。您占用她的 IRQ 会让她非常不高兴。完成后,您可能需要双重检查 /proc/interrupts,当使用中断的程序正在运行时,并确保没有冲突。

6.9 选择地址 -- 显卡与 ttyS3 冲突

以下是一些旧串口卡的问题。IBM 8514 显卡(以及类似的显卡)的 IO 地址据称是 0x?2e8,其中 ? 是 2、4、8 或 9。这可能会与 ttyS3 在 0x02e8 的 IO 地址冲突。您可能会认为这不应该发生,因为这些地址在高位数字(02e8 中的前导 0)中是不同的。您是对的,但是设计不良的串口可能会忽略高位数字并响应任何以 2e8 结尾的地址。如果您尝试在此 IO 地址使用 ttyS3 (ISA 总线),那将是坏消息。

对于 ISA 总线,您应该尝试使用下面显示的默认地址。PCI 卡使用不同的地址,以免与 ISA 地址冲突。下面显示的地址表示 8 字节范围的第一个地址。例如,3f8 实际上是范围 3f8-3ff。每个串口设备(以及其他类型的使用 IO 地址的设备)都需要其自己唯一的地址范围。不应有重叠(冲突)。以下是 ISA 总线上常用串口的默认地址

ttyS0 address 0x3f8
ttyS1 address 0x2f8
ttyS2 address 0x3e8
ttyS3 address 0x2e8

假设在真实串口和另一个物理上不存在的端口(并显示 UART:未知)之间存在地址冲突(由 setserial -g /dev/ttyS* 报告)。这种冲突不应引起问题,但有时会在较旧的内核中引起问题。为了避免此问题,请不要允许此类地址冲突,如果 /dev/ttySx 物理上不存在,则删除它。

6.10 在硬件中设置 IO 地址和 IRQ(主要用于 PnP)

在硬件中设置好之后,不要忘记确保通过使用 setserial 在驱动程序中也进行了设置。对于非 PnP 串口,它们要么通过跳线在硬件中设置,要么通过运行 DOS 程序(“无跳线”)来设置它们(它可能会禁用 PnP)。本小节的其余部分仅适用于 PnP 串口。以下是配置 PnP 串口的可能方法列表

每次系统通电时,IO 地址和 IRQ 都必须在它们的寄存器中设置(通过 PnP),因为 PnP 硬件不记得断电时的设置方式。一种简单的方法是让 PnP BIOS 知道您没有 PnP OS,BIOS 将在您每次启动时自动执行此操作。如果您启动 Windows 时 BIOS 认为 Windows 不是 PnP OS,这可能会在 Windows(它是 PnP OS)中引起问题。请参阅 Plug-and-Play-HOWTO。

即插即用 (PnP) 旨在自动化此 io-irq 配置,但对于 Linux,它最初使生活变得更加复杂。在现代 Linux(2.4 内核 -- 部分在 2.2 内核中)中,每个设备驱动程序都必须执行自己的 PnP(使用它可能使用的提供的软件)。不幸的是,像 MS Windows 中那样,没有用于分配 IO 地址和 IRQ 的集中式规划。但是,无论如何,它通常在 Linux 中可以正常工作。

使用 PnP BIOS 进行 I0-IRQ 配置

虽然如何使用 setpci 或 isapnp 进行 io-irq 配置的说明应该随附此类软件,但如果您想让 PnP BIOS 进行此类配置,则情况并非如此。并非所有 PnP BIOS 都可以做到这一点。BIOS 通常有一个 CMOS 菜单,用于设置前两个串口。此菜单可能很难找到。对于“Award”BIOS,它在“芯片组功能设置”下找到。通常可供选择的很少。对于 ISA 串口,前两个端口通常设置为标准 IO 地址和 IRQ。请参阅 关于串口名称的更多信息

无论您是否喜欢,当您启动 PC 时,PnP BIOS 都会开始对硬件设备进行 PnP (io-irq) 配置。它可能会部分完成工作,并将其余工作交给 PnP OS(Linux 在某种意义上是 PnP OS),或者如果它认为您没有 PnP OS,它可能会完全配置所有 PnP 设备,但不配置设备驱动程序。

如果您告诉 BIOS 您没有 PnP OS,那么 PnP BIOS 应该配置所有 PnP 串口 -- 而不仅仅是前两个。控制 BIOS 执行操作的一种间接方法(如果您在同一 PC 上安装了 Windows 9x)是在 Windows 下“强制”配置。请参阅 Plug-and-Play-HOWTO 并搜索“forced”。使用 CMOS BIOS 菜单更容易,它可能会覆盖您在 Windows 下“强制”的内容。可能有一个 BIOS 选项可以设置或禁用此“覆盖”功能。

如果您添加新的 PnP 设备,BIOS 应该对其进行 PnP 配置。如果需要避免任何冲突,它甚至可以更改现有设备的 io-irq。为此,它保留了非 PnP 设备列表,前提是您已告知 BIOS 这些非 PnP 设备是如何进行 io-irq 配置的。告诉 BIOS 这一点的一种方法是在 DOS/Windows 下运行名为 ICU 的程序。

但是,您如何找出 BIOS 已完成的操作,以便您使用此信息设置设备驱动程序?BIOS 本身可能会提供一些信息,无论是在其设置菜单中还是在您打开计算机时在屏幕上的消息中。请参阅 我的串口硬件中设置了什么?。其他查找方法是为 PCI 总线使用 lspci,或为 ISA 总线使用 isapnp --dumpregs。它显示的神秘结果对于新手来说可能不清楚。

6.11 将 IRQ 和 IO 地址提供给 Setserial

一旦您在硬件中设置了 IRQ 和 IO 地址(或安排通过 PnP 完成),您还需要确保每次启动 Linux 时都运行 "setserial" 命令。请参阅小节 启动时配置


7. 配置串口驱动程序(高级)"stty"

7.1 简介

此配置通常由您的通信程序(如 wvdial)完成。它可能会在您甚至不知道它做了什么的情况下完成大部分工作。在过去,它是使用 "stty" 实用程序完成的。如果您使用 stty 手动设置了一些内容,则通信程序可能会将设置更改为其他内容,因此通常最好只让通信程序处理它。请参阅 什么是 stty?

7.2 硬件流控制 (RTS/CTS)

有关其说明,请参阅 流控制。如果可能,您应该始终使用硬件流控制。您的通信程序或 "getty" 应该有一个用于设置它的选项(并希望默认情况下启用它)。它需要在您的调制解调器内部(通过初始化字符串或默认值)和设备驱动程序中都进行设置。您的通信程序应设置这两者(如果您正确配置它)。

如果以上方法都无法完全启用硬件流控制。那么您必须自己完成。对于调制解调器,请确保它要么通过初始化字符串完成,要么默认情况下开启。如果您需要告诉设备驱动程序执行此操作,最好在启动时将其放入启动时运行的文件中。请参阅小节 启动时配置 您需要为要启用硬件流控制的每个串口(示例为 ttyS2)向此类文件添加以下内容

stty -F /dev/ttyS2 crtscts
or
stty crtscts < /dev/ttyS2

如果您想查看是否启用了流控制,请执行以下操作:在 minicom(或类似程序)中,键入 AT&V(或 3Com 调制解调器上的 ATI4)以查看调制解调器的配置方式,并查找 &K3(或 3Com 调制解调器上的 &H1),这意味着硬件流控制。然后在不退出通信程序(如 minicom)的情况下,通过键入:stty -F /dev/ttyS2 -a 来查看设备驱动程序是否知道它。查找 "crtscts"(没有禁用减号)。请记住,通信程序会更改这些设置,因此您可能需要在启动通信程序后检查它们。

7.3 速度设置

除了流控制之外,还有速度。请参阅 我的调制解调器应该使用什么速度。还有奇偶校验和每字节位数设置。通常,端口由通信程序设置为 8N1(每字节 8 位,无奇偶校验,1 个停止位)。如果您运行 PPP,则必须使用 8N1。因此,如果您收到有关它不是 8 位干净的投诉,那么它很可能不是应该的 8N1。

7.4 忽略 CD 设置:clocal

通常,在可以打开串口之前,需要 CD(载波检测)信号(用于外部调制解调器的 CD 线)。但是,如果 stty 否定了 clocal (-clocal),则端口需要提高 CD 才能打开并保持打开状态。实际上,熟练的程序员可以编写程序,以强制端口打开,即使 CD 和 clocal 说不打开。因此,如果 stty 显示 -clocal,则打开端口可能会出现问题。但是对于拨入,在某些情况下,您可能需要 -clocal,以便当远程调制解调器停止发送载波并且 CD 下降时,端口将关闭并终止在其上运行的所有进程。

保持 CD 升高的一个方法是向调制解调器发送 "AT&C",以便来自调制解调器的 CD 将始终处于开启状态。CD 始终开启对于拨出来说很好,但对于拨入来说,CD 信号有时(但很少)用于检测传入呼叫。

clocal 可能在最近的串口驱动程序中默认断言。Minicom 在启动时会自动提高 clocal,因此打开端口没有问题。但是,当您退出 minicom 时,它会将 clocal 设置恢复为原始设置。但是,当我设置 -clocal 并尝试“set line ...”时,Kermit 6.0.192 版本挂起了。

7.5 什么是 stty?

stty 类似于 setserial,但它设置串口的速度(波特率)、硬件流控制和其他参数。键入 "stty -F /dev/ttyS2 -a" 应该会显示 ttyS2 的配置方式。大多数 stty 设置都是用于您永远不需要与调制解调器一起使用的东西。许多设置仅适用于文本终端(有些仅适用于 1970 年代的古董终端)。您的通信包应自动设置调制解调器所需的几个设置。因此,您通常不需要使用 stty,因此在本 Modem-HOWTO 中没有过多介绍它。但是 stty 有时对于故障排除很有用。有关 stty 的更多信息,请参见 Serial-HOWTO 或 Text-Terminal-HOWTO。


8. 调制解调器配置(不包括串口)

8.1 查找您的调制解调器

在花费大量时间决定如何配置调制解调器之前,您首先需要确保可以找到它,并且可以将 AT 命令等发送给它。因此,我建议您首先使用将在端口上使用的通信程序对其进行非常简单的配置,看看它是否有效。如果这有效,那么您可能希望改进配置。如果无效,请参阅 我的调制解调器物理上存在但找不到。Winmodem 可能很难找到,并且无法在 Linux 下工作。

8.2 AT 命令

虽然调制解调器所在的串口需要配置,但调制解调器本身也需要配置。调制解调器通过在用于发送数据的同一串行线上向其发送 AT 命令(或类似命令)来配置。

大多数调制解调器都使用 AT 命令集。这些是加密且简短的 ASCII 命令,其中所有命令字符串都必须以字母 AT 开头。AT 的意思是:注意,期望后面跟一个命令。例如:ATZ&K3<return> 这是一个 AT 命令字符串,其中包含两个命令:Z 和 &K3。Z 是 Z0 的缩写,一些调制解调器要求您使用 Z0 而不仅仅是 Z。对于以 0 结尾的其他命令也是如此。命令字符串以回车符结尾(如果您是手动键入,请使用 <enter> 键)。太长的字符串(40 个或更多字符)可能无法在较旧的调制解调器上工作。您可以使用大写或小写字母。

不幸的是,AT 命令集有很多不同的变体,因此适用于一个调制解调器的命令可能不适用于另一个调制解调器。因此,不能保证本节中给出的 AT 命令在您的调制解调器上有效。

此类命令字符串要么由通信程序自动发送到调制解调器,要么由您手动键入。大多数通信程序都提供一个屏幕,您可以在其中更改(编辑)并保存通信程序将使用的初始化字符串。调制解调器本身具有存储的配置(配置文件),它类似于长初始化字符串。它表示调制解调器首次开启时的配置。您可以更改它以适合您的口味。在大多数情况下,有几种不同的此类配置(配置文件),并且有方法指定其中一个处于活动状态。

如果您有调制解调器的手册(纸质版或软盘版),您可能会在那里找到 AT 命令。3Com 调制解调器(以及其他调制解调器 ??)在调制解调器中内置了 AT 命令帮助文件,因此如果您向调制解调器键入例如 "AT$",它将显示一些“在线帮助”。

您还可以在 Internet 上找到有关 AT 命令的信息。您应该首先尝试您的调制解调器制造商的网站。如果这不起作用,那么您可以使用来自 AT 命令的术语(如 &C1、&D3 等)搜索 Internet。这将倾向于找到实际列出 AT 命令的站点,而不是仅泛泛而谈的站点。您也可以尝试 网站 小节中列出的几个站点。请注意,不同品牌的调制解调器的 AT 命令可能会略有不同。

8.3 初始化字符串:保存和调用

本小节中给出的示例来自 Hayes AT 调制解调器命令集。所有命令字符串都必须以两个字母 AT 开头。例如:AT&C1&D3^M (^M 是回车符)。当调制解调器通电时,它会自动使用存储在其非易失性存储器中的配置之一来配置自身。如果此配置令人满意,则无需进一步操作。

如果不令人满意,那么可以更改存储的配置,也可以在每次使用调制解调器时通过向其发送一串称为“初始化字符串”(= initialization string)的命令来配置调制解调器。通常,通信程序会执行此操作。它发送的内容将取决于您如何配置通信程序。您的通信程序应该允许您编辑初始化字符串并将其更改为您想要的任何内容。有时,通信程序会让您选择调制解调器的型号,然后它将使用它认为最适合该调制解调器的初始化字符串。

调制解调器首次通电时的配置可以用初始化字符串表示。您可以将此视为默认“字符串”(称为配置文件)。如果您的通信程序向调制解调器发送另一个字符串(初始化字符串),则此字符串将修改默认配置。例如,如果初始化字符串仅包含两个命令,则只会更改这两个项目。但是,某些命令会从调制解调器内部调用存储的配置文件,因此初始化字符串中的单个此类命令可以更改配置中的所有内容。

现代调制解调器有几个不同的存储配置文件可供选择,这些配置文件存储在调制解调器的非易失性存储器中(在您关闭电源后仍然存在)。在我的调制解调器中,有两个工厂配置文件(0 和 1,您都无法更改)和两个用户定义的配置文件(0 和 1),用户可以设置和存储。您的调制解调器可能有更多。要查看其中一些配置文件,请发送命令 &V。在启动时,加载用户定义的配置文件之一。例如,如果您键入命令 &Y0(对于 3Com 调制解调器,只需 Y0),那么将来将在开机时使用配置文件 0。

还有一些命令可以加载(激活)任何存储的配置文件。此类加载命令可以放入初始化字符串中。当然,如果它加载与开机时自动加载的配置文件相同的配置文件,则不会发生任何更改(除非自开机以来已修改了活动配置文件)。由于您的配置文件可能因此被修改,因此即使它除了加载存储的配置文件之外什么都不做,也最好使用某种初始化字符串。

加载已保存配置文件的示例
Z0 加载用户定义的配置文件 0 并重置(挂断等)
&F1 加载工厂配置文件 1

一旦您向调制解调器发送命令以按您想要的方式配置它(例如加载工厂配置文件并对其进行少量修改),您可以将其保存为用户定义的配置文件
&W0 将当前配置保存到用户配置文件 0。

许多人懒得在他们的调制解调器中保存良好的配置,而是每次使用调制解调器时都向调制解调器发送更长的初始化字符串。另一种方法是在初始化字符串的开头通过 &F1 恢复出厂默认设置,然后通过在初始化字符串的末尾添加一些其他命令来稍微修改它。由于无法修改出厂默认设置,这可以防止任何人通过修改(和保存)用户定义的配置文件来更改配置。

您可以选择其他人提供的初始化字符串,他们认为该字符串适合您的调制解调器。一些通信程序有一个初始化字符串库可供选择。最困难的方法(也是最能教会您有关调制解调器的知识的方法)是研究调制解调器手册并自己编写一个。您可以将此配置保存在调制解调器内部,这样您就不需要初始化字符串。第三种选择是从其他人编写的初始化字符串开始,但对其进行修改以适合您的用途。

如果您查看通信程序使用的初始化字符串,您可能会看到不是有效调制解调器命令的符号。这些符号是通信程序本身的命令,不会发送到调制解调器。例如,~ 可能表示短暂暂停。

我的“初始化字符串”在哪里,以便我可以修改它?

这取决于您的通信程序(通常是 PPP 程序)。如果这是最新版本的 Modem-HOWTO,请向我发送其他案例的信息。

8.4 其他 AT 调制解调器命令

对于拨入,请参阅 拨入调制解调器配置。本节的其余部分主要是在旧的 Serial-HOWTO 中的内容。所有字符串都必须以 AT 开头。以下是一些应在字符串中的 Hayes AT 代码(如果它们未通过使用出厂默认设置或保存的配置来设置)。

以下是一些用于特殊用途的更多 AT 命令

注意:为了使他的旧 USR Courier V.34 调制解调器在 DTR 下降时正确重置,Greg Hankins 必须设置 &D2S13=1(这设置了寄存器 S13 的位 0)。这已被证实也适用于 USR Sportster V.34 调制解调器。

注意:一些旧的 Supra 调制解调器对 CD 的处理方式与其他调制解调器不同。如果您正在使用 Supra,请尝试设置 &C0不是 &C1。您还必须设置 &D2 以正确处理 DTR。

8.5 黑名单

如果电话号码拨打了几次没有成功,一些调制解调器可能会将电话号码列入黑名单。在一段时间后,您可以再次尝试。一些国家/地区要求这样做以减少不必要的重复拨号。要查看黑名单,请尝试 %B。要删除黑名单,请使用以下 AT 命令

8.6 我的调制解调器现在设置了哪些 AT 命令?

您可以尝试使用 minicom 查看您的调制解调器配置文件。最好在执行此操作时不要在调制解调器端口上运行任何其他进程。如果您已为您的调制解调器设置了 minicom,那么您可以在命令行上键入:minicom -o 以启动 minicom 而不恢复已保存的调制解调器配置文件。然后键入 at&v(或 3Com 调制解调器上的 atI4)以显示配置文件。要退出 minicom 而不干扰此配置文件,请使用 q(退出)命令退出而不重置。

上述方法可能由于各种原因而不起作用。如果调制解调器已设置为不回显结果代码,则它甚至可能不显示任何配置文件。如果同时在调制解调器端口上运行另一个进程,则调制解调器发送给您的一些内容可能会被另一个进程读取,因此您将只看到部分配置文件。有没有办法暂时停止端口上的另一个进程,使其不会干扰?我尝试使用 "kill" 命令的 "stop" 信号,但它不起作用。如果这是此 HOWTO 的最新版本,如果您找到一种方法,请告诉我。

如果您在调制解调器端口上至少运行一个进程并终止它们,则调制解调器的配置文件可能会重置,因此您将无法观察到原始配置文件是什么。如果您终止 getty(或其替代品:login 或 bash)并设置了 &D3,则会发生这种情况。终止 getty(或类似程序)将使 DTR 下降并将调制解调器的配置文件重置为开机状态。为了防止 getty 在被终止时重新生成,请在 /etc/inittab 中注释掉它并执行 "init q"。

8.7 调制解调器状态(或模式)

由于用于向调制解调器发送 AT 命令的通道与用于数据流(文件、数据包等)的通道相同,因此干净地将 AT 命令与数据分开非常重要。

当调制解调器首次打开时,它处于命令模式(也称为终端模式、空闲状态或 AT 命令模式)。从 PC 发送到它的任何内容都假定为 AT 命令而不是数据。然后,如果向其发送拨号命令 (ATD...),它会拨号并连接到另一个调制解调器。它现在处于在线数据模式(已连接)并发送和接收数据(例如 Internet 页面)。在这种模式下,任何尝试向其发送的 AT 命令都将不起作用,而是会传输到另一个调制解调器。除了转义命令。这是 +++,在开始和结束时都有最短的时间延迟。时间延迟使调制解调器能够确定它很可能是一个真正的转义,而不仅仅是正在传输的文件中的 +++。

到目前为止,我们有两种状态:AT 命令和在线数据。但还有第三种重要状态,它是这两种状态的某种组合。这就是在线命令模式。在这种模式下,调制解调器保持连接(不发送/接收数据),但从 PC 发送的任何内容都将被解释为 AT 命令。这是通过 +++ 转义信号或 PC 的 DTR 下降达到的状态,前提是已设置 &D1。然后,可以向调制解调器发送 AT 命令,包括将离开此状态并进入其他两种状态之一的命令。

还有其他状态:拨号状态和握手状态,但它们通常会引导到已连接(在线)状态。如果它们没有,那么调制解调器应该挂断,从而返回到初始的 AT 命令(或空闲)状态。


9. 串行端口设备 /dev/ttyS4,(或 /dev/ttys/4)等。

9.1 串行端口名称:ttyS4 等

曾几何时,串行端口的名称很简单。除了某些多端口串行卡之外,它们被命名为 /dev/ttyS0、/dev/ttyS1 等。然后在 2000 年左右,出现了 USB 总线,其名称如 /dev/ttyUSB0 和 /dev/ttyACM1(用于 USB 总线上的 ACM 调制解调器)。

9.2 PCI 总线

由于 DOS 为旧 ISA 总线上的 4 个串行端口(COM1-COM4,ttyS0-ttyS3)提供了支持,因此较新的 PCI 总线上的大多数串行端口都使用更高的编号,例如 ttyS4 或 ttyS14(在内核 2.6.13 之前)。但是由于大多数 PC 只配备一个或两个串行端口,ttyS0 和可能的 ttyS1(用于第二个端口),PCI 总线现在可以使用 ttyS2(内核 2.6.15 及更高版本)。所有这一切都允许在同一台 PC 上同时拥有 ISA 串行端口和 PCI 串行端口,而不会发生名称冲突。0-1(或 0-3)保留给旧的 ISA 总线(或较新的 LPC 总线),2-向上(或 4-向上或 14-向上)用于 PCI。不一定非得这样,但通常是这样。主板上同时具有 PCI 和 ISA 插槽的板载串行端口很可能仍然是 ISA 端口。即使对于全 PCI 插槽的主板,串行端口通常也不是 PCI。相反,它们要么是 ISA,位于内部 ISA 总线上,要么位于 LPC 总线上,LPC 总线旨在用于速度较慢的传统 I/O 设备:串行/并行端口和软盘驱动器。

9.3 串行端口设备名称 & 编号

Linux 中的设备具有主编号和次编号。串行端口 ttySx(x=0,1,2 等)的主编号为 4。您可以通过在 /dev 目录中键入“ls -l ttyS*”来查看这一点(以及次编号)。要查找各种设备的设备名称,请参阅内核文档中的“devices”文件。

以前,每个串行端口都有一个“cua”名称,它的行为略有不同。例如,ttyS2 将对应于 cua2。它主要用于调制解调器。cua 主编号为 5,次编号从 64 开始。您的 /dev 目录中可能仍然有 cua 设备,但它们现在已被弃用。有关详细信息,请参阅 Modem-HOWTO,章节:cua 设备已过时。

有关在设备目录中创建旧设备的信息,请参阅:Serial-HOWTO:“在 /dev 目录中创建设备”。

9.4 关于串行端口名称的更多信息

Dos/Windows 使用 COM 名称,而来自串行驱动程序的消息使用 ttyS00、ttyS01 等。较旧的串行驱动程序(2001 年?)仅使用 tty00、tty01 等。

下表显示了一些串行设备名称的示例。IO 地址是旧 ISA 总线的默认地址(不适用于较新的 PCI 和 USB 总线)。

dos     common                  IO       USB-BUS ( ACM => acm modem )
name     name     major minor address || common name      common name
COM1   /dev/ttyS0  4,  64;   3F8      || /dev/ttyUSB0  |  /dev/ttyACM0
COM2   /dev/ttyS1  4,  65;   2F8      || /dev/ttyUSB1  |  /dev/ttyACM1
COM3   /dev/ttyS2  4,  66;   3E8      || /dev/ttyUSB2  |  /dev/ttyACM2
COM4   /dev/ttyS3  4,  67;   2E8      || /dev/ttyUSB3  |  /dev/ttyACM3
 -     /dev/ttyS4  4,  68;   various

9.5 USB(通用串行总线)串行端口

有关更多信息,请参阅内核文档目录中的 usb 子目录,了解文件:usb-serial、acm 等。

9.6 将 ttySN 链接到 /dev/modem

在某些安装中,将创建两个额外的设备,/dev/modem 用于您的调制解调器,/dev/mouse 用于鼠标。这两个都是指向 /dev 中相应设备的符号链接。

历史记录:以前(在 1990 年代)不鼓励使用 /dev/modem(作为指向调制解调器串行端口的链接),因为锁定文件可能没有意识到它实际上是 /dev/ttyS2。较新的锁定文件系统不会陷入此陷阱,因此现在可以使用此类链接。

9.7 Devfs(改进但已过时的设备文件系统)

内核 2.4 引入了现在已过时的可选“设备文件系统”(devfs),它为所有内容提供了一整套新名称。但在 2003-4 年,有人声称 devfs 存在无法解决的问题,并且从内核 2.6.12 开始,它被“udev”取代(内核 2.6.12 之前的版本也可以使用 udev,但存在一些问题)。虽然 udev 没有提供 devfs 的所有功能,但它确实处理热插拔。此外,运行 Linux 不需要使用 udev,因此有些人不使用它。但许多发行版默认安装它。

Devfs 是一个好主意,据称比 udev 更有效率。但不幸的是,devfs 的作者并没有长期维护它,据称它的维护不太好。因此,无论好坏,我们现在都有了 udev,尽管关于 devfs 与 udev 的争论仍在继续。有关 devfs 的详细描述,请参阅:http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html 另请参阅内核文档树:filesystems/devfs。

devfs 的设备名称可以在 udev 中使用,但通常不使用,并且可能不容易激活。以下是串行设备的 devfs 名称:ttyS1 变为 tts/1,ttyUSB1 变为 /usb/tts/1,ttyACM1 变为 /usb/acm/1。请注意,上面的数字 1 只是一个示例。它可以替换为 0、2、3、4 等。更多 udev 名称示例:ttyS2 变为 tts/2(串行端口),tty3 变为 vc/3(虚拟控制台),ptyp1 变为 pty/m1(PTY 主设备),ttyp2 变为 pty/s2(PTY 从设备)。“tts”看起来像一个目录,其中包含设备“文件”:0、1、2 等。所有这些新名称仍应在 /dev 目录中,尽管可以选择将它们放在其他位置。

对于 devfs,/dev 目录中的设备名称由相应的驱动程序自动创建。因此,如果串行支持来自模块并且该模块尚未加载,则 /dev 目录中将不会有任何串行设备。这可能会令人困惑:您物理上拥有串行端口,但在 /dev 目录中看不到它们。但是,如果将设备名称告知通信程序并且未加载串行模块,则内核应该尝试为其找到驱动程序并在 /dev 目录中为其创建名称。

如果找到驱动程序,这可以正常工作。但是,假设没有为其找到驱动程序。例如,如果您尝试使用“setserial”配置驱动程序未能检测到的端口,它会声称没有这样的端口。在这种情况下,如何创建 devfs 端口?

例如,对于多端口设备,/dev/ttyF9 变为 /dev/ttf/9,或者在更高版本中变为 /dev/tts/F9。将 F(或 f)替换为您的多端口板为此目的使用的任何字母。多端口驱动程序应该创建一个类似于上述的 devfs 名称,并将其放入 /dev 目录中

9.8 cua 设备已过时

每个 ttyS 设备都有一个对应的 cua 设备。但是 cua 设备已被弃用,因此最好使用 ttyS(除非需要 cua)。cua 和 ttyS 之间存在差异,但精明的程序员可以使 ttyS 端口的行为与 cua 端口完全相同,因此不再真正需要 cua。除非某些旧程序可能需要使用 cua。

有什么区别?cua 和 ttyS 之间的主要区别与 C 程序中普通的“open”命令尝试打开端口时发生的情况有关。如果 cua 端口已设置为检查调制解调器控制信号,即使 CD 调制解调器控制信号指示不打开,也可以打开该端口。通过巧妙的编程(通过向程序添加额外的行),也可以强制 ttyS 端口也以这种方式运行。但是,即使调制解调器未能升高 CD(因为没有人呼叫进来并且没有载波),cua 端口也可以更轻松地编程为打开以用于调制解调器拨出。这就是为什么 cua 曾经用于拨出,而 ttyS 用于拨入。

从 Linux 内核 2.2 开始,当使用 cua 时,内核日志中会放置警告消息。这是一个 cua 已失效的预兆,应尽可能避免使用。


10. 您应该了解的有趣程序

10.1 什么是 setserial?

这部分内容在 3 个 HOWTO 中:Modem、Serial 和 Text-Terminal。根据它出现在哪个 HOWTO 中,存在一些细微的差异。

Setserial 在 linmodem、笔记本电脑上的问题

如果串行端口用于 linmodem(例如 ttySHCF0),则 setserial 程序似乎无法工作。如果您有笔记本电脑 (PCMCIA),请在阅读 笔记本电脑:PCMCIA 之前不要使用 setserial

简介

setserial 是一个程序,用户可以使用它与串行设备驱动程序进行通信。如果您只使用 PC 标准设备附带的一个或两个串行端口,通常永远不需要使用它。即使在其他情况下,现代内核也应自动检测到大多数额外的串行端口。除非您有通过物理硬件上的跳线设置的旧 ISA 串行端口,或者您的内核(例如 2.2 或更旧版本)既不检测也不设置您的附加 PCI 串行端口,否则您需要使用 setserial。

setserial 允许您(或 shell 脚本)与串行软件对话。但还有另一个程序 tt/stty/,它也处理串行端口,用于设置端口速度等。

setserial 处理串行端口的较低级别配置,例如处理 IRQ(例如 5)、端口地址(例如 3f8)等。它的一个主要问题是它无法设置或配置串行端口硬件:它无法将 IRQ 或端口地址设置到硬件中。此外,当它看似报告硬件的配置时,有时是错误的,因为它实际上并没有探测硬件,除非您明确告诉它这样做。即使那样,它也不会进行现代类型的总线探测,并且某些硬件可能永远无法被它找到。尽管如此,它显示的内容在大多数情况下都是正确的,但如果您在使串行端口工作时遇到问题,那么很有可能是错误的。

在过去,当 IRQ 和端口地址由串行卡上的跳线设置时,人们会使用 setserial 来告诉驱动程序这些跳线是如何设置的。今天,当即插即用方法检测到无跳线串行端口是如何设置的时,除非您遇到问题或使用旧硬件,否则实际上不再需要 setserial。此外,如果 setserial 使用的配置文件不正确,则会出现问题。在这种情况下,如果您使用 setserial 尝试找出端口的配置方式,它可能只会重复配置文件中的不正确信息。

setserial 有时可以帮助查找串行端口。但只有当您知道端口地址并使用正确的选项时才有用。对于现代端口,通常有更好的方法通过即插即用方法来查找它们。

因此,名称 setserial 有点用词不当,因为它不会在硬件中设置 I/O 地址或 IRQ,它只是在驱动程序软件中“设置”它们。驱动程序天真地相信 setserial 告诉它的内容,即使它与驱动程序通过使用即插即用方法找到的内容相冲突。糟糕的是,它至少没有为此类冲突发出警告消息。由于设备驱动程序被认为是内核的一部分,因此在其他文档中经常使用“内核”一词,而没有提及任何“串行驱动程序”。

某些发行版(和版本)设置了某些内容,以便 setserial 在启动时由初始化 shell 脚本(在 /etc 目录树中)运行。但是此脚本使用的配置文件可能位于 /etc 树或 /var 树中。在某些情况下,如果您希望 setserial 在启动时运行,您可能需要采取一些操作。如果没有内置到内核或作为模块加载的串行支持,setserial 将无法工作。如果您(或脚本)尝试使用 setserial,则可能会自动加载该模块。

虽然可以使 setserial 探测硬件 I0 端口地址以尝试确定 UART 类型和 IRQ,但这存在严重限制。请参阅 探测。它无法在 PnP 或 PCI 串行端口的硬件中设置 IRQ 或端口地址(但串行驱动程序的即插即用功能可能会执行此操作)。它也无法直接读取存储在硬件配置寄存器中的 PnP 数据。但是,由于设备驱动程序可以读取这些寄存器,并且 setserial 会告诉您设备驱动程序的想法,因此它可能是正确的。或者它可能告诉您 setserial 之前(可能错误地)告诉驱动程序的内容。在没有进行其他检查的情况下,无法确定。

串行驱动程序(对于 Linux 内核 2.4+)查找一些“标准”传统串行端口、ISA 总线上的 PnP 端口以及 PCI 总线上的所有受支持端口硬件。如果它正确找到您的端口,则无需使用 setserial。驱动程序不探测传统 IRQ,并且可能将这些 IRQ 弄错,并且可能会遗漏通过卡上的跳线设置的旧 ISA 串行端口。

除了 setserial 的手册页之外,还要查看 /usr/doc/setserial...//usr/share/doc/setserial 中的信息。这应该告诉您如何为您的 Linux 发行版处理 setserial。虽然 setserial 在所有发行版中的行为都相同,但用于运行它的脚本、如何配置此类脚本(包括自动配置)以及脚本文件的名称和位置等都与发行版相关。

串行模块卸载

如果串行模块被卸载,则驱动程序将忘记之前由 setserial 所做的更改。但是,虽然驱动程序忘记了它,但发行版提供的脚本可能会将其保存在某处的文件中,以便在重新加载模块时可以恢复它。

给出 setserial 命令

请记住,setserial 无法在硬件中设置任何 I/O 地址或 IRQ。这是通过即插即用软件(由驱动程序运行)或旧式串行端口的跳线完成的。即使您通过 setserial 向驱动程序提供 I/O 地址或 IRQ,它也不会设置这些值,并假定它们已被设置。如果您给它错误的值,串行端口将无法正常工作(如果能工作的话)。

对于旧式端口,如果您知道 I/O 地址但不知道 IRQ,您可以命令 setserial 尝试确定 IRQ。

您只需在不带任何参数的情况下键入 setserial 即可查看可能的命令列表。这无法向您显示单字母选项,例如 -v 用于详细输出,您通常应在进行故障排除时使用该选项。请注意,setserial 将 IO 地址称为“端口”。如果您键入

setserial -g /dev/ttyS*
您将看到一些关于设备驱动程序如何为您的端口配置的信息。在许多情况下,您会看到一些端口显示为乍一看似乎是错误的 IRQ 和地址。但是,如果您还看到:"UART: unknown",则只需忽略整行,因为该地址处不存在串行端口。

如果您将 -a 添加到选项 -g,您将看到更多信息,尽管很少有人需要处理(或理解)此附加信息,因为您看到的默认设置通常可以正常工作。在正常情况下,硬件的设置方式与“setserial”报告的方式相同。但是,如果您遇到问题,则很有可能是 setserial 弄错了。实际上,您可以运行“setserial”并分配一个纯粹虚构的 I/O 端口地址、任何 IRQ 以及您想要拥有的任何 uart 类型。然后,下次您键入“setserial ...”时,它将显示您提供给驱动程序的这些伪造值。它们也将正式注册到内核中,如“scanport”命令(Debian)在屏幕顶部显示的那样。当然,如果您尝试使用此类端口,串行端口驱动程序将无法正常工作(如果能工作的话)。因此,在向 setserial 提供参数时,“一切皆有可能”。嗯,几乎是这样。如果您为一个端口分配了一个已分配的基本地址(例如 3e8),它可能不会接受它。但是如果您使用 3e9,它会接受它。不幸的是,3e9 实际上已分配,因为它在基本地址 3e8 开始的范围内。因此,这个故事的寓意是在使用 setserial 分配资源之前,请确保您的数据正确。

配置文件

虽然 setserial 所做的分配在 PC 断电时会丢失,但配置文件可能会在 PC 再次启动时恢复它们。在较新版本中,您通过 setserial 更改的内容可能会自动保存到配置文件中。当 setserial 运行时,它使用来自配置文件的信息。

此配置文件的位置取决于您的发行版。查看 /etc/ 树中的启动脚本(例如 /etc/init.d/ 或 /etc/rc.d/)并阅读“serial”或“setserial”之类的启动脚本。它应该显示配置文件所在的位置。在 Debian 中,有 4 个选项可用于此配置文件

  1. 完全不使用此文件。在每次启动时,串行驱动程序单独检测端口,并且 setserial 永远不会运行。(“kernel”选项)
  2. 保存系统首次关闭时 setserial 报告的内容,并将其放入配置文件中。之后,即使有人通过在命令行上运行 setserial 命令然后关闭系统进行了更改,也永远不要对配置文件进行任何更改。(“autosave-once”选项)
  3. 在每次关闭时,将 setserial 检测到的任何内容保存到配置文件中。(“autosave”选项)
  4. 手动编辑配置文件以设置配置。永远不要对其进行任何自动保存。(“manual”选项)

在过去(可能在 2000 年之前),没有任何配置文件,并且配置是在运行 setserial 的 shell 脚本内部手动设置(硬编码)的。请参阅 编辑脚本(版本 2.15 之前)

探测

仅当您怀疑端口已启用(通过 PnP 方法、BIOS、跳线等)时,才使用 setserial 探测端口。否则 setserial 探测永远不会找到它,因为它的地址不存在。问题是软件在指定的 I/O 地址处查找端口的位置。在使用“setserial”探测之前,可以运行“scanport”(Debian)命令来在一个扫描中检查所有可能的端口。它对某些端口上的内容进行粗略猜测,但不确定 IRQ。这是一个快速的开始。它可能会使您的 PC 挂起,但到目前为止,它对我来说工作正常。请注意,非 Debian 发行版似乎不提供“scanport”。还有其他扫描程序吗?

使用适当的选项,setserial 可以(在给定的 I/O 地址处)探测串行端口,但您必须猜测 I/O 地址。例如,如果您要求它探测 /dev/ttyS2,它只会探测它认为 ttyS2 所在的地址 (2F8)。如果您告诉 setserial ttyS2 位于不同的地址,那么它将在该地址探测,依此类推。请参阅 探测

这种探测的目的是查看那里是否有 uart,如果有,它的 IRQ 是什么。主要将 setserial 用作最后的手段,因为有更快的方法来尝试它,例如 wvdialconf 检测调制解调器、查看非常早期的启动时消息或使用 pnpdump --dumpregs 或 lspci -vv。但是,如果您想使用 setserial 检测硬件,请使用例如
setserial /dev/ttyS2 -v autoconfig
如果结果消息显示 uart 类型(例如 16550A),则表示正常。如果相反,它显示 uart 类型的“unknown”,则表示该 I/O 地址根本没有串行端口。一些廉价的串行端口无法正确识别自己,因此如果您看到“unknown”,您可能仍然在那里有一个串行端口。

除了自动探测 uart 类型外,setserial 还可以自动探测 IRQ,但这也不总是正常工作。在一种情况下,它首先给出了错误的 irq,但当重复该命令时,它找到了正确的 irq。在 setserial >= 2.15 的版本中,您上次探测测试的结果可以自动保存并放入特定于发行版的配置文件中,例如 Debian 的 /etc/serial.conf/etc/sysconfig/serial/var/lib/setserial/autoserial.conf。下次启动 Linux 时将使用此文件。

可能两个串行端口在硬件中都设置了相同的 IO 地址。当然,这通常不允许用于 ISA 总线,但有时仍然会发生。当实际上有两个串行端口时,探测会检测到一个串行端口。但是,如果它们具有不同的 IRQ,则 IRQ 的探测可能会显示 IRQ = 0。对我来说,只有当我首先使用 setserial 为 IRQ 提供一个虚构值时,才会发生这种情况。

启动时配置

虽然 setserial 可能会通过初始化脚本运行,但在加载串行模块时(或者当内核启动内置串行驱动程序(如果已编译到内核中)时),也会更早地运行类似于 setserial 的程序。因此,当您观看屏幕上的启动消息时,它可能看起来像运行了两次,而实际上确实运行了两次。

如果第一条消息是关于旧式端口的,则显示的 IRQ 可能不正确,因为它没有探测 IRQ。如果串行端口有第二个报告,则可能是 /etc/init.d/setserial 等脚本的结果。它通常不进行探测,因此可能不正确地了解硬件的实际设置方式。它仅显示保存在配置文件中的配置数据。在 setserial 2.15 之前的旧方法是将此类数据直接手动写入脚本。

当内核加载串行模块时(或者如果“模块等效项”内置到内核中),则会检测到所有受支持的 PnP 端口。对于旧式 (non-PnP) 端口,仅自动检测 ttyS{0-3},并且驱动程序设置为仅使用 IRQ 4 和 3(无论硬件中实际设置了哪些 IRQ)。不进行 IRQ 探测,但可以手动执行此操作。您会看到启动时消息,就像 setserial 已运行一样。

为了纠正 IRQ 中可能的错误(或其他原因),可能在某处有一个脚本文件运行 setserial。不幸的是,如果此文件中的某些 IRQ 错误,内核仍然会具有关于 IRQ 的不正确信息。此文件通常是在启动时完成的初始化的一部分。它是否运行取决于您(和/或您的发行版)如何设置。它也可能取决于运行级别。

在修改配置文件之前,您可以通过仅在命令行上键入“proposed”setserial 命令来测试它。在某些情况下,当您关闭时,此 setserial 用法的结果将自动保存在某处,例如 /etc/serial.conf(或 autoserial.conf 或 serial)。因此,如果它工作正常(并解决了您的问题),则无需修改任何配置文件。请参阅 使用 /etc/serial.conf 等的配置方法

编辑脚本(版本 2.15 之前需要)

这是在 setserial 2.15 (1999) 之前完成的方式。目标是修改(或创建)/etc 树中的一个脚本文件,该文件在启动时运行 setserial。大多数发行版都提供了这样的文件(但它最初可能没有驻留在 /etc 树中)。

因此,在版本 2.15 (1999) 之前,它更简单。您所做的只是编辑脚本。没有 /etc/serial.conf 文件(或类似文件)来配置 setserial。因此,您需要找到在启动时运行“setserial”的文件并对其进行编辑。如果它不存在,您需要创建一个(或将命令放在启动时早期运行的文件中)。如果当前正在使用此类文件,则很可能位于 /etc 目录树中的某处。但 Redhat <6.0 已在 /usr/doc/setserial/ 中提供了它,但您需要在使用它之前将其移动到 /etc 树。

脚本 /etc/rc.d/rc.serial 过去很常用。Debian 发行版使用 /etc/rc.boot/0setserial。曾经使用过的另一个文件是 /etc/rc.d/rc.local,但它可能运行得不够早。据报道,其他进程可能会在 rc.local 运行之前尝试打开串行端口,从而导致串行通信失败。后来,它很可能在 /etc/init.d/ 中找到,但通常不打算进行编辑。

如果提供了此类文件,则可能包含许多注释掉的示例。通过取消注释其中一些示例和/或修改它们,您可以正确设置内容。重要的是为 setserial 使用有效路径,并为设备名称使用有效路径。您可以通过手动执行此文件(只需以超级用户身份键入其名称)来测试它是否正常工作。像这样的测试比重复重启以使其正确要快得多。

对于版本 >= 2.15(前提是您的发行版实现了更改,Redhat 最初没有实现),这样做可能更棘手,因为在启动时运行 setserial 的文件 /etc/init.d/setserial 或类似文件不打算由用户编辑。请参阅 使用 /etc/serial.conf 等的配置方法

此类脚本中的示例行是

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test

或者,如果您希望 setserial 自动确定 ttyS3 的 uart 和 IRQ,您可以使用如下内容

/sbin/setserial  /dev/ttyS3 auto_irq skip_test autoconfig

这是为您想要自动配置的每个串行端口完成的,使用您的机器上确实存在的设备名称。在某些情况下,由于硬件原因,它无法正常工作。

使用 /etc/serial.conf 等的配置方法

在 setserial 版本 2.15 (1999) 之前,配置 setserial 的方法是手动编辑在启动时运行 setserial 的 shell 脚本。请参阅 编辑脚本(版本 2.15 之前)。这很简单,但简单明了的方法已更改为不必要的复杂方法。如今,脚本和配置文件是两个不同的文件,而不是一个文件。此 shell 脚本未编辑,但从配置文件(例如 /etc/serial.conf(或 /var/lib/setserial/autoserial.conf))获取其数据。

此外,您甚至可能不需要编辑 serial.conf(或类似文件),因为在命令行上使用“setserial”命令可能会自动导致 serial.conf 被适当地编辑。这样做是为了让您可能不需要编辑任何文件即可设置(或更改)每次启动 Linux 时 setserial 执行的操作。

通常发生的情况是这样的:当您关闭 PC 时,启动时运行的 "setserial" 脚本会再次运行,但这次它只执行“stop”情况部分所说的操作:它使用 "setserial" 找出 "setserial" 的当前状态,并将该信息放入串行端口配置文件中,例如 serial.conf。 因此,当您运行 "setserial" 来更改 serial.conf 文件时,它不会立即更改,而只会在您正常关闭时更改。

现在您可能可以猜到可能会出现什么问题。 假设您没有正常关闭(有人关闭电源等),并且更改没有保存。 假设您使用 "setserial" 进行实验,并忘记最后一次运行它以恢复原始状态(或在恢复原始状态时出错)。 那么您的“实验性”设置将被保存。 最糟糕的是,除非您知道配置文件中设置了哪些选项,否则您不知道会发生什么。 Debian(以及可能的其他发行版)中的一个选项被称为 "AUTOSAVE-ONCE",它仅在您首次使用 setserial 命令进行更改时保存更改。

如果设置了选项 "###AUTOSAVE###" 并且您手动编辑 serial.conf,那么您的编辑将在您关闭时被破坏,因为它会被更改回关闭时 setserial 的状态。 有一种方法可以禁用在关闭时更改 serial.conf,那就是从 serial.conf 的第一行删除 "###AUTOSAVE###" 或类似内容。 在 Debian 发行版中,首次安装后首次关闭时,会自动完成从第一行删除 "###AUTOSAVE###" 的操作。 为了保留这种效果,创建了 "AUTOSAVE-ONCE" 选项,该选项仅在首次关闭系统时(刚刚安装或更新 setserial 程序后)执行保存操作。

现在最常用的在启动时运行 setserial 的文件(符合配置文件)是 /etc/init.d/setserial (Debian) 或 /etc/init.d/serial (Redhat),或其他,但通常不应编辑它。 对于 2.15 版本,Redhat 6.0 只有一个文件 /usr/doc/setserial-2.15/rc.serial,如果您希望 setserial 在启动时运行,则必须将其移动到 /etc/init.d/。

要禁用端口,请使用 setserial 将其设置为 "uart none"。 这将不会被保存。 /etc/serial.conf 的格式似乎与命令行上 "setserial" 后面的参数格式相同,每行一个端口。 如果您不使用自动保存,您可以手动编辑 /etc/serial.conf。

为了强制将 setserial 设置的当前设置保存到配置文件 (serial.conf) 而无需关闭,请执行通常在您关闭时发生的操作:运行 shell 脚本 /etc/init.d/{set}serial stop。 "stop" 命令将保存当前配置,但串行端口仍然可以正常工作。

在某些情况下,您可能会同时安装旧的和新的配置方法,但希望只有其中一种在启动时运行。 Debian 将过时的文件标记为 "...pre-2.15"。

IRQs(中断请求)

默认情况下,ttyS0 和 ttyS2 将共享 IRQ 4,而 ttyS1 和 ttyS3 共享 IRQ 3。 但是,虽然共享串行中断(在运行程序中使用它们)对于 PCI 总线来说是可以的,但对于 ISA 总线来说是不允许的,除非您:1. 拥有 2.2 或更高版本的内核,并且 2. 您已编译了对此的支持,并且 3. 您的串行硬件支持它。 请参阅

中断共享和 2.2+ 内核 如果您只有两个串行端口,ttyS0 和 ttyS1,那么您仍然可以,因为对于不存在的设备,IRQ 共享冲突不存在。

如果您添加一个传统的内部调制解调器(没有即插即用功能)并保留 ttyS0 和 ttyS1,那么您应该尝试找到一个未使用的 IRQ 并在您的串行端口(或调制解调器卡)中设置它,然后使用 setserial 将其分配给您的设备驱动程序。 如果 IRQ 5 没有被声卡使用,则可以将其用于调制解调器。

笔记本电脑:PCMCIA

如果您有笔记本电脑,请阅读 PCMCIA-HOWTO 以获取有关串行配置的信息。 对于主板上的串行端口,setserial 的使用方式与台式机相同。 但对于 PCMCIA 卡(例如调制解调器),情况有所不同。 PCMCIA 系统的配置应自动运行 setserial,因此您无需运行它。 如果您运行它(通过脚本文件或 /etc/serial.conf),它可能会有所不同并导致问题。 serial.conf 的自动保存功能不应保存 PCMCIA 卡的任何内容(但在 2.15-7 版本之前的 Debian 中会这样做)。 当然,始终可以使用 setserial 来了解 PCMCIA 卡的驱动程序是如何配置的。

10.2 什么是 isapnp?

isapnp 是一个用于配置 ISA 总线上的即插即用 (PnP) 设备的程序,包括内部调制解调器。 它包含在一个名为 "isapnptools" 的软件包中,并包含另一个程序 "pnpdump",该程序查找您所有的 ISA PnP 设备,并以一种可以添加到 PnP 配置文件 /etc/isapnp.conf 中的格式向您显示配置选项。 它也可以与 --dumpregs 选项一起使用,以显示调制解调器串行端口的当前 IO 地址和 IRQ。 isapnp 命令可以放入启动文件中,以便每次您启动计算机时运行,从而配置 ISA PnP 设备。 即使您的 BIOS 不支持 PnP,它也能够做到这一点。 请参阅 Plug-and-Play-HOWTO。

10.3 什么是 wvdialconf?

wvdialconf 将尝试查找哪个串行端口 (ttyS?) 上连接了调制解调器。 它还为 wvdial 程序创建了一个配置文件。 wvdial 用于简化使用 PPP 协议拨号连接到 ISP 的操作。 它还可以查找当前未使用的调制解调器。 它将自动设计一个“合适的”调制解调器初始化字符串,但有时会出错。 由于此命令没有选项,因此使用起来很简单,但您必须为其提供一个文件名,以便将初始化字符串(和其他数据)放入其中。 例如,键入:wvdialconf my_config_file_name。


11. 尝试使用您的调制解调器(拨号连接)

11.1 您准备好拨号连接了吗?

一旦您插入了调制解调器并知道它在哪个串行端口上,您就可以尝试使用它了。 电话线上的协议将是 PPP(点对点协议),但 PPP 的设置通常不需要您了解太多。 如果您已经拥有 ISP 的帐户以连接到互联网,您可以尝试使用像 "wvdial" 这样的程序来连接到互联网。

作为使用 PPP 连接到互联网的一大步的替代方案,您可以执行一个两步过程:首先,仅测试您的调制解调器,而不使用 PPP(使用 Minicom 或 Kermit)。 然后,如果您的调制解调器工作正常,请使用 "wvdial" 或另一个 ppp 拨号器连接到互联网。 另一种策略是首先尝试 ppp 拨号器,如果不起作用,则回退到 Minicom 或 Kermit,看看您的调制解调器是否工作正常。 了解如何使用 Minicom 或 Kermit 对于直接拨号连接到其他调制解调器而不通过互联网非常有用。 如果您要使用 Minicom 或 Kermit,您必须找到一个电话号码,该号码将接受来自计算机的电话呼叫(不使用 PPP)。 也许当地图书馆有一个用于其在线目录的电话号码。

然后确保您已准备好打电话。 您知道您的调制解调器在哪个串行端口上吗(例如 ttyS2)? 您应该在配置串行端口的 IO-IRQ 时找到它。 您是否已决定要为此端口使用什么速度? 请参阅 速度表 以进行快速选择,或参阅 我应该为我的调制解调器使用什么速度 以了解更多详细信息。 如果您不知道要设置什么速度,请尝试将其设置为比调制解调器的广告速度快几倍。 另请记住,如果您看到一个菜单,其中一个选项是“硬件流控制”和/或“RTS/CTS”等,请选择它。 电话线是否已插入您的调制解调器? 您可能需要将此电缆连接到真正的电话,以确保它可以产生拨号音。

现在您需要选择一个通信(拨号)程序来用于拨号连接。 互联网拨号程序(使用 PPP)包括 wvdial、pppconfig (Debian)、kppp (KDE) 和 Gnome:gnome-ppp 或 "modem lights"。 非互联网拨号程序包括:minicom、seyon (X Window) 和 kermit。 请参阅 通信程序 部分,了解一些通信程序。 接下来介绍三个示例:使用 wvdial 拨号连接 使用 Minicom 拨号连接使用 Kermit 拨号连接

11.2 使用 wvdial 拨号连接

Wvdial 不仅是一个拨号程序,而且还启动 PPP 并将您登录到 ISP,在那里您可以访问互联网。 Wvdial 可以在安装过程中配置,也可以使用程序 "wvdialconf" 进行配置。 请参阅 "wvdialconf" 和 "wvdial" 的手册页。 但是,在使用 wvdial 之前,您必须完成 wvdial 文档中未涵盖的其他两项任务

11.3 使用 Minicom 拨号连接

Minicom 随附大多数 Linux 发行版。 要配置它,您应该是 root 用户。 以 root 用户身份,键入 "minicom -s" 进行配置。 这将直接带您进入配置(设置)菜单。 这允许您立即使用配置。 如果您只是键入 "minicom" 然后配置,您需要离开并重新启动 minicom 才能使配置生效。 在 minicom 中键入 ^A 以查看底部状态行。 这显示键入 ^A Z 以获得帮助(您已经键入了 ^A,因此只需键入 z)。

对于仅简单地拨号连接,大多数选项都不需要设置。 要配置,您必须提供一些基本项目:调制解调器所在的串行端口名称,例如 /dev/ttyS2,以及速度,例如 115200。 这些在串行端口菜单中设置。 进入它并设置它们。 此外(如果可能),设置硬件流控制 (RTS/CTS)。 然后保存它们。 当输入速度时,您还应该看到类似 "8N1" 的内容,您应该保持原样。 它的意思是:8 位字节,无奇偶校验,每个字节附加 1 个停止位。 如果您找不到想要的速度,较低的速度始终适用于测试。 完成后退出(按回车键),并使用菜单将配置保存为默认值 (dfl)。 除非您在调用 minicom 时使用了 -s 选项,否则您需要退出 minicom 并重新启动它,以便它现在可以找到串行端口并初始化调制解调器。

现在您准备好拨号了。 但首先在您首次键入 "minicom" 后获得的主屏幕上,通过键入 AT 然后按 <enter> 键来确保那里有一个调制解调器。 它应该显示 OK。 如果没有,请尝试键入 ATQ0 V1 EI,看看是否得到 OK。 如果您仍然没有得到 OK,则说明有问题,并且尝试拨号没有意义。 您可能需要键入:ATQ0 V1 E1 是因为调制解调器可能会进入无法显示 OK 的状态,而这应该使其摆脱该状态。

如果您得到 "OK",请返回帮助并选择拨号目录。 您可以编辑它并在目录中键入电话号码等,然后选择 "dial" 进行拨号。 或者,您可以手动拨号(通过选择 "manual" 然后在键盘上键入号码)。 如果它不起作用,请仔细记录任何错误消息,并尝试找出问题所在。

11.4 使用 Kermit 拨号连接

您可以在 kermit 的最新版本中找到 http://www.columbia.edu/kermit/。 例如,假设您的调制解调器在 ttyS4 上,其速度为 115200 bps。 您将执行以下操作

linux# kermit
C-Kermit 6.0.192, 6 Sep 96, for Linux
 Copyright (C) 1985, 1996,
  Trustees of Columbia University in the City of New York.
Default file-transfer mode is BINARY
Type ? or HELP for help.
C-Kermit>set line /dev/ttyS4
C-Kermit>set carrier-watch off
C-Kermit>set speed 115200
/dev/ttyS4, 115200 bps
C-Kermit>c
Connecting to /dev/ttyS4, speed 115200.
The escape character is Ctrl-\ (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
ATE1Q0V1                           ; you type this and then the Enter key
OK                                 ; modem should respond with this

如果您的调制解调器响应 AT 命令,您可以假设您的调制解调器在 Linux 端工作正常。 现在尝试通过键入以下内容来呼叫另一个调制解调器

ATDT7654321
其中 7654321 是电话号码。 如果您有脉冲线路,请使用 ATDP 而不是 ATDT。 如果呼叫接通,则您的调制解调器正在工作。

要返回到 kermit 提示符,请按住 Ctrl 键,按反斜杠键,然后松开 Ctrl 键,然后按 C 键

Ctrl-\-C
(Back at linux)
C-Kermit>quit
linux#

这只是使用原始的“手动”拨号方法进行的测试。 正常方法是让 kermit 使用其内置的调制解调器数据库和自动拨号功能为您拨号,例如使用 US Robotics (USR) 调制解调器

linux# kermit
C-Kermit 6.0.192, 6 Sep 1997, for Linux
 Copyright (C) 1985, 1996,
  Trustees of Columbia University in the City of New York.
Default file-transfer mode is BINARY
Type ? or HELP for help
C-Kermit>set modem type usr        ; Select modem type
C-Kermit>set line /dev/ttyS4       ; Select communication device
C-Kermit>set speed 115200          ; Set the dialing speed
C-Kermit>dial 7654321              ; Dial
 Number: 7654321
 Device=/dev/ttyS4, modem=usr, speed=115200
 Call completed.<BEEP>
Connecting to /dev/ttyS4, speed 115200
The escape character is Ctrl-\ (ASCII 28, FS).
Type the escape character followed by C to get back,
or followed by ? to see other options.

Welcome to ...  (a welcome message, etc.)

login:


12. 拨入

12.1 拨入概述

拨入是指设置您的 PC,以便其他人可以拨入您的 PC(使用您的电话号码)并使用您的 PC。 不幸的是,有些人使用术语“拨入”时,他们实际上的意思是恰恰相反:拨号连接。

拨入的工作方式如下:某人用调制解调器拨打您的电话号码。 您的调制解调器应答电话铃声并连接。 一旦呼叫者连接,getty 程序将收到通知,并为呼叫者启动登录过程。 在呼叫者登录后,呼叫者可以使用您的 PC。 这几乎就像他们坐在您的显示器控制台前一样。

呼叫者可以使用脚本自动登录。 此脚本将是 expect-send 类型。 例如,它期望“login:”,然后(在检测到“login:”之后)将发送用户的登录名。 接下来,它期望密码,然后发送密码等。 然后,一旦用户自动登录,/etc/passwd(密码文件)可能会指定将为用户启动 shell(例如 bash)。 或者,它可能会指定启动 PPP,以便用户可以连接到互联网。 有关更多详细信息,请参阅 PPP-HOWTO。 您在 PC 上用于处理拨入的程序称为 gettymgetty。 请参阅 Getty

像 mgetty 这样的高级 getty 程序可以监视以查看 PPP 是否由另一端的 PC 启动。 如果是这样,则会跳过登录提示,建立 PPP 连接,并且登录将通过 PPP 连接自动进行。

12.2 当有人拨入时会发生什么?

以下是拨入的更详细描述。 这都假设您正在使用 mgetty 或 uugetty。 Agetty 较差,并且工作方式不完全相同(请参阅 关于 agetty

为了使拨入工作,调制解调器必须正在监听铃声,并且 getty 必须正在运行并准备好响应呼叫。 您的调制解调器通常正在监听来电,但它在收到铃声时会做什么取决于它的配置方式。 调制解调器可以自动应答电话,也可以不直接应答电话。 在后一种情况下,调制解调器向 getty 发送 "RING" 消息,然后 getty 告诉调制解调器应答铃声。 在任何一种情况下,都可以将其设置为在例如第 4 声铃响时应答。 这意味着如果呼叫不是针对调制解调器的,则必须走到/跑到电话旁并在第 4 声铃响之前手动拿起电话。 然后可以在电话上进行普通的对话。 如果有人太晚才到达电话旁,他会听到调制解调器应答呼叫的高音调。

一旦调制解调器应答呼叫,它就会向另一个调制解调器发送音调(反之亦然)。 两个调制解调器协商他们将如何通信,当完成此操作后,您的调制解调器会向 getty 发送 "CONNECT" 消息(或类似消息)。 当 getty 收到此消息时,它会通过串行端口发送登录提示。 一旦向此提示提供了用户名,getty 可以调用一个名为 login 的程序来从那里开始处理登录过程。 虽然 getty 通常在启动时开始运行,但它应该等到建立连接后再发送 "login" 提示。

现在更详细地介绍两种应答呼叫的方法。 第一种方法是调制解调器自动应答呼叫。 在这种情况下,调制解调器在应答之前响铃的次数由调制解调器的 S0 寄存器控制。 如果 S0 设置为 3,则调制解调器将在第 3 声铃响时自动应答。 如果 S0 设置为 0,则只有在 getty 在电话铃响时向调制解调器发送 "A" (= Answer) AT 命令时,调制解调器才会应答呼叫。 (实际上发送的是 "ATA",因为所有调制解调器命令都以 "AT" 为前缀。)这是第二种应答方法,称为“手动”应答,因为调制解调器本身不会自动执行此操作(但 getty 会)。 您可能会认为最好利用调制解调器硬件自动应答呼叫的能力,但实际上最好让 getty “手动”应答它。

对于“手动”应答情况,getty 在启动时打开端口并监听。 当电话铃响时,"RING" 消息被发送到正在监听的 getty。 然后,如果 getty 想要应答此铃声,它会向调制解调器发送 "A" 命令。 请注意,getty 可以设置为仅在例如 4 条 "RING" 消息(第 4 声铃响)后应答,类似于自动应答方法。 然后,调制解调器建立连接并向 getty 发送 "CONNECT ..." 消息,然后 getty 向呼叫者发送登录提示。 并非所有事情都如此简单,因为使用了一些特殊的技巧来允许在等待呼叫时进行拨号连接。 请参阅 在等待来电时拨号连接

自动应答情况使用来自调制解调器到串行端口的 CD(载波检测,也称为 DCD)线来告知何时建立连接。 它的工作方式如下:在启动时,getty 尝试打开串行端口,但由于调制解调器已否定 CD(调制解调器处于空闲状态),因此尝试失败。 然后 getty 程序在程序中的 open 语句处等待,直到 CD 信号升高。 当 CD 信号到达(可能在数小时后)时,端口将被打开,并且 getty 发送登录提示。 当 getty 在 open 语句处等待(休眠)时,其他进程可以运行,因此它不会降低计算机性能。 实际上唤醒 getty 的是当来自调制解调器的 CD 线的状态变为开启时发出的中断。

您可能想知道 getty 如何能够在“手动”应答情况下打开串行端口,因为 CD 可能会被否定。 好吧,有一种方法可以编写程序来强制端口打开,即使没有 CD 信号升高。

12.3 56k 不适用于拨入

如果您期望人们能够以 56k 的速度拨入您,则无法做到,除非您拥有以下所有条件

  1. 您具有与电话公司的数字连接,例如 trunkside-T1 或 ISDN 线路
  2. 您使用特殊的数字调制解调器(请参阅 数字调制解调器
  3. 您有一个“... 集中器”或类似设备,用于将您的数字调制解调器连接到电话公司的数字线路。
“... 集中器”可以称为“调制解调器集中器”或“远程访问集中器”,或者它可以包含在“远程访问服务器” (RAS) 中,其中包括数字调制解调器等。 ISP(互联网服务提供商)使用这种类型的设置。

12.4 Getty

Getty 简介

getty 程序(包括 agetty、mgetty 等)是您为拨入运行的程序。 您不需要它用于拨号连接。 除了显示登录提示外,它还可以帮助应答来电。 最初,getty 用于从哑终端登录到计算机。 今天它的主要用途是在控制台上登录到 Linux 系统。 有几个不同的 getty 程序,其中一些程序可以与调制解调器一起用于拨入。 getty 程序通常在启动时或有人拨入您的计算机时启动。 它必须从 /etc/inittab 文件中调用。 在此文件中,您可能会找到一些示例,您可能需要稍微编辑一下。

有四种不同的 getty 程序可供选择,可以与调制解调器一起用于拨入:mgettyuugettygetty_emagetty。 以下小节给出了简要概述。 agetty 是四者中最弱的,它主要用于直接连接的文本终端。 mgetty 包括对传真和语音邮件的支持,但 uugetty 没有。 但是,据称 mgetty 缺少 uugetty 的一些功能。 getty_emuugetty 的简化版本。 因此,mgetty 可能是您的最佳选择,除非您已经熟悉 uugetty(或发现 mgetty 难以获取)。 这些 getty 程序的语法不同,因此请确保在 /etc/inittab 中为使用的任何 getty 使用正确的语法。

为了查看您的计算机上关于各种 getty 的文档,请使用 "locate" 命令。 键入:locate "*getty*"(包括引号可能会有所帮助)。 请注意,许多发行版只是将程序称为 getty,即使它实际上可能是 agetty、uugetty 等。 但是,如果您阅读手册页(键入:man getty),它可能会透露它是哪个 getty。 这应该是路径为 /sbin/getty 的 getty 程序。

getty 如何 respawn(重新生成进程)

登录后,您会注意到(通过使用 "top"、"ps -ax" 或 "ptree")getty 进程不再运行。 它发生了什么? 如果您的 shell 被终止,为什么 getty 会再次重启? 原因如下。

在您键入用户名后,getty 会获取它并调用 login 程序,告诉它您的用户名。 getty 进程被 login 进程取代。 login 进程会询问您的密码,检查密码,并启动您的密码文件中指定的任何进程。 此进程通常是 bash shell。 如果是这样,bash 启动并取代 login 进程。 请注意,一个进程取代了另一个进程,并且 bash shell 进程最初是作为 getty 进程启动的。 这其中的含义将在下面解释。

现在在 /etc/inittab 文件中,getty 应该在被终止时 respawn(重启)。 调用 getty 的行上就是这么说的。 但是,如果 bash shell(或 login 进程)被终止,getty 会 respawn(重启)。 为什么? 好吧,login 进程和 bash 都是 getty 的替代品,并继承了其前任建立的信号连接。 事实上,如果您观察细节,您会注意到替换进程将具有与原始进程相同的进程 ID。 因此,bash 有点像伪装的 getty,具有相同的进程 ID 号。 如果 bash 被终止,就像 getty 被终止一样(即使 getty 不再运行)。 这会导致 getty respawn。

当有人注销时,该串行端口上的所有进程都将被终止,包括 bash shell。 如果调制解调器 DCD 电压下降向串行端口发送挂断信号,也可能会发生这种情况(如果已启用)。 注销或 DCD 下降都将导致 getty respawn。 可以通过手动终止 bash(或 login)来强制 getty respawn,可以通过在 "top" 中点击 k 键等或使用 "kill" 命令来完成。 您可能需要使用信号 9 终止它(这是无法忽略的)。

关于 mgetty

mgetty 是作为 uugetty 的替代品编写的,uugetty 早在 mgetty 之前就已存在。 两者都用于调制解调器,但 mgetty 是最好的(除非您已经致力于 uugetty)。 mgetty 也可以用于直接连接的终端,但没有太多用于此目的的功能。 除了允许拨号登录外,mgetty 还提供传真支持、自动 PPP 检测和来电显示支持。 它允许在 mgetty 等待来电时拨号连接。 有一个补充程序称为 vgetty,用于处理某些调制解调器的语音邮件。 mgetty 文档尚可(语音邮件除外),并且未在本 HOWTO 中补充。 要自动启动 PPP,必须编辑 /etc/mgetty/login.conf 以使用 "AutoPPP"(有示例)。 您可以在 http://www.leo.org/~doering/mgetty/http://alpha.greenie.net/mgetty/ 找到关于 mgetty 的最新信息

关于 uugetty

getty_ps 包含两个程序:getty 用于控制台和终端设备,uugetty 用于调制解调器。 Greg Hankins(Serial-HOWTO 的前作者)使用 uugetty,因此他关于它的著作包含在此处。 请参阅 Uugetty

关于 getty_em

这是 ``uugetty'' 的简化版本。 它是由 Vern Hoxie 在他对 getty_ps 和 uugetty 所需的复杂支持文件感到完全困惑后编写的。

它是 Vern Hoxie 的串行端口实用程序和信息集合的一部分,可通过 ftp 从 scicom.alphacdc.com/pub/linux 获取。 该集合的名称是 ``serial_suite.tgz''。

关于 agetty

本小节很长,因为作者尝试使用 agetty 进行拨入。 agetty 似乎很简单,因为没有初始化文件。 但是当我尝试使用它时,即使没有 CD 信号,它也打开了串行端口。 然后,在建立连接之前,它在 AT 命令状态下向调制解调器发送了登录提示和 /etc/issue 文件。 调制解调器认为所有这些都是 AT 命令,如果它确实包含任何 "at" 字符串(意外地),则很可能会对您的调制解调器配置文件产生不利影响。 回显战争可能会开始,其中 getty 和调制解调器一遍又一遍地来回发送相同的字符串。 如果发生这种情况,您可能会看到“respawning too rapidly”错误消息。 为了防止这种情况发生,您需要禁用调制解调器的所有回显和结果代码(E0 和 Q1)。 还要将 -i 选项与 agetty 一起使用,以防止发送任何 /etc/issue 文件。

如果您在调制解调器端口上启动 getty,并在几秒钟后发现您在该端口上运行的是登录进程而不是 getty,则意味着从调制解调器向 agetty 发送了虚假用户名。 为了防止这种情况发生,我必须将我的拨入配置文件保存在调制解调器中,以便它在通电时生效。 另一个保存的配置文件用于拨号连接。 然后,任何使用调制解调器的拨号连接程序都必须在其初始化字符串中使用 Z、Z0 或 Z1 来初始化调制解调器以进行拨号连接(通过加载保存的拨号连接配置文件)。 如果 1-profile 用于拨入,则使用 Z1 加载它,等等。 如果您想稍后监听拨入,则需要将调制解调器重置为拨入配置文件。 并非所有拨号连接程序都可以在退出后执行此重置。

因此,虽然如果您在调制解调器硬件中正确设置了拨入配置文件,`agetty` 可能会正常工作,但它可能更适合虚拟控制台或终端,而不是调制解调器。如果 `agetty` 正在运行以进行拨入,则没有简单的方法可以拨出。当有人首次拨入 `agetty` 时,他们应该按回车键以获取登录提示。Debian 发行版中的 agetty 只是被命名为 getty

关于 mingetty 和 fbgetty

mingetty 是一个小型 getty,仅适用于显示器(通常的控制台),因此您不能将其与调制解调器一起用于拨入。fbgetty 与上述类似,但支持帧缓冲。

12.5 为什么“手动”应答是最佳选择

当计算机恰好关机但调制解调器仍在工作时,两种应答方式之间的差异就会显现出来。对于手动情况,"RING" 消息被发送到 getty,但由于计算机已关机,getty 不在那里,电话永远不会被接听。没有应答就不会产生电话费。对于自动应答情况,调制解调器(仍然开启)会接听电话,但由于计算机已关机,永远不会发送登录消息。电话费会随着等待时间的推移而增加。如果电话是免费电话,则差别不大,尽管等待永远不会出现的登录提示可能会令人沮丧。mgetty 使用手动应答。Uugetty 也可以通过使用配置文件来实现这一点。

12.6 在等待来电时拨出

以下是简单的手动应答情况下可能出现的问题。假设另一个进程在 getty 正在监听来自其调制解调器在串行线上的 "RING" 消息时拨出。然后,用于拨出进程的传入字节从调制解调器流向串行端口。例如,当拨出进程连接时,您的调制解调器可能会向您的串行端口发送 "CONNECT" 消息。如果 getty 读取了它,就会出现问题,因为读取是破坏性读取。一旦 getty 读取了它,那么期望 "CONNECT"(或其他内容)的拨出进程就无法读取它。因此,拨出进程很可能失败。

有一种方法可以避免这种情况,以下是 mgetty 的做法。当 mgetty 正在监听来电时,它不会从端口读取任何内容,直到它认为字符是给 mgetty 的。Mgetty 监视端口,如果字符到达,它不会立即读取它们。相反,它首先检查是否有另一个进程正在使用该端口。如果是这样,mgetty 会退避并关闭端口(但端口仍然为另一个进程保持打开状态)。因此,如果另一个进程拨出,mgetty 不会干扰它。当另一个进程最终关闭端口时,mgetty 会恢复“监听”。这是一种特殊的“监听”类型,它会避免读取,直到 mgetty 相信它将要读取的内容是给 mgetty 的(希望是 "RING" 消息)。

当 mgetty 检查是否有另一个进程正在使用端口时,它实际上检查端口上是否存在有效的锁定文件。如果另一个进程未能使用锁定文件,那是它自己的问题。有关更多详细信息,请参阅 mgetty 文档:“mgetty 的工作原理”。仅供程序员参考:“监听”实际上是使用系统调用 "poll" 或 "select" 来监视端口。当非 mgetty 进程正在使用端口时,它们也可能被用来监视端口。

然后是使用 mgetty 时的调制解调器配置问题。Mgetty 在启动时首先设置此配置,并使用用户指定的 chat 脚本来完成它。因此,调制解调器现在被配置为不自动应答,而是在电话铃响时向 mgetty 发送 RING 字符串。现在假设在 mgetty 等待来电时,另一个程序拨出电话并重新配置调制解调器,使其对 mgetty 不利。为了防止这种情况,当 mgetty 检测到某些其他使用端口的程序已退出时,mgetty 也会自行退出。这会导致 mgetty 重新启动(根据 /etc/inittab 文件重新生成),然后 mgetty 重新配置调制解调器,使其全部设置为再次监听来电。

使用自动应答(mgetty 通常不使用)时,getty 正在等待 CD 升高,以便它可以打开端口。人们可以拨出,但一旦建立连接,调制解调器的 CD 就会升高。如果 getty 然后读取端口,它将吞噬掉旨在由拨出连接读取的字符。虽然 agetty 会有这个问题,但据称 uugetty 会在读取之前检查锁定文件(类似于 mgetty)。

12.7 结束拨入呼叫

有两种主要方法可以结束拨入呼叫。呼叫者可以注销或直接挂断电话。对于挂断电话的情况,请参阅呼叫者挂断电话

呼叫者注销

当呼叫结束时,结束连接的正常方式是远程用户注销。这应该会导致拨入 PC 挂断电话线,这将在稍后解释。请注意,当从 PC 注销时(不使用调制解调器时),此行为通常不会发生。在这种情况下,用户注销后会立即获得登录提示,作为再次登录的邀请。但是键入 "logout" 的远程用户会被挂断,如果他/她想再次登录,则必须重新拨号。如果用户注销时没有挂断,则连接将保持,并且不会给其他人登录的机会。

远程用户注销您的拨入 PC 将终止远程用户在您的拨入 PC 上使用的 shell。现在,由于此端口上不再运行任何程序,端口关闭并通过否定 DTR 向调制解调器发送挂断信号。只有当 stty -a 显示 hupcl(默认值)时,才会发生这种情况。hupcl = Hang UP on CLose => 当在此端口上运行的最后一个程序关闭时,断开 DTR(“挂断”信号)。但是通常,当 shell 被终止时,就像 getty 被终止一样,getty 将重新生成(因为它在 /etc/inittab 中这样设置)。这将几乎立即重新打开端口并升高 DTR。因此,DTR 被称为闪烁(仅在很短的时间内断开,然后重新声明自身)。对于现代快速计算机,这种闪烁太短以至于调制解调器无法识别,因此串行驱动程序应该使这种闪烁更长(前提是 stty 设置了 hupcl,并且...)。但在 2003 年,有人抱怨它不够长。

拨入 PC 调制解调器接收到挂断信号(否定 DTR 信号)后,将挂断电话线(前提是调制解调器已配置为执行此操作——请参阅下文)。然后,调制解调器应准备好应答任何新的来电。对于 mgetty,如果有一个 chat-script 来初始化调制解调器并可能重置调制解调器,也会发生这种情况。如果调制解调器由于 DTR 闪烁太短而没有挂断,那么新生成的 getty 可能能够挂断。mgetty 本身会在启动时创建一个较长的 DTR 闪烁以挂断调制解调器。据称,让重新生成的 getty 清理上一次呼叫留下的烂摊子(调制解调器仍然在线)不是处理此问题的正确方法。

在设置 mgetty 时,可以使用带有代码序列 +++ 的 chat-script 发送到调制解调器,以使其进入 AT 命令模式(如果 DTR 没有工作)。+++ 必须具有初始和最终的最小时间延迟。一旦进入 AT 命令模式,就可以向调制解调器发送挂断命令 (H0) 以及其他 AT 命令。您可以设置同时使用此方法和 DTR 方法,以便如果一种方法失败,另一种方法有望奏效。如果 PC 未能成功地在注销发生时向调制解调器发出信号(或在重新启动 getty 时未能使用 +++ 转义),则调制解调器很可能保持在线模式,并且无法再接收来电。据称,这可能是一个安全风险。

当 DTR 下降(被否定)时

当 DTR(否定时的“挂断”信号)下降(被否定)时,调制解调器所做的事情取决于调制解调器配置文件中 &D 选项的值。如果它是 &D0,则什么都不会发生(调制解调器忽略 DTR 的否定)。以下是当计算机断开 DTR 时发生的情况

&D2: 调制解调器将挂断并进入 AT 命令模式(离线)以等待下一次呼叫。除非它在 DTR 再次升高之前无法自动应答电话。但由于 mgetty 会自动重新生成(如果在 /etc/inittab 中这样设置),那么 mgetty 将在注销后立即重新启动,这将升高 DTR。因此,当有人注销时发生的事情是,DTR 仅在很短的时间内被否定(闪烁),然后再次升高。在此闪烁期间,DTR 必须被否定至少由寄存器 S25 指定的时间,否则调制解调器将不会挂断。

&D3: 或 S13 = 1。在这种情况下,当 DTR 下降时,调制解调器会进行硬重置:它会挂断并恢复由 &Y 指定的保存配置文件。它现在应该处于首次通电时的相同状态。但是 mgetty 可能有一个 chat 脚本,它将向调制解调器发送一个初始化字符串,从而再次更改配置文件。由于配置文件中的这两个更改几乎同时发生,这会成为问题吗(称为“竞争条件”)。

S25 限制可能无效,因此即使是非常短的 DTR“闪烁”也会被检测到。另一个品牌的调制解调器表示 S25 限制仍然有效。因此,&D3&D2 更强的“重置”,后者不会恢复保存的配置文件,并且可能需要更长的闪烁才能工作。

在有利条件下,&D3&D2 都应该可以正常工作。据报告,对于少数调制解调器,只有 &D2 可以正常工作。如果使用 &D3,这可能与上面提到的可能的竞争条件有关吗?

呼叫者挂断电话

呼叫者可能只是挂断电话(通过关闭他/她正在使用的“终端”程序等),而不是以正常方式注销。这会导致连接丢失,当然也会导致载波丢失。其他问题也可能导致载波丢失。调制解调器挂断并等待下一次呼叫。除非还没有 mgetty 运行来启动登录过程。

以下是 getty 如何再次启动的:载波丢失应否定调制解调器发送到串行端口的 CD 信号(前提是已设置 &C1)。当 PC 的串行端口获得断开的 CD 信号时,它应该终止 shell,前提是 clocal 被否定 (-clocal),然后 getty 应该重新生成。mgetty 在启动时会升高 clocal。它稍后会降低 clocal 吗?

本段是关于其他发生但无所事事的事情。只有好奇的人才需要阅读它。当 shell 被终止时,会向调制解调器发送 DTR 闪烁,但由于调制解调器不再在线,并且由于载波丢失而已经挂断,因此调制解调器会忽略 DTR 的下降。载波丢失还会否定调制解调器发送到串行端口的 DSR 信号(前提是设置了 &S1 或 &S2),但此信号被(Linux)忽略。“NO CARRIER”结果代码应由调制解调器生成,但它会发送到哪里?

12.8 拨入调制解调器配置

getty 程序具有向调制解调器发送初始化字符串以配置它的功能。但您可能需要编辑它。另一种方法是在调制解调器内部保存合适的初始化字符串(有关如何在调制解调器中保存它,请参阅初始化字符串:保存和调用)。

拨入的配置既取决于您使用的 getty,也可能取决于您的调制解调器。如果您在其他文档中找不到建议的配置,以下是一些使用 Hayes AT 命令的提示

12.9 回拨

回拨是指有人首先拨入您的调制解调器。然后,您从呼叫者那里获得一些信息,然后立即回拨。您为什么要这样做?一个原因是,如果您可以以比呼叫者呼叫您更便宜的价格呼叫呼叫者,则可以节省电话费。另一个原因是确保呼叫者确实是他/她声称的那个人。如果呼叫者呼叫您并声称是从其常用电话号码呼叫的,那么验证这一点的一种方法是实际拨打新电话到该号码。

有一个名为 "callback" 的 Linux 程序与 mgetty 一起工作。它位于 ftp://ftp.rug.nl/contrib/frank/software/linux/callback/ 有关某人如何安装它(和 PPP)的逐步说明位于 http://www.stokely.com/unix.serial.port.resources/callback.html

12.10 区分振铃

“区分振铃”是指您希望调制解调器仅应答特定类型的振铃电话,例如长、短、长、短等。要做到这一点,您首先需要一个支持区分振铃的调制解调器。例如,可以使用 AT 命令设置 Netcomm Roadster 调制解调器来执行以下操作:它将发送到 mgetty:DROF=14 DRON=4 RING DROF=4 DRON=2 RING ... 意思是初始静音为 1.4 秒 (DROF=14),然后是 .4 秒的振铃 (DRON=4) 等。每次振铃后也会报告 RING。请注意,调制解调器不能设置为应答某种类型的振铃,它只会告知监听串行端口的程序(例如 mgetty)振铃序列是什么。然后,如果程序喜欢该序列,它会向调制解调器发送 AT 命令以应答呼叫。不幸的是,mgetty 无法识别此类振铃序列,但有一种可能有效的解决方法。

Mgetty 仅等待 "RING" 并将忽略 DRON 和 DROF(区分振铃关闭)字。对于 Netcomm Roadster 调制解调器,您可以设置发送 DRON= 和 RING 之间的延迟。例如,您可以设置 2.0 秒的延迟。但是,如果在此 2.0 秒期间发生另一次实际振铃,调制解调器将取消延迟的 RING 消息,并且永远不会发送它。因此,您或许可以设置此延迟,以便您不希望调制解调器应答的呼叫永远不会向 mgetty 发送 RING 消息。但是对于您希望 mgetty 应答的呼叫,您可以使振铃之间的间隔足够长,以便 "RING" 被发送到 mgetty,并且 mgetty 应答呼叫。这种解决方法并非总是可行的,特别是如果电话公司没有给您太多区分振铃的选择。以上方法是否适用于其他支持区分振铃的调制解调器?

对于上述调制解调器,AT 命令:AT+VDR=1,24 将上述延迟设置为 2.4 秒。您可以将其放入 mgetty.config 中的 "init-chat" 参数中。

12.11 语音邮件

语音邮件就像计算机运行的答录机。要做到这一点,您必须有一个支持“语音”和支持软件的调制解调器。消息不是存储在磁带上,而是以数字格式存储在硬盘驱动器上。当有人给您打电话时,他们会听到“问候”消息,然后可以给您留言。更高级的系统将具有呼叫者可选择的邮箱和呼叫者可选择收听的消息。Linux 中有免费软件可用于简单应答,但似乎尚无适用于更高级功能的软件。

我知道 Linux 有两种不同的语音邮件软件包。一种是非常小的软件包(请参阅语音邮件软件)。另一种更高级但目前文档记录不完善的是 vgetty,它支持所有 ELSA 调制解调器和 ITU v.253 标准。它是文档记录完善且广泛分发的 mgetty 程序的可选附加组件。在 Debian 发行版中,您必须获取 mgetty-voice 软件包以及 mgetty 软件包和 mgetty-doc(文档)软件包。

12.12 简单的手动拨入

这真的是手动操作!它甚至不允许呼叫者登录,但呼叫者可以与您“聊天”等。这是一种无需费心编辑任何拨入配置文件或启用 getty 即可应答呼叫的方式。要做到这一点,您可以运行终端程序,例如 minicom。通过键入 "AT <enter>" 并期望 "OK" 来确保它已连接到您的调制解调器。然后等待呼叫。然后在电话铃响时通过键入 "ATA" 来真正手动应答呼叫。这不会运行 getty,并且呼叫者无法登录。但是,如果呼叫者使用终端程序呼入,他们可能会在您的屏幕上键入消息(反之亦然)。您都可以通过使用终端程序(例如 minicom)内置的命令来来回发送文件。应答此类呼叫的另一种方法是在呼叫到来之前键入例如 "ATS0=3" 以启用调制解调器在第三次响铃时自动应答。

这是通过 MS Windows PC 上使用 HyperTerminal 或 Terminal(适用于 Windows 3.x 或 DOS)的人粗略传输文件的一种方法。这两个 MS 程序有点像 minicom。使用这种简单的手动方法(对于 Linux 到 Linux 或 MS 到 Linux)需要两个人同时在场,一个在电话线连接的一端运行终端通信程序。请注意,如果两个人同时键入,那将是一团糟。这是在任何两个拥有 PC(Linux 或 MS Windows)的人之间传输文件的“最后手段”方法。它也可以用于测试您的调制解调器或作为设置拨入之前的初步测试。

12.13 复杂的 GUI 拨入,VNC

与上面描述的简单(但劳动密集型)手动拨入相反的极端情况是导致 Linux PC 的 GUI 图形界面的拨入。这通常需要两台计算机之间存在运行 TCP/IP 协议的网络。获得这种“网络”的一种方法是拨出到设置为拨入的 PC,然后在电话线上运行 PPP。PPP 将使用封装在 PPP 数据包内的 TCP/IP 协议。双方都必须运行 PPP,并且可以将 mgetty 配置为在呼叫者执行操作后立即启动 PPP。呼叫者可以使用 PPP 拨号程序,就像他们拨打 ISP 一样。wvdial、eznet 或 chat 脚本等程序应该可以做到这一点。

通过 ISP 可以访问比电话连接上的这个小型网络更大的网络(整个世界)。对于他们最低费率的服务,他们中的许多人使用代理服务器,这些服务器不会让您访问您需要使用的端口。即使他们不使用代理服务器,他们给您的 IP 地址也只是会话临时的,因此您需要将此 IP 通过电子邮件发送给任何想要联系您的人。如果您获得更昂贵的 ISP 服务,那么您可以避免这些问题。

从远程 PC 获得 GUI 界面的方法之一是运行 GPLed 程序:AT&T 的 Virtual Network Computer (VNC)。它有一个服务器部分,您在 Linux PC 上运行它以进行拨入,以及一个用于拨出的查看器(客户端)部分。这些实际上都不执行任何拨号或登录操作,而是假设您已经设置了网络。VNC 服务器内置了 X 服务器,并且可以使用 Linux 的 twm 窗口管理器。请参阅 Linux Magazine 上关于 VNC 的文章:http://www.linux-mag.com/2000-11/desktop_03.html。VNC 的 AT&T 站点是:http://www.uk.research.att.com/vnc/

使用 VNC,还可以连接到远程 Windows PC,在 Linux PC 上获得 Windows GUI,并在远程 Windows PC 上运行 Windows 程序。当然,Windows PC 必须运行 VNC(作为服务器)。显然,通过调制解调器的 GUI 连接将比纯文本连接慢,特别是如果您运行 KDE 或 GNOME 或想要 16 位颜色。

12.14 与 MS Windows 的互操作性

一旦您设置了拨入,其他人可以使用来自类 Unix 系统的 minicom(或类似程序)拨入您。从 MS Windows,人们可以使用“超级终端”(HyperTerminal)(或 Windows 3.1 或 DOS 中的“终端”(Terminal))呼叫您。

如果在 Windows 中想要通过电话线使用带有网络协议的拨号,则称为“拨号网络”(Dial-up Networking)。但这可能无法与 Linux 通信。要在 Windows 中设置此类拨入,一个人单击“服务器”,而拨出是“客户端”。这种拨入通常称为“远程控制”,这意味着呼叫者可以使用您的 PC,在其上运行程序,从而远程控制它。

虽然从 MS Windows 呼叫到基于文本的 Linux 系统很容易,但反过来却不容易(部分原因是 Windows 不是基于文本的,并且需要将呼叫者置于 DOS 中,在 DOS 中,文件不会像在 Linux 中那样受到保护。

但是,如果呼叫者通过电话线使用某些网络协议:MS 的或 Novel 的(Linux 不喜欢的两种协议),Windows “拨号网络”可以建立拨入。因此,如果使用 Windows 的人在 Windows 98 中启用了他们的拨号网络服务器,您就无法直接从 Linux 拨入它。这种类型的拨入不允许呼叫者像 Linux 那样在主机上运行大多数程序。它被称为“远程访问”,一个人可以传输文件、使用主机打印机、访问数据库等。有没有办法从 Linux 连接到拨号网络??

两个人可以使用 Linux 端的 Minicom 和 Windows 端的 HyperTerminal 粗略地聊天和发送文件。这一切都是由两个活生生的人手动完成的,一个在电话连接的每一端。请参阅简单的手动拨入

在另一个极端,人们希望运行拨入,以便呼叫者获得 GUI 界面。为此,通常使用网络协议。对于 Windows,可以使用 PC Anywhere,对于 Linux 和 Windows,可以使用 VNC。但是 PC Anywhere 似乎无法与 Linux 通信??用于“远程控制”的其他 Windows 程序包括 Laplink、Co-Session 和 Microcom。除了 VNC 之外,是否有任何此类程序支持 Linux??


13. 用于拨入的 Uugetty(来自旧的 Serial-HOWTO)

请注意,您可以将 mgetty 用作 uugetty 的(更好?)替代品。mgetty 比 uugetty 更新且更受欢迎。有关这 2 个 gettys 的简要比较,请参阅Getty

13.1 安装 getty_ps

由于 uugetty 是 getty_ps 的一部分,您首先必须安装 getty_ps。如果您没有它,请从 metalab.unc.edu:/pub/Linux/system/serial 获取最新版本。特别是,如果您想使用高速率(57600 和 115200 bps),您必须获取 2.0.7j 或更高版本。您还必须具有 libc 5.x 或更高版本。

默认情况下,getty_ps 将被配置为符合 Linux FSSTND(文件系统标准),这意味着二进制文件将在 /sbin 中,配置文件将被命名为 /etc/conf.{uu}getty.ttySN。这在文档中并不明显!它还将期望锁定文件进入 /var/lock。确保您有 /var/lock 目录。

如果您不想要 FSSTND 合规性,二进制文件将进入 /etc,配置文件将进入 /etc/default/{uu}getty.ttySN,锁定文件将进入 /usr/spool/uucp。如果您正在使用 UUCP,我建议以这种方式做事,因为如果您将锁定文件移动到 UUCP 没有查找它们的位置,UUCP 将会出现问题。

getty_ps 还可以使用 syslogd 来记录消息。有关设置 syslogd 的信息,请参阅 syslogd(1)syslog.conf(5) 的手册页(如果您尚未运行它)。消息以优先级 LOG_AUTH 记录,错误使用 LOG_ERR,调试使用 LOG_DEBUG。如果您不想使用 syslogd,您可以编辑 getty_ps 源文件中的 tune.h 以使用日志文件来记录消息,默认情况下为 /var/adm/getty.log

决定是否需要 FSSTND 合规性和 syslog 功能。您也可以选择两者的组合。编辑 Makefiletune.hconfig.h 以反映您的决定。然后按照软件包附带的说明进行编译和安装。

13.2 设置 uugetty

使用 uugetty,您可以使用调制解调器拨出,同时 uugetty 正在监视端口以进行登录。uugetty 执行重要的锁定文件检查。更新 /etc/gettydefs 以包含调制解调器的条目。有关您放入 /etc/gettydefs 的条目的含义的帮助,请参阅 Vern Hoxie 收集的 "serial_suite"。如何在部分中获取它,请参阅关于 getty_em。完成编辑 /etc/gettydefs 后,您可以通过执行以下操作来验证语法是否正确

linux# getty -c /etc/gettydefs

现代调制解调器

如果您有一个 9600 bps 或更快的带数据压缩的调制解调器,您可以将您的串行端口锁定到一个速度。例如

# 115200 fixed speed
F115200# B115200 CS8 # B115200 SANE -ISTRIP HUPCL #@S @L @B login: #F115200

如果您已将调制解调器设置为执行 RTS/CTS 硬件流控制,则可以将 CRTSCTS 添加到条目中

# 115200 fixed speed with hardware flow control
F115200# B115200 CS8 CRTSCTS # B115200 SANE -ISTRIP HUPCL CRTSCTS #@S @L @B login: #F115200

旧的慢速调制解调器

如果您有一个慢速调制解调器(低于 9600 bps),那么,您需要几行来尝试多种速度,而不是单速的一行。请注意,这些行通过行中最后一个“单词”(例如 #4800)相互链接。每个条目之间都需要空行。此示例中是否真的需要用于慢速调制解调器的更高调制解调器到串行端口的速度?uugetty 文档显示了它们,所以我尚未删除它们。

# Modem entries
115200# B115200 CS8 # B115200 SANE -ISTRIP HUPCL #@S @L @B login: #57600

57600# B57600 CS8 # B57600 SANE -ISTRIP HUPCL #@S @L @B login: #38400

38400# B38400 CS8 # B38400 SANE -ISTRIP HUPCL #@S @L @B login: #19200

19200# B19200 CS8 # B19200 SANE -ISTRIP HUPCL #@S @L @B login: #9600

9600# B9600 CS8 # B9600 SANE -ISTRIP HUPCL #@S @L @B login: #4800

4800# B4800 CS8 # B4800 SANE -ISTRIP HUPCL #@S @L @B login: #2400

2400# B2400 CS8 # B2400 SANE -ISTRIP HUPCL #@S @L @B login: #1200

1200# B1200 CS8 # B1200 SANE -ISTRIP HUPCL #@S @L @B login: #115200

登录标语

如果您愿意,您可以使 uugetty 在登录标语中打印有趣的内容。在 Greg 的示例中,他有系统名称、串行线路和当前 bps 速率。您可以添加其他内容

       @B    The current (evaluated at the time the @B is seen) bps rate.
       @D    The current date, in MM/DD/YY.
       @L    The serial line to which uugetty is attached.
       @S    The system name.
       @T    The current time, in HH:MM:SS (24-hour).
       @U    The number of currently signed-on users.  This is  a
             count of the number of entries in the /etc/utmp file
             that have a non-null ut_name field.
       @V    The value of VERSION, as given in the defaults file.
       To display a single '@' character, use either '\@' or '@@'.

13.3 自定义 uugetty

您可以为每个端口调整许多参数。这些参数在每个端口的单独配置文件中实现。文件 /etc/conf.uugetty 将被 uugetty所有实例使用,而 /etc/conf.uugetty.ttySN 将仅被该一个端口使用。示例默认配置文件可以在 getty_ps 源文件中找到,这些源文件随大多数 Linux 发行版一起提供。由于空间问题,此处未列出。请注意,如果您使用的是旧版本的 uugetty(早于 2.0.7e),或者未使用 FSSTND,则默认文件将是 /etc/default/uugetty.ttySN。Greg 的 /etc/conf.uugetty.ttyS3 看起来像这样

# sample uugetty configuration file for a Hayes compatible modem to allow
# incoming modem connections
#
# line to initialize
INITLINE=ttyS3
# timeout to disconnect if idle...
TIMEOUT=60
# modem initialization string...
# format: <expect> <send> ... (chat sequence)
INIT="" AT\r OK\r\n
WAITFOR=RING
CONNECT="" ATA\r CONNECT\s\A
# this line sets the time to delay before sending the login banner
DELAY=1
#DEBUG=010

将以下行添加到您的 /etc/inittab 中,以便在您的串行端口上运行 uugetty,并替换为适合您的环境的正确信息 - 运行级别(2345 或 345 等)、配置文件位置、端口、速度和默认终端类型

S3:2345:respawn:/sbin/uugetty -d /etc/default/uugetty.ttyS3 ttyS3 F115200 vt100
重启 init
linux# init q
对于您的 /etc/inittab 中的速度参数,您想要使用您的调制解调器支持的最高 bps 速率。

现在 Linux 将监视您的串行端口以进行连接。从另一台机器拨入并登录到您的 Linux 系统。

uugetty 有更多选项,有关完整说明,请参阅 uugetty)(通常简称为 getty)的手册页。在其他功能中,有一个调度功能和一个回铃功能。


14. 我的调制解调器应该使用什么速度?

通过“速度”,我们实际上指的是“数据流速”,但几乎每个人都错误地将其称为速度。对于所有现代调制解调器,您无法选择调制解调器在电话线上使用的速度,因为它会自动选择在当时情况下可行的最高速度。如果一个调制解调器比另一个调制解调器慢,那么更快的调制解调器将以较慢的调制解调器的速度运行。在噪声大的线路中,速度会进一步降低。

虽然上述速度是由调制解调器自动选择的,但您可以选择调制解调器和计算机之间将使用的速度(PC 到调制解调器速度)。这有时称为“DTE 速度”,其中“DTE”代表数据终端设备(您的计算机是 DTE。)您需要将此速度设置得足够高,以便信号路径的这部分不会成为瓶颈。DTE 速度的设置是此链路的最大速度。大多数情况下,它很可能实际上以较低的速度运行。

对于外部调制解调器,DTE 速度是您的调制解调器和 PC 之间电缆上的流量速度(以比特/秒为单位)。对于内部调制解调器,它是相同的概念,因为调制解调器也模拟串行端口。在计算机和直接连接到计算机内部更高速度总线的调制解调器卡之间进行通信时设置速度限制似乎很荒谬。但通常情况就是这样,因为调制解调器卡可能包含一个专用的串行端口,该端口确实具有速度限制(和可设置的速度)。但是,某些软件调制解调器没有此类速度限制。

14.1 速度和数据压缩

您选择什么速度?如果没有“数据压缩”,人们可能会尝试选择与调制解调器速度完全相同的 DTE 速度。数据压缩会将从您的计算机发送到调制解调器的字节编码为更少数量的字节。例如,如果从 PC 到调制解调器的流量(速度)为 20,000 字节/秒 (bps),并且压缩率为 2 比 1,那么电话线上将仅流动 10,000 字节/秒。因此,对于 2:1 的压缩率,您需要将 DTE 速度设置为电话线上最大调制解调器速度的两倍。如果压缩率为 3 比 1,则需要将其设置为 3 倍快,依此类推。

14.2 我在哪里设置速度?

此 DTE(PC 到调制解调器)速度通常由您的通信程序中的菜单设置,或者如果有人拨入,则由给 getty 命令的选项设置。您无法设置 DCE 调制解调器到调制解调器的速度,因为这是由调制解调器在与另一个调制解调器协商后自动设置为最高可行速度的。嗯,实际上您可以使用 S37 寄存器设置调制解调器到调制解调器的速度,但您不应该这样做。如果连接上的两个调制解调器以这种方式设置为不同的速度,那么它们将无法相互通信。

14.3 无法设置足够高的速度

超过 115.2kbps 的速度

自 1990 年代中期以来,115.2k 的最高速度已成为标准。但是到 2000 年,大多数新的串行端口都支持更高的速度 230.4k 和 460.8k。有些还支持 921.6k。不幸的是,由于缺少驱动程序,Linux 很少使用这些速度。因此,除非通过特殊软件启用更高的速度,否则此类端口的行为就像 115.2k 端口一样。要获得这些速度,您需要使用特殊补丁编译内核或使用模块,直到支持内置到内核的串行驱动程序中。

不幸的是,串行端口制造商从未就支持高速的标准方式达成一致,因此串行驱动程序需要支持各种硬件。一旦启用高速,选择它的标准方法是使用 setserial 将 baud_base 设置为最高速度(除非串行驱动程序为您执行此操作)。然后,该软件将使用 1 的除数来设置最高速度。所有这些有望在 2003 年的某个时候得到 Linux 内核的支持。

w83627hf 芯片(用于许多主板,如 Tyan S2460)的驱动程序位于 https://www.muru.com/linux/w83627hf/

一些制造商实现高速的非标准方法是使用非常大的除数来获得高速。这个数字根本不是真正的除数,因为它不能除任何东西。它只是作为一个代码编号来告诉硬件要使用的速度。在这种情况下,您需要使用特殊的补丁编译内核。

支持第二种类型高速硬件的一个补丁叫做 shsmod(超高速模式)。这个补丁有 Windows 和 Linux 版本。请参阅 http://www.devdrv.com/shsmod/。还有一个用于 VIA VT82C686 芯片的模块 http://www.kati.fi/viahss/。使用它可能会导致缓冲区溢出。

对于内置调制解调器,只有少数宣传它们支持内置串行端口超过 115.2k 的速度。shsmod 支持这些吗?

硬件中速度的设置方式:除数和 baud_base

速度的设置是通过改变串行端口的时钟频率来实现的。但是这种改变并不是通过实际改变驱动时钟的振荡器的频率来实现的,而是通过“除以”时钟的频率来实现的。例如,要除以二,只需忽略每个其他的时钟滴答。这会将速度减半。除以 3 会使时钟以 1/3 的频率运行,等等。因此,为了减慢时钟速度(意味着设置速度),我们只需向时钟发送一个除数。它由串行驱动程序发送到端口中的寄存器。因此,速度是通过除数设置的。

如果时钟以 115,000 bps 的最高速度运行(常见),那么以下是各种速度的除数(假设最大速度为 115,200):1 (115.2k)、2 (57.6k)、3 (38.4k)、6 (19.2k)、12 (9.6k)、24 (4.8k)、48 (2.4k)、96 (1.2k) 等。串行驱动程序通过仅向硬件发送一个“除数”(正整数)来设置硬件中的速度。这个“除数”除以硬件的“最大速度”,从而产生较慢的速度(显然,除数 1 除外,它告诉硬件以最大速度运行)。

以上情况存在例外,因为对于某些串行端口硬件,高于 115.2k 的速度是通过使用非常高的除数来设置的。在您阅读本节的其余部分时,请记住这个例外。通常,如果您指定 115.2k 的速度(在您的通信程序中或通过 stty),那么串行驱动程序会将端口硬件设置为除数 1,这将设置最高速度。

除了使用非常高的除数来设置高速之外,传统的做法如下:如果您碰巧有最大速度为 230.4k 的硬件(并且 230.4k 速度已在硬件中启用),那么指定 115.2k 将导致除数 1。对于某些硬件,这实际上会给您 230.4k。这是您设置速度的两倍。事实上,对于您设置的任何速度,实际速度都将是两倍。如果您有可以以 460.8k 运行的硬件,那么实际速度将是您设置速度的四倍。以上所有假设您不使用“setserial”来修改任何内容。

设置除数,速度计算

为了纠正这种计算(但不总是解决问题),您可以使用“setserial”将 baud_base 更改为您端口的实际最大速度,例如 230.4k。然后,如果您将速度(通过您的应用程序或通过 stty)设置为 230.4k,将使用除数 1,您将获得与您设置相同的速度。

如果您有非常旧的软件,不允许您告诉它如此高的速度(但您的硬件已启用),那么您可能需要考虑使用“spd_cust”参数。这允许您告诉应用程序速度为 38,400,但这种情况下的实际速度由“divisor”的值决定,该值也已在 setserial 中设置。我认为最好尽量避免使用这种权宜之计。

有些品牌的 UART 使用非常高的除数来设置高速。没有任何令人满意的方法可以使用“setserial”(例如设置“divisor 32770”)来获得这样的速度,因为这样 setserial 会认为速度非常低,并禁用 UART 中的 FIFO。

晶体频率高于 baud_base

请注意,baud_base 设置通常远低于晶体振荡器的频率,因为例如 1.8432 MHz 的晶体频率在硬件中被除以 16 以获得 115.2k 的实际最高速度。晶体频率需要更高的原因是,这种高晶体速度可以生成时钟滴答,以采集每个比特的多个样本,以确定它是 1 还是 0。

实际上,1.8432 MHz 的“晶体频率”可以通过将 18.432 MHz 晶体振荡器的频率除以 10 后馈送到 UART 来获得。只要 UART 正常运行,其他方案也是可能的。

14.4 速度表

对于 56k 调制解调器,最好至少有一个 16650 UART,但很少有调制解调器或串行端口提供它。第二好的选择是经过调整以提供 230,400 bps (230.4 kbps) 的 16550。大多数人仍然使用仅为 115.2 kbps 的 16550,但据称它只会使吞吐量降低几个百分点(平均而言)。这是因为典型的压缩比为 2 比 1,而对于下载压缩文件(软件包),压缩比为 1 比 1。在这些情况下,吞吐量没有下降。以下是一些建议的速度,如果您调制解调器的速度是

以上所有速度都可以使用 V.42bis 数据压缩和 V.42 纠错。如果不使用数据压缩,则可以将速度设置得更低,只要它高于调制解调器速度即可。


15. 通信程序和实用程序

虽然 PPP 用于 Internet 访问,但您还需要一个拨号程序(或脚本),该程序将拨打电话号码,然后在建立连接后启动 PPP。当对方接听电话时,会发生三件事:建立调制解调器连接 (CONNECT),在两端启动 PPP,并且您自动登录。最后 2 个事件的确切顺序可能会有所不同。用于 ppp 的拨号程序包括 wvdial、chap 脚本、kppp、RP3(wvdial 和 ifup 的前端)、gnome-ppp 和“modem lights”(Gnome)。Linuxconf 配置一些拨号程序。

还有一些较旧的拨号程序可以拨出(通过调制解调器),但不连接到 Internet。相反,您连接到某处的计算机,该计算机在您的屏幕上放置文本图像。过去,这在连接到电子公告栏时非常常用。请参阅 PC 和 BBS。今天,它可能用于连接到您可以登录的远程计算机(包括家中的 PC)。用于此目的的程序有:minicom(最受欢迎的)、Seyon(仅限 X-Windows)和 Kermit。有些人可能也使用这些程序通过 ppp 拨出以访问 Internet,但这不是它们最初设计的用途。

15.1 Minicom 与 Kermit

Minicom 只是一个通信程序,而 Kermit 既是一个通信程序,又是一个文件传输协议。但是,您可以在 Minicom 中使用 Kermit 协议(前提是您的 PC 上安装了 Kermit)。Minicom 是基于菜单的,而 Kermit 是基于命令行的(在特殊的 Kermit 提示符下进行交互)。虽然 Kermit 程序是自由软件,但文档并非全部免费。没有提供详细的手册,建议您购买一本书作为手册。但是,Kermit 具有交互式在线帮助,它会告诉所有内容,但缺乏针对初学者的教程解释。命令可以放在脚本文件中,这样您就不必每次都重新输入它们。Kermit(作为通信程序)比 Minicom 更强大。

虽然所有 Minicom 文档都是免费的,但它不如 Kermit 的文档广泛。在我看来,设置 Minicom 更容易,需要学习的东西更少,您仍然可以从 Minicom 中使用 kermit。但是,如果您想编写脚本来自动执行文件传输等操作,Kermit 更好。

g-kermit 是一个 gpled kermit,它没有拨出功能。

15.2 通信软件列表

以下是一些您可以选择的通信软件列表。如果它们没有随您的发行版一起提供,则应该可以通过 FTP 获得。我想获得关于拨出程序的比较性评论。最不受欢迎的程序是否已经过时?

最不受欢迎的拨出程序

最受欢迎的拨出程序

传真

通过使用传真程序,您可以使用大多数调制解调器发送传真。在这种情况下,您直接拨出,而不是通过 ppp 和 ISP。您还需要支付任何长途电话费。电子邮件更有效率。

语音邮件软件

拨入(使用 getty)

网络连接

其他

15.3 SLiRP 和 term

SLiRPterm 是如果您在类 Unix 机器上只有一个拨号 shell 帐户,并且想要获得等效于 PPP 帐户(或类似帐户)但没有获得授权(可能是因为您不想为此支付额外费用等)时使用的程序。SLiRP 比几乎过时的 term 更受欢迎。

要使用 SLiRP,您需要将其安装在远程计算机上的 shell 帐户中。然后您拨打该帐户,并在远程计算机上运行 SLiRP,在本地 PC 上运行 PPP。您现在拥有一个 PPP 连接,您可以通过该连接在本地 PC 上运行 Web 浏览器,例如 Netscape 等。可能会有一些问题,因为 SLiRP 不如真正的 PPP 帐户好。某些帐户可能会提供 SLiRP,因为它节省了 IP 地址(在使用 SLiRP 时,您没有 IP 地址)。

term 有点像 SLiRP,只是您需要在本地和远程计算机上都运行 term。电话线上没有 PPP,因为 term 使用自己的协议。要从您的 PC 使用 term,您需要使用 term 感知版本的 ftp 来执行 ftp 等操作。因此,使用 SLiRP 更容易,因为普通版本的 ftp 可以与 SLiRP 很好地配合使用。有一个未维护的 Term HOWTO。

15.4 MS Windows

如果您希望使用 MS Windows 的人拨入您的 Linux PC,那么如果他们使用

第三方拨出程序包括 HyperTerminal Private Edition。


16. 两个调制解调器(调制解调器倍增)

16.1 简介

通过同时使用两个调制解调器,数据流可以加倍。这需要两个调制解调器和两条电话线。有两种方法可以做到这一点。一种是“调制解调器绑定”,其中调制解调器到调制解调器连接两端的软件使配对的调制解调器像单个通道一样工作。

第二种方法称为“调制解调器组队”。连接的只有一端使用软件来建立 2 个不同的互联网连接。然后,当要下载文件时,一个调制解调器获取文件的前半部分。第二个调制解调器同时获取同一文件的后半部分,假装它正在恢复在文件中间中断的下载。Linux 中是否有任何调制解调器组队支持?

16.2 调制解调器绑定

在 Linux 中有两种方法可以做到这一点:EQL 和多链路。这些作为 Linux 内核的一部分提供(前提是在编译内核时选择了它们)。对于多链路,内核必须至少是 v.2.4。连接的两端都必须运行它们。很少(如果有的话)ISP 提供 EQL,但许多 ISP 提供多链路。

它的工作方式有点像多路复用,只是它是相反的方式。因此,它被称为反向多路复用。对于多链路情况,假设您正在发送一些数据包。第一个数据包在调制解调器 1 上发出,而第二个数据包在调制解调器 2 上发出。然后,第三个数据包跟随第一个数据包在调制解调器 1 上发出。第四个数据包在调制解调器 2 上发出,依此类推。为了保持每个调制解调器的繁忙状态,可能需要在调制解调器上发送比另一个调制解调器更多的数据包。由于 EQL 不是基于数据包的,因此它不会在数据包边界上拆分流量。

EQL

EQL 是“串行线路负载均衡”,自 1995 年以来已在 Linux 中可用。内核文档(在网络子目录中)中有一个关于它的旧 (1995) howto。不幸的是,ISP 似乎不提供 EQL。

多链路

从 2000 年的内核 2.4 开始,为多链路提供了实验性支持。编译内核时必须选择它,并且它仅适用于 PPP。


17. ISDN “调制解调器”

要使用 ISDN,您必须拥有电话公司提供的特殊 ISDN 电话线,这需要额外付费。ISDN“调制解调器”实际上是终端适配器 (TA)。与模拟调制解调器一样,有卡上的内置调制解调器和连接到串行端口的外部调制解调器。

17.1 外部 ISDN “调制解调器”

在串行端口上配置外部 ISDN 调制解调器与配置模拟调制解调器大致相同。主要区别在于初始化字符串。不幸的是,不同型号的 ISDN 调制解调器的初始化字符串是不同的。通常,一个 AT 命令用于 64k 的速度,另一个 AT 命令用于 128k 等。因此,您需要找出要使用的初始化字符串,并告诉 wvdial 等程序使用它。

17.2 内部 ISDN “调制解调器”

对其中一些卡的支持可以构建到 2.4 或 2.6 内核中,或作为模块添加。tty 端口例如是 ttyI2。内核文档有一个“isdn”子目录,其中描述了支持各种 isdn 卡的各种驱动程序。ISDN 的主要网站是 http://www.isdn4linux.de

对于配置,可以使用“isdn-config”GUI。Debian 软件包“isdnutils”可用。有一个 SuSE ISDN Howto(不是 LDP Howto),它是从德语翻译过来的 http://sol.parkland.cc.il.us/sdb/en/html/isdn.html 有一个 isdn4linux 软件包和一个新闻组:de.alt.comm.isdn4linux。许多帖子都是德语的。


18. 故障排除

18.1 我的调制解调器物理上在那里,但无法找到

错误消息也可能是“调制解调器未响应”之类的。至少有 4 个可能的原因

  1. 您的调制解调器是 winmodem,并且没有为其安装可用的驱动程序。或者调制解调器有缺陷或处于“在线数据模式”,在这种模式下它不响应。请参阅 winmodem_
  2. 您的调制解调器已禁用,因为 BIOS 和 Linux 都未能启用它。它没有 IO 地址。
  3. 您的调制解调器已启用并具有 IO 地址,但它没有分配给该地址的 ttyS 设备号(如 ttyS14),因此无法使用该调制解调器。
  4. 您的调制解调器确实分配了一个 ttyS 号(如 ttyS4),但您正在使用错误的 ttyS 号(如 ttyS2 而不是 ttyS4)。请参阅 wrong_ttySx 和/或 wvdial 和/或 minicom(测试调制解调器)

情况 1:Winmodem

对于没有驱动程序的 winmodem(或有缺陷的调制解调器),通常可以找到调制解调器所在的串行端口。但是,当 wvdial 程序(或任何程序)查询该端口时,它没有得到响应,因为 winmodem 需要驱动程序才能执行任何操作。因此,您会看到一条消息,指出未找到调制解调器。但是,很可能在启动时检测到调制解调器卡,并且它显示一条消息,暗示找到了调制解调器。因此,您被告知调制解调器已找到,但又未找到!这一切都意味着没有找到可用的调制解调器,因为找到了一个无法工作的调制解调器。当然,它可能由于其他原因而不是因为是 winmodem(或 linmodem)而无法工作,并且没有驱动程序。请参阅 基于软件的调制解调器(winmodems、linmodems)

情况 2-3

情况 2 和 3 意味着调制解调器不存在串行端口设备(例如 /dev/ttyS2)。如果您怀疑是这种情况,请参阅 找不到串行端口

情况 4:错误的 ttySx 号

如果您幸运的话,问题是情况 4。那么您只需要找到您的调制解调器所在的 ttyS。

wvdial

有一个程序可以在常用串行端口上查找调制解调器,称为“wvdialconf”。只需键入“wvdialconf <a-new-file-name>”。它将创建一个新文件作为配置文件,但除非您要使用“wvdial”进行拨号,否则您不需要此文件。请参阅 什么是 wvdialconf? 不幸的是,如果您的调制解调器处于“在线数据”模式,wvdialconf 将报告“未检测到调制解调器”。请参阅 minicom(测试调制解调器)

minicom(测试调制解调器)

另一种尝试找出某个端口上是否有调制解调器的方法是在该端口上启动“minicom”(首先为该串行端口设置 minicom 之后。您需要保存设置,然后退出 minicom 并再次启动它。然后键入“AT”,您应该看到“OK”。如果您没有看到,请尝试键入 ATQ0 V1 EI。如果您仍然没有得到 OK(并且很可能甚至没有看到您键入的 AT),那么该端口上可能没有调制解调器。这可能是由于上面的情况 1、2 或 3 造成的。

如果您键入的内容确实通过调制解调器,那么缺乏响应可能是由于调制解调器处于“在线数据”模式,在这种模式下它无法接受任何 AT 命令。您可能一直在使用调制解调器,然后突然断开连接(例如使用信号 9 终止进程)。在这种情况下,您的调制解调器没有重置为可以与 AT 命令交互的“命令模式”。“Minicom”可能会显示“您已在线。请先挂断。”(有关此 minicom 消息的另一种含义,请参阅 您已在线!请先挂断。)好吧,您有点在线,但您可能没有通过电话线连接到任何东西。Wvdial 将报告“调制解调器未响应”的相同情况。

为了解决这个问题,作为最后的手段,您可以重新启动计算机。另一种尝试解决此问题的方法是向调制解调器发送 +++,以告诉它从“在线数据模式”逃回到“命令模式”。在 +++ 序列的两侧,必须有大约 1 秒的延迟(在“保护时间”内不发送任何内容)。如果另一个进程正在使用调制解调器,则这可能不起作用,因为 +++ 序列可能会最终在它们之间或在 +++ 之后(在保护时间内)插入其他字符。具有讽刺意味的是,即使调制解调器线路空闲,键入意外的 +++ 也可能会引发控制数据包的交换(您永远看不到),这将违反所需的保护时间,从而使 +++ 无法执行您想要的操作。+++ 通常在名为“挂断字符串”的字符串中,因此如果您命令 minicom(或类似程序)挂断,它可能会起作用。另一种方法是只需退出 minicom,然后再次运行 minicom。

您在 minicom 中可能观察到的其他问题,除了对 AT 没有响应之外,还有

18.2 “调制解调器忙”

这意味着什么取决于发送它的程序。调制解调器实际上可能正在使用中(忙)。SuSE 发行版报告的另一个原因是可能存在两个串行驱动程序而不是一个。一个驱动程序内置于内核中,第二个是模块。

在 kppp 中,当尝试获取/设置串行端口“stty”参数失败时,会发送此消息。(它类似于尝试使用“stty -F /dev/ttySx”时可能获得的“输入/输出错误”)。要获得其中一些 stty 参数,驱动程序必须知道端口的真实地址。因此,驱动程序可能具有错误的地址。“setserial”命令将显示驱动程序的想法,但在这种情况下,它可能是错误的。因此,“调制解调器忙”通常意味着找不到串行端口(以及调制解调器)。

如果您有 pci 调制解调器,请使用以下命令之一:lspci -v,或 cat /proc/pci,或 dmesg 以查找调制解调器串行端口的正确地址和 irq。然后检查“setserial”是否显示相同的内容。如果不是,您需要在启动时运行一个脚本,其中包含一个 setserial 命令,该命令将告诉驱动程序正确的地址和 irq。

18.3 “您已在线!请先挂断。”(来自 minicom)

调制解调器的 CD 信号已打开。要么您实际上在线(远程调制解调器正在向您发送载波),要么您的调制解调器已设置为始终发送 CD 信号。在 minicom 中,键入 at&v 以查看是否设置了 &C 或 &C0。如果是,即使您离线,CD 也会打开,并且您会错误地收到此错误消息。解决方法是在初始化字符串中设置 &C1 或将其保存在调制解调器中。

18.4 我的 56k 调制解调器无法达到接近 56k 的速度

线路上的噪声必须非常低,才能使其以接近 56k 的速度工作。有些电话线路非常糟糕,以至于可获得的速度远低于 56k(例如 28.8k 甚至更慢)。有时,连接到同一线路的分机可能会导致问题。为了测试这一点,您可以将调制解调器直接连接到电话线进入建筑物的点,并断开该线路上所有其他设备的馈线(如果其他人可以容忍这样的测试)。

18.5 上传(下载)文件已损坏/速度慢

流控制(在您的 PC 和/或调制解调器到调制解调器之间)可能未启用。对于上传情况:如果您设置了高 DTE 速度(如 115.2k),那么从您的调制解调器到您的 PC 的流量可能工作正常,但是由于电话线路瓶颈,另一个方向的上传流量不会全部通过。这将导致许多错误和数据包的重发。因此,发送文件可能需要太长时间。在某些情况下,文件根本无法通过。

对于下载情况:如果您正在下载长期的未压缩文件或网页(并且您的调制解调器使用数据压缩),或者如果您设置了低 DTE 速度,那么由于没有流量控制,下载也可能会损坏。

18.6 对于拨入,我一直收到“inittab 的第 NNN 行无效”

确保您为您的 init 版本使用了正确的语法。在那里存在的不同 init/etc/inittab 文件中使用不同的语法。确保您为您的 getty 版本使用了正确的语法。

18.7 我一直收到:“Id "S4" respawning too fast: disabled for 5 minutes”

Id "S4" 只是一个例子。在这种情况下,请查看 /etc/inittab 中以 "S4" 开头并调用 getty 的行。这一行导致了问题。确保此行的语法正确,并且设备 (ttyS4) 存在且可以找到。如果调制解调器已否定 CD 并且 getty 打开了端口,您将收到此错误消息,因为否定 CD 会杀死 getty。然后 getty 将重新生成,但再次被杀死,等等。因此,它会一遍又一遍地重新生成(太快)。似乎如果连接到调制解调器的电缆断开或您使用了错误的串行端口,就像 CD 被否定了一样。当您的调制解调器与 getty 聊天时,所有这些都可能发生。确保您的调制解调器配置正确。查看 AT 命令 EQ

如果您使用 uugetty,请通过执行以下操作验证您的 /etc/gettydefs 语法是否正确

linux# getty -c /etc/gettydefs

uugetty 初始化失败时,也可能发生这种情况。请参阅 uugetty 仍然无法工作 部分。

18.8 拨入:当远程用户挂断电话时,getty 不会重新生成

一个可能的原因是,当有人挂断电话后 DTR 被丢弃时,您的调制解调器没有正确重置。大多数 Hayes 兼容调制解调器使用 &D3 可以正常执行此操作。但对于 USR Courier、SupraFax 和一些其他调制解调器,您必须设置 &D2(在某些情况下为 S13=1)。查看您的调制解调器手册(如果您有的话)。请参阅 结束拨入呼叫

18.9 无拨号音

它的意思正是它所说的。其他人可能正在使用同一线路上的另一部电话。如果电话线未插入调制解调器,或者电话线以某种方式断开,您也会收到此错误。尝试将真正的电话插入调制解调器使用的电话线。检查是否有拨号音。

如果由于某种原因您的调制解调器未检测到拨号音,那么您可以通过在初始化字符串中放置 X3 来强制其拨号。

18.10 无载波

这意味着来自另一个调制解调器的模拟正弦波(载波)不存在,就像它应该存在一样。如果您已经连接,则意味着连接已丢失。线路中可能存在噪声或连接不良。另一个调制解调器可能由于某些原因挂断了您的电话:也许自动登录过程没有正常工作。也许 PPP 没有正常启动。也许超过了时间限制。

如果您在连接之前收到此错误,则意味着您的调制解调器未检测到另一个调制解调器的载波。如果另一端没有正常工作的调制解调器,则可能会发生这种情况。例如,答录机可能接听了您的电话而不是调制解调器。“无载波”也将在调制解调器未能协商要使用的协议时发生。如果您有一个早期的 V.90 调制解调器,它首先尝试协商高速 X2 或 K56flex 协议,则可能会发生这种情况。这两种协议都已过时,并且当发生这种情况时,某些 ISP 服务器将断开连接(挂断电话),因为它们不了解此类协议,并且不会等待足够长的时间让呼叫调制解调器回退到 V.90。

如果您通过断开 DTR 信号或向调制解调器发送挂断信号 (ATH) 来强制调制解调器断开连接,您可能会收到此错误消息。但在这种情况下,您(或您的软件)想要断开连接,因此不应该有问题。在这种情况下,只有在数据丢失时,您才应该收到“无载波”消息。因此,对于大多数通过挂断(或通过断开 DTR)断开连接的情况,您只会收到 OK 消息。您的调制解调器拨号程序甚至可能不会向您显示该消息。

18.11 uugetty 仍然无法工作

getty_ps 附带一个 DEBUG 选项。编辑您的配置文件 /etc/conf.{uu}getty.ttySN 并添加 DEBUG=NNN。其中 NNN 是以下数字组合之一,具体取决于您要调试的内容

D_OPT   001            option settings
D_DEF   002            defaults file processing
D_UTMP  004            utmp/wtmp processing
D_INIT  010            line initialization (INIT)
D_GTAB  020            gettytab file processing
D_RUN   040            other runtime diagnostics
D_RB    100            ringback debugging
D_LOCK  200            uugetty lockfile processing
D_SCH   400            schedule processing
D_ALL   777            everything
设置 DEBUG=010 是一个好的开始。

如果您正在运行 syslogd,调试信息将出现在您的日志文件中。如果您没有运行 syslogd,信息将出现在 /tmp/getty:ttySN 中以进行 getty 调试,在 /tmp/uugetty:ttySN 中以进行 uugetty 调试,并在 /var/adm/getty.log 中。查看调试信息,看看发生了什么。最有可能的是,您需要调整配置文件中的某些参数,并重新配置您的调制解调器。

您也可以尝试 mgetty。有些人使用它更幸运。

18.12 (以下小节在串行和调制解调器 HOWTO 中都有)

18.13 找不到串行端口

有 3 种可能性

  1. 您的端口已禁用,因为 BIOS 和 Linux 都未能启用它。它没有 IO 地址。
  2. 您的端口已启用并具有 IO 地址,但它没有分配给该地址的 ttyS 设备号(如 ttyS14),因此无法使用该端口。作为最后的手段,您可能需要使用“setserial”为其分配一个 ttyS 号。
  3. 你的端口确实分配了一个 ttyS 编号(例如 ttyS14),但你不知道它是哪个物理连接器(在你的 PC 背面)。请参阅 Serial_HOWTO:“我的 PC 背面的哪个连接器是 ttyS1 等?”。但是,如果你想找到调制解调器所在的 ttyS 端口,请参阅 我的调制解调器在那里但找不到

首先检查启动时的 BIOS 消息(以及可能的 BIOS 菜单中的串行端口)。然后对于 PCI 总线类型,使用 lspci -v。如果这显示类似“LPC Bridge”的内容,那么你的端口很可能在 LPC 总线上,Linux 尚不支持 LPC 总线(但 BIOS 可能会找到它)?? 如果它是 ISA 总线 PnP 串行端口,请尝试 “pnpdump --dumpregs” 和/或参阅 Plug-and-Play-HOWTO。如果端口碰巧已启用,那么以下两个段落可能会帮助找到 IO 端口

扫描/探测传统端口

这主要用于传统非 PCI 端口和非即插即用 (Plug-and-Play) 的 ISA 端口。

使用 “scanport”(仅限 Debian ??)将扫描所有启用的总线端口,并且可能会发现一个未知的端口,该端口可能是串行端口(但它不探测端口)。它可能会使你的 PC 挂起。如果你怀疑你的端口可能位于某个地址,你可以尝试使用 setserial 手动探测,但如果你有多个地址要探测,这是一个缓慢而乏味的任务。请参阅 探测

18.14 Linux 创建中断冲突(你的 PC 有 ISA 插槽)

如果你的 PC 有处理 ISA(以及可能的 PCI)的 BIOS,那么如果你发现 IRQ 冲突,可能是由于空闲 IRQ 短缺。BIOS 通常维护一个保留 IRQ 列表,为传统 ISA 卡保留。如果保留了太多 IRQ,BIOS 可能无法找到空闲 IRQ,并将错误地为串行端口分配一个创建冲突的 IRQ。因此,请检查以查看是否真的需要所有保留的 IRQ,如果不需要,则取消保留串行端口可以使用的 IRQ。有关更多详细信息,请参阅 Plug-and-Play-HOWTO。

18.15 极慢:文本在长时间延迟后才缓慢出现在屏幕上

这很可能是错误设置/冲突的中断。以下是一些症状,这些症状会在你第一次尝试使用调制解调器、终端或串行打印机时发生。在某些情况下,你输入了一些内容,但屏幕上没有任何显示,直到几秒钟之后。可能只显示最后一个输入的字符。它可能只是一个不可见的 <return> 字符,因此你只会注意到光标向下跳了一行。在其他应该在屏幕上显示大量数据的情况下,只会出现大约 16 个字符的批次。然后会有几秒钟的长时间等待,等待下一批字符。你可能还会收到 “input overrun” 错误消息(或在日志中找到它们)。

有关症状以及为什么会发生这种情况的更多详细信息,请参阅 Serial-HOWTO 部分:“中断问题详情”。

如果涉及即插即用设备,另请参阅 Plug-and-Play-HOWTO。

作为快速检查以查看它是否真的是中断问题,请使用 “setserial” 将 IRQ 设置为 0。这将告诉驱动程序使用轮询而不是中断。如果这似乎解决了 “慢” 问题,那么你遇到了中断问题。你仍然应该尝试解决该问题,因为轮询会过度使用计算机资源。

检查以找到中断冲突可能不容易,因为据推测 Linux 不允许任何中断冲突,并且如果你认为你正在尝试创建冲突,它会向你发送 /dev/ttyS?: 设备或资源忙 错误消息。但是,如果 “setserial” 告诉内核不正确的信息,则可能会创建真正的冲突。内核被欺骗了,因此不认为存在任何冲突。因此,使用 “setserial” 不会显示冲突(查看 /proc/interrupts 也不会,因为它基于 “setserial” 的信息)。你仍然需要知道 “setserial” 认为是什么,以便在你确定硬件中实际设置的内容时,你可以查明它的错误之处并更改它。

你需要做的是检查硬件是如何设置的,方法是检查跳线或使用 PnP 软件来检查硬件的实际设置方式。对于 PnP,运行 “pnpdump --dumpregs”(如果是 ISA 总线)或运行 “lspci”(如果是 PCI 总线)。将此与 Linux(例如 “setserial”)认为硬件的设置方式进行比较。

18.16 有点慢:我期望它快几倍

一个明显的原因是波特率设置得太慢。据称,这曾经发生在尝试将波特率设置为高于硬件支持的速度(例如 230400)时。

另一个原因可能是串行端口上的任何东西(例如调制解调器、终端、打印机)的工作速度不如你想象的那么快。56k 调制解调器很少以 56k 的速度工作,而且互联网经常出现拥塞和瓶颈,导致速度减慢。如果另一端的调制解调器没有到电话线的数字连接(并使用大多数计算机商店不出售的特殊 “数字调制解调器”),那么高于 33.6k 的速度是不可能的。

另一个可能的原因是你有一个过时的串行端口:UART 8250、16450 或早期的 16550(或串行驱动程序认为你有)。请参阅 Serial-HOWTO 中的 “什么是 UART”。

使用 “setserial -g /dev/ttyS*”。如果它显示的任何内容都低于 16550A,这可能是你的问题。如果你认为 “setserial” 搞错了,请检查一下。请参阅 什么是 Setserial 以获取更多信息。如果你真的有一个过时的串行端口,向 setserial 谎报只会使情况更糟。

18.17 启动屏幕显示串行端口的错误 IRQ

对于非 PnP 端口,Linux 在启动时不进行任何 IRQ 检测。当串行模块加载时,它只进行串行设备检测。因此,请忽略它关于 IRQ 的说法,因为它只是假设标准 IRQ。这样做是因为 IRQ 检测不可靠,并且可能会被愚弄。但是,如果 setserial 从启动脚本运行,它会更改 IRQ,并在启动屏幕上显示新的(并且希望是正确的)状态。如果错误的 IRQ 没有在屏幕上的后续显示中得到纠正,那么你就遇到了问题。

所以,即使我将我的 ttyS2 设置为 IRQ 5,我仍然看到

ttyS02 at 0x03e8 (irq = 4) is a 16550A
在 Linux 启动时首先看到。(较旧的内核可能会将 “ttyS02” 显示为 “tty02”,这与 ttyS2 相同)。你可能需要使用 setserial 来告诉 Linux 你正在使用的 IRQ。

18.18 “无法打开 /dev/ttyS?: 设备或资源忙

请参阅 /dev/tty? 设备或资源忙

18.19 “无法打开 /dev/ttyS?: 权限被拒绝”

使用 “ls -l /dev/ttyS?” 检查此端口上的文件权限。如果你拥有 ttyS?,那么你需要读写权限:crw,其中 c(字符设备)在第 1 列中。如果你不拥有它,那么如果它在第 8 和 9 列中显示 rw-,它将对你有效,这意味着每个人都对其具有读写权限。使用 “chmod” 更改权限。还有更复杂(和安全)的方式来获得访问权限,例如属于具有组权限的 “组”。某些程序在运行时会更改权限,但在程序正常存在时会恢复权限。但是,如果有人拔掉你的 PC 插头,那是非正常退出,正确的权限可能无法恢复。

18.20 “无法打开 /dev/ttyS?”

除非为 clocal 设置了 stty,否则可能需要断言 CD 引脚才能打开串行端口。如果物理端口未连接到任何东西,或者如果它连接到未通电的东西(例如外部调制解调器),那么该设备上将没有来自 CD 的电压。因此出现 “无法打开” 消息。设置 clocal 或将串行端口连接器连接到某些东西并为其供电。

即使设备已通电并连接到端口,有时也可能会阻止打开端口。这方面的一个例子是设备已否定 CD,并且你的 PC 上的 CD 引脚已被否定(负电压)。

18.21 “设备不支持的操作” 用于 ttyS?

这意味着 setserial、stty 等请求的操作无法完成,因为内核不支持这样做。以前,这通常是由于未加载 “serial” 模块造成的。但是随着 PnP 的出现,它可能很可能意味着在驱动程序(和 setserial)认为它所在的地址上没有调制解调器(或其他串行设备)。如果那里没有调制解调器,那么发送到该地址的命令(用于操作)显然不会完成。请参阅 我的串行端口硬件中设置了什么?

如果未加载 “serial” 模块,但 “lsmod” 显示你现在已加载它,则可能是现在已加载它,但在你收到错误消息时未加载。在许多情况下,模块会在需要时自动加载(如果可以找到它)。要强制加载 “serial” 模块,可以将其列在文件中:/etc/modules.conf 或 /etc/modules。实际模块应位于:/lib/modules/.../misc/serial.o。

18.22 “无法创建锁文件。抱歉”

有时,当无法创建锁文件时,你会收到错误消息:“... 设备或资源忙” 而不是上面的消息。当程序 “打开” 端口时,会在 /var/lock/ 中创建一个锁文件。锁定目录的错误权限将不允许在那里创建锁文件。使用 “ls -ld /var/lock” 查看权限是否正常。为 root 所有者和组提供 rwx 权限应该可以工作,前提是需要拨号的用户属于该组。其他人应该具有 r-x 权限。即使使用此方案,也可能存在安全风险。使用 “chmod” 更改权限,使用 “chgrp” 更改组。当然,如果没有 “lock” 目录,则无法在那里创建锁文件。有关锁文件的更多信息,请参阅 Serial-HOWTO 子部分:“什么是锁文件”。

18.23 “设备 /dev/ttyS? 已锁定。”

这意味着其他人(或其他进程)据称正在使用串行端口。有多种方法可以尝试找出哪个进程正在 “使用” 它。一种方法是查看锁文件 (/var/lock/LCK...) 的内容。它应该是进程 ID。如果进程 ID 例如是 100,则键入 “ps 100” 以找出它是什么。然后,如果不再需要该进程,可以通过 “kill 100” 优雅地终止它。如果它拒绝被终止,请使用 “kill -9 100” 强制终止它,但这样锁文件将不会被删除,你需要手动删除它。当然,如果没有进程 100,那么你可以直接删除锁文件,但在大多数情况下,如果锁文件包含过时的进程 ID(例如 100),则应该会自动删除锁文件。

18.24 “/dev/tty? 设备或资源忙”

这意味着你尝试访问(或使用)的设备据称正忙(正在使用),或者它需要的资源(例如 IRQ)据称正在被另一个设备使用并且无法共享。如果它仅表示设备正忙(正在使用),则此消息很容易理解。但有时这意味着所需的资源已在使用中(忙)。更令人困惑的是,在某些情况下,设备及其需要的资源实际上都不是 “忙”。

在过去,如果 PC 通过直接关闭电源而关机,则可能会留下一个虚假的锁文件,然后在稍后会收到此虚假消息,并且无法使用串行端口。今天的软件应该会自动删除此类虚假锁文件,但截至 2006 年,与 “wvdial” 拨号程序相关的锁文件仍然存在问题。如果 wvdial 由于在 /var/lock/ 目录中没有写权限而无法创建锁文件,你将看到此错误消息。请参阅 无法创建锁文件。抱歉

以下示例是无法共享中断的情况(至少其中一个中断在 ISA 总线上)。“资源忙” 部分通常意味着(ttyS2 的示例)“你无法使用 ttyS2,因为另一个设备正在使用 ttyS2 的中断。” 潜在的中断冲突是从 “setserial” 认为的内容推断出来的。更准确的错误消息是 “无法使用 ttyS2,因为 setserial 数据(和内核数据)表明另一个设备正在使用 ttyS2 的中断”。如果两个设备使用相同的 IRQ,并且你只启动其中一个设备,则一切正常,因为尚无冲突。但是,当你接下来尝试启动第二个设备(而不退出第一个设备)时,你会收到 “... 忙” 错误消息。这是因为内核仅跟踪实际使用的 IRQ,并且除非设备正在使用中(已打开),否则不会发生实际冲突。I/O 地址(例如 0x3f8)冲突的情况类似。

此错误有时是由于有两个串行驱动程序造成的:一个模块,另一个编译到内核中。两个驱动程序都尝试抢占相同的资源,并且一个驱动程序发现它们 “忙”。

当你看到此消息时,有两种可能的情况

  1. 可能存在正在避免的真正资源冲突。
  2. Setserial 搞错了,ttyS2 无法使用的唯一原因是 setserial 错误地预测了冲突。

你需要做的是找到 setserial 认为 ttyS2 正在使用的中断。查看 /proc/tty/driver/serial。你也应该能够使用 ttyS2 的 “setserial” 命令找到它。

旧版本中的错误:在 2001 年之前,存在一个错误,该错误不允许你使用 “setserial” 查看它。尝试查看它会给出相同的 “... 忙” 错误消息。

要尝试解决此问题,请重新启动或:退出或优雅地终止所有可能的冲突进程。如果你重新启动:1. 观察启动时串行端口的消息。2. 希望在启动时运行 “setserial” 的文件不会(本身)再次创建相同的冲突。

如果你认为你知道 IRQ(例如 ttyS2)正在使用,那么你可以查看 /proc/interrupts 以查找当前还有什么(除了另一个串行端口)正在使用此 IRQ。你可能还想仔细检查此处(和 “setserial”)显示的任何可疑 IRQ 是否正确(与硬件中设置的相同)。测试它是否是潜在中断冲突的一种方法是使用 “setserial” 将 IRQ 设置为 0(轮询)。然后,如果忙消息消失,则很可能是潜在的中断冲突。永久将其设置为 0 不是一个好主意,因为它会给 CPU 带来更多负载。

18.25 来自 setserial、stty、pppd 等的 “Input/output error”

这意味着与串行端口的通信无法正常工作。这可能意味着在 setserial 认为你的端口所在的 IO 地址上没有任何串行端口。这也可能是中断冲突(或 IO 地址冲突)。这也可能意味着串行端口正在使用中(忙或已打开),因此 setserial 或 stty 尝试获取/设置参数失败。如果你在串行端口名称中输入错误(例如输入 “ttys” 而不是 “ttyS”),也会发生这种情况。

18.26 “LSR safety check engaged”

LSR 是硬件寄存器的名称。它通常意味着在驱动程序认为你的串行端口所在的地址上没有串行端口。你需要找到你的串行端口并可能对其进行配置。请参阅 定位串行端口:IO 地址 IRQ 和/或 什么是 Setserial

18.27 串行端口上的溢出错误

这是硬件 FIFO 缓冲区的溢出,你无法增加其大小。错误说明(2002 年报告):由于某些内核 2.4 版本中的错误,端口号可能会丢失,你只会看到 “ttyS”(没有端口号)。但是,如果正在使用诸如 “tts/2” 之类的 devfs 表示法,则没有错误。请参阅 Serial-HOWTO 中的 “更高的串行吞吐量”。

18.28 调制解调器不接听来电

本段适用于调制解调器同时用于拨入和拨出的情况。如果调制解调器生成 DCD (=CD) 信号,则某些程序(但不是 mgetty)会认为调制解调器正忙。当你想使用调制解调器拨出,并且调制解调器的 DCD 或 DTR 未正确实施时,这将导致问题。调制解调器应仅在存在实际连接时(即有人已拨入)才断言 DCD,而不是在 getty 监视端口时。检查以确保你的调制解调器配置为仅在存在连接时才断言 DCD (&C1)。每当有程序(如 gettykermit 或其他通信程序)正在使用或监视线路时,通信程序都应打开(断言)DTR。

18.29 端口仅零星地接收字符

端口上可能正在运行其他程序。使用 “top”(前提是你已将其设置为显示端口号)或键入 “ps -alxw”。查看结果以查看端口是否正在被另一个程序使用。注意 gpm 鼠标程序,它通常在串行端口上运行。

18.30 故障排除工具

以下是你可能想要在故障排除中使用的一些程序


19. Flash 升级

许多调制解调器可以通过使用从 Internet 获取的升级程序重新编程其闪存来升级。通过经由串行端口从 PC 向调制解调器发送此 “程序”,调制解调器会将此程序存储在其非易失性存储器中(即使电源关闭,它仍然存在)。关于安装它的说明通常是如何在 Windows 下执行的,因此你需要弄清楚如何在 Linux 下执行等效操作(除非你想在 Windows 下安装升级)。将程序发送到调制解调器通常称为下载。

如果本 HOWTO 的最新版本仍然包含此请求(请参阅 本 HOWTO 的新版本),请将你安装此类升级的经验发送给我,这将对其他人有所帮助。

以下是进行升级的一般思路。首先,可能需要向调制解调器发送一个命令,告诉它接下来的是闪存 ROM 升级。在一种情况下,这是 AT** 你可以通过启动通信程序(例如 minicom)并键入来执行此操作。首先键入 AT <enter> 以查看你的调制解调器是否在那里并回答 “OK”。

接下来,你需要将一个文件(有时是两个文件)直接发送到调制解调器。通信程序(例如 minicom)通常使用 zmodem 或 kermit 将文件发送到调制解调器(及更远的地方),但这些程序将文件放入数据包中,这些数据包附加了标头,而你想要将精确的文件发送到调制解调器,而不是修改后的文件。但是 kermit 通信程序有一个 “transmit” 命令,它将直接发送文件(不使用 kermit 数据包),因此这是直接发送文件的一种方法。Minicom 在 1998 年没有此功能。

发送文件的另一种方法是从通信程序转义到 shell(在 minicom 中,这是 ^AJ),然后:cat upgrade_file_name > /dev/ttyS4 (如果你的串行端口是 ttyS4)。然后返回到通信程序(在 minicom 的命令行提示符下键入 fg)以查看发生了什么。

以下是某个 Rockwell 调制解调器的会话示例 (C-a 是 ^A)

- Run minicom
- Type AT** : see "Download initiated ..."
- C-a J
- cat FLASH.S37 > /dev/modem
- fg : see "Download flash code ..."
- C-a J
- cat 283P1722.S37 > /dev/modem
- fg : see "Device successfully programmed"


20. 其他信息来源

20.1 杂项

20.2 书籍

我一直找不到关于调制解调器的好的最新书籍。

20.3 HOWTOs

20.4 Usenet 新闻组

20.5 Internet 上的旧调制解调器数据库

Rob Clark 有一个庞大的调制解调器数据库,但自 2003 年以来似乎没有维护。网站 URL 已更改多次。现在(2006 年中期),似乎只有这两个镜像工作

调制解调器列表镜像 1
调制解调器列表镜像 2

20.6 其他网站


21. 附录 A:模拟调制解调器的工作原理(技术)(未完成)

21.1 调制细节

调制简介

此部分描述了用于传统模拟调制解调器的调制方法。另外两种类型的调制解调器,有线电视和 ADSL,使用相同的调制方法,但情况更复杂,因为它们将其频谱划分为多个通道等。有线电视调制解调器必须共享许多其他人使用的电缆。本 HOWTO 未解释有线电视和 ADSL 调制解调器的这种额外复杂性。

调制是将二进制二进制(0 或 1)表示的数字信号转换为类似于正弦波的模拟信号。调制信号由纯正弦波 “载波” 信号组成,该信号经过修改以传达信息。频率和电压不变的纯载波正弦波根本不提供信息流(除了存在载波之外)。为了使其传达信息,我们修改(或调制)此载波。调制有 3 种基本类型:频率、幅度和相位。接下来将对其进行解释。

频率调制

最简单的调制方法是频率调制。频率以每秒周期数(正弦波)来衡量。它是正弦波形状在一秒内重复自身的次数的计数。这与它在一秒内达到峰值的次数相同。“赫兹”(缩写为 Hz)用于表示 “每秒周期数”。

频率调制的一个简单示例是,一个频率表示二进制 0,另一个频率表示 1。例如,对于某些过时的 300 波特调制解调器,1070 Hz 表示二进制 0,而 1270 Hz 表示二进制 1。这被称为 “频移键控”。可以使用两种以上的可能频率,以允许传输更多信息。如果我们有 4 个不同的频率(称它们为 A、B、C 和 D),那么每个频率可以代表一对位。例如,要发送 00,将使用频率 A。要发送 01,请使用频率 B;对于 10,请使用 C;对于 11,请使用 D。同样,通过使用 8 个不同的频率,我们可以通过频率的每次变化发送 3 位。每次我们将可能的频率数量加倍,我们都会将其可以表示的位数增加 1。

幅度调制

一旦理解了上面的频率调制示例,包括通过频率的单次变化来表示几位的可能性,就更容易理解幅度调制和相位调制。对于幅度调制,只需更改正弦波的高度(电压),类似于更改正弦波的频率。对于简单情况,可能只有 2 个允许的幅度级别,一个代表 0 位,另一个代表 1 位。正如频率调制的情况所解释的那样,具有更多可能的幅度将导致每次幅度变化传输更多信息。

相位调制

要在某个时刻更改正弦波的相位,我们停止发送旧的正弦波,并立即开始发送具有相同频率和幅度的新正弦波。如果我们以与停止发送旧正弦波时存在的电压电平(和斜率)相同的电压电平开始发送新的正弦波,则相位不会发生变化(并且根本没有可检测到的变化)。但是,假设我们在正弦波曲线上的不同点启动了新的正弦波。那么在旧正弦波停止而新正弦波开始的时间点可能会出现突然的电压跳变。这是相移,以度 (deg.) 为单位测量。0 度(或 360 度)相移意味着根本没有变化,而 180 度相移只是反转了正弦波的电压(和斜率)。换句话说,180 度相移只是在过渡点跳过半个周期(180 度)。当然,我们可以只跳过例如 90 度或 135 度等。与频率调制示例一样,可能的相移越多,单次相移可以表示的位数就越多。

组合调制

我们可以选择组合调制方法,而不是仅选择频率、幅度或相位调制。假设我们有 256 个可能的频率,因此可以为频率的每次变化发送一个字节(8 位)(因为 2 的 8 次方是 256)。还假设我们有另外 256 个不同的幅度,以便幅度的每次变化都代表一个字节。还假设有 256 个可能的相移。然后在某个时间点,我们可以对所有 3 个方面进行变化:频率、幅度和相位。这将为每次此类转换发送 3 个字节。

当今使用的调制方法实际上没有一种是这样做的。这不切实际,因为检测所有 3 种类型的变化需要相对较长的时间。主要问题是,频繁的相位偏移会让人觉得发生了频率偏移,但实际上并没有。

为了避免这个困难,可以同时只改变相位和幅度(频率不变)。这被称为相位-幅度调制。它也被称为正交幅度调制 (= QAM),因为在早期版本中只有 4 种可能的相位(正交)。这种方法今天用于常见的调制解调器速度 14.4k、28.8k 和 33.6k。今天唯一不使用这种调制方法的显著情况是 56k 调制解调器。但即使 56k 调制解调器也完全使用 QAM(相位-幅度调制),从您的 PC 到电话线的方向。有时,即使是另一个方向,当线路条件不够好时,也会退回到 QAM。因此,QAM(相位-幅度调制)仍然是普通电话线上最广泛使用的方法。

21.2 56k 调制解调器 (V.90, V.92)

用于 33.6k 以上速度的“调制”方法与 33.6k 及以下速度常用的相位-幅度调制完全不同。由于普通电话呼叫在电话公司的本地局被转换为数字信号,因此您可以通过普通电话呼叫发送数字数据的最快速度与电话公司在其网络数字部分(用于电话呼叫)使用的速度相同。这个速度是多少?嗯,它接近 64kbps。有时是 64k,有时更少,如果比特被“盗用”用于信令目的。如果电话公司知道链路不是用于语音,则比特可能不会被盗用。将介绍 64k 的情况,然后将解释为什么实际速度较低(56k 或更低——通常明显更低)。

因此,64k 是使用旨在发送人类语音数字编码的电路数字部分的普通电话呼叫可能达到的绝对最高速度(不包括日期压缩)。为了使用 64k,调制解调器需要直接访问电路的数字部分,或者能够确定生成接收到的模拟信号的确切数字信号(反之亦然)。如果电话呼叫的两端都只有与电话公司的模拟接口,则此任务非常容易出错。但是,如果一端具有数字接口,则这是可能的(对于 V.90 为单向,对于 V.92 为双向)。因此,如果您的 ISP 具有与电话公司的数字接口,则 ISP 可能会通过电话线向您的 PC 发送特定的数字信号。来自 ISP 的数字信号在您 PC 位置附近的本地电话局(可能在您家附近)转换为模拟信号。然后,您的调制解调器的任务是尝试弄清楚该数字信号到底是什么。如果它可以做到这一点,那么在这个方向上以 64k(电话公司数字信号的速度)进行传输是可能的。

电话公司使用什么方法来对模拟信号进行数字编码?它使用一种以每秒 8000 个采样的速率对模拟信号的幅度进行采样的方法。每个采样幅度被编码为一个 8 位字节。(注意:8 x 8000 = 64k)这被称为“脉冲编码调制”= PCM。然后,这些字节在电话公司的数字电路上以数字方式发送,其中许多呼叫使用一种称为“时分复用”的时分方案共享单个电路。最后,在您家附近的本地电话局,数字信号被解复用,从而产生与 PCM 最初创建的数字信号相同的信号。然后,此信号被转换回模拟信号并发送到您的家中。这种模数转换(反之亦然)由电话公司硬件完成,称为“编解码器”(编码器/解码器)。每个 PCM 8 位字节都会产生一定幅度的模拟信号。您的调制解调器的任务是根据其检测到的模拟幅度来确定该 PCM 8 位字节到底是什么。

这最初被称为“模数转换”。现在通常被称为“PCM”-某物(例如 PCM 调制),因为它就像编码/解码 PCM 一样,但增加了在编解码器从数字 PCM 代码生成模拟电压的精确时间进行采样的问题。

为了确定电话公司用于创建模拟信号的数字代码,调制解调器必须在电话公司创建模拟信号时完全相同的时间点对该模拟信号幅度进行采样。为此,借助模拟电话线上的残余 4kHz 信号生成 8kHz 时钟定时信号。以 8k 幅度/秒的速度创建要发送到您家/办公室的幅度,在某种程度上会创建 4kHz 信号。假设每隔一个幅度都是相反的极性。那么就会产生一个 4kHz 的类正弦波。每个幅度在某种意义上都是一个 8 位符号,何时对幅度进行采样被称为“符号定时”。调制解调器的任务是确保其 8kHz 时钟以精确地两倍于 4kHz 信号的速度运行(该信号可能会略微偏离 4kHz),并且调制解调器的时钟与电话公司编解码器使用的时钟同步。实际的电子设备可能会使用更高的频率时钟(对其进行分频)并进行多次采样。如果您知道这种同步是如何工作的,请告诉我(如果这是最新的调制解调器 HOWTO)。

现在,PCM 中幅度的编码是非线性的。在低幅度下,PCM 字节值中 1 的增量表示模拟信号幅度中的增量(增量)远小于采样幅度高得多时的情况。因此,对于低幅度,很难区分相邻的字节值。为了更容易做到这一点(对于 56k 调制解调器),不使用某些表示非常低幅度的 PCM 代码。这在可能的幅度之间提供了更大的增量,并使您的调制解调器更容易正确检测到它们。因此,V.90 或 V.92(在下游方向)不使用一半的幅度级别。这相当于每个符号(有效幅度级别)代表 7 位而不是 8 位。这就是 56k 的由来:7 位/符号 x 8k 符号/秒 = 56k bps。当然,每个幅度符号实际上是由 8 位生成的,但 ISP 发送方实际上只使用了 256 个字节中可能的 128 个字节。有一个代码表将这 128 个 8 位字节映射到 128 个 7 位字节。它不仅仅是一个简单的映射,例如忽略最后一位。因此,发送 7 个正常的(8 位)数据字节将需要上述 8 个字节。

但这比这稍微复杂一些。如果线路条件不是接近完美,或者方向是上游(仅限 V.92),那么即使使用更少的可能级别(符号),也会导致速度低于 56k。此外,由于美国政府禁止电话线上的高功率电平的规定,某些高幅度电平无法使用,导致“56k”调制解调器在下游方向上最多只能达到约 53.3k。

请注意,电话网络的数字部分是双向的。电话呼叫使用两个这样的电路,每个方向一个。对于 V.90,56k 信号仅用于其中一个方向:从您的 ISP 到您的 PC(称为“下游”方向)。对于此 V.90,另一个方向(上游,从您的家庭/办公室到 ISP)使用传统的相位-幅度调制方案,最大速度为 36.6kbps(而不是 53.3kbps)。对于 V.92,此上游方向也使用 PCM 方法,并支持高达 48 kbps 的速度。从您的家庭/办公室到最近的电话公司办公室的模拟电路部分从未打算成为双向的,因为它只是一对双绞线。但是,由于复杂的消除方法,它能够同时在两个方向上传输数据,如下一小节所述。据称,使用 V.92,几乎不可能在两个方向上同时获得最大吞吐量,因为单电路上的双向流动存在困难。

21.3 单电路上的全双工

现代调制解调器能够同时发送和接收信号。人们可以将此称为“双向”或“全双工”。这曾经是通过使用一个频率进行发送,另一个频率进行接收来完成的。今天,发送和接收都使用相同的频率。这如何工作不容易理解。

大多数电话系统“主线”都是数字的,当您拨打电话时使用两个通道。您说的话通过一个数字通道传输,而对方说的话通过另一个(反向)数字通道传输。不幸的是,电话系统中通往家庭(和许多办公室)的部分不是数字的,而只是一个模拟通道。如果两个调制解调器直接连接到电话系统的数字部分,那么双向通信(同时发送和接收)将没有问题,因为将有两个通道可用。

但是信号路径的末端部分仅通过一个电路。如何在上面同时进行双向通信?它的工作原理有点像这样。假设您的调制解调器正在接收来自另一个调制解调器的信号,并且没有传输。那么就没有问题。但是,如果您的调制解调器开始传输(同时另一个接收到的信号仍在流入您的调制解调器),它将淹没接收到的信号。如果发送的信号是应用于线路末端的“实心”电压波,那么在这一点上就不可能存在任何接收到的信号。

但是发射器具有“内部阻抗”,并且应用于线路末端的发送信号不足以完全消除来自另一端的接收信号。因此,虽然线路末端的电压主要是较强的发送信号,但其中一小部分是所需的接收信号。所需要的只是滤除这种较强的发送信号,然后剩下的就是我们想要的来自另一端的信号。为此,只需要直接从发射器获得纯发送信号(在将其应用于线路之前),将它放大一定量,然后从线路末端存在的总信号中减去它。在接收器电路中执行此操作会留下一个主要来自线路另一端的信号。

21.4 回声消除

沿一个方向在线路上传播的模拟信号可能会遇到线路中的变化,这将导致部分信号以相反方向回声。由于同一电路用于数据的双向流动,因此此类回声将导致接收失真。缓解此问题的一种方法是偶尔发送训练信号,以确定线路的回声特性。这将使人们能够预测任何给定信号将产生的回声。然后,此预测方法用于预测发送信号将引起的回声。然后,从接收到的信号中减去此预测的回声信号。这消除了回声。


22. 附录 B:模拟语音在非语音调制解调器上不可行

有时人们会寻找软件,使其能够在不支持语音的调制解调器上传输普通模拟语音。它不存在,因为这样做并不可行。当然,可以使用 VOIP 通过调制解调器发送数字语音。当一个人拨打电话并且另一方接听电话时,人们可能会听到几秒钟的语音,直到连接协商开始。

但是一旦调制解调器连接,通过它发送模拟语音就不可行了。对于相位-幅度调制,使用固定值的载波频率,这不允许模拟语音中所需的连续可变频率。V.90 和 V.92 可能是可行的,但如果线路条件恶化,它们会退回到相位-幅度调制,这将无法工作。此外,V.90 在一个方向上使用相位-幅度。此外,V.90 和 V.92 都不允许使用所有幅度,这限制了可以创建的波形。


23. 附录 C:“波特”与“bps”

23.1 一个简单的例子

“波特”和“bps”可能是计算机和电信领域中最被误用的术语之一。许多人互换使用这些术语,但实际上它们不是!bps 只是每秒传输的比特数。波特率是衡量信号每秒变化(或可能变化)多少次的量度。对于典型的串行端口,1 位是 -12 伏,0 位是 +12 伏(伏特)。如果 bps 为 38,400,则 010101... 序列也将为 38,400 波特,因为电压在正负之间来回移动,每秒有 38,400 次移动。对于另一个序列,例如 111000111...,电压变化会更少,因为对于序列中的三个 1,电压仅保持在 -12 伏,但我们说它仍然是 38,400 波特,因为每秒的变化次数有可能达到那么高。

从另一种角度来看,放置一个假想的刻度线来分隔每个比特(即使电压可能没有变化)。那么 38,400 波特意味着每秒 38,400 个刻度线。刻度线位于允许变化的瞬间,实际上由硬件中生成的同步时钟信号标记,但不会通过外部电缆发送。

假设“变化”可能具有比先前示例(+- 12 伏)的两种可能结果更多的结果。假设它有 4 种可能的结果,每种结果由唯一的电压电平表示。每个电平可以代表一对位(例如 01)。例如,-12v 可以是 00,-6v 01,+6v 10 和 +12v 11。这里的比特率是波特率的两倍。例如,每秒 3000 次变化将为每次变化生成 2 位,从而导致每秒 6000 比特(bps)。换句话说,3000 波特导致 6000 bps。

23.2 真实示例

上面的例子过于简单。真实示例更复杂,但基于相同的想法。这解释了为什么以 2400 波特运行的调制解调器可以发送 14400 bps(或更高)。调制解调器通过在每次信号变化(或转换)中编码多个比特来获得高于波特率的 bps 率。因此,当每个波特编码 2 个或更多比特时,bps 率超过波特率。如果您的调制解调器到调制解调器的连接速度为 14400 bps,则它将在 2400 波特下发送每个信号转换(或符号)6 个比特。通过 3200 波特和 9 比特/波特获得 28800 bps 的速度。当人们误用波特这个词时,他们可能指的是调制解调器速度(例如 33.6k)。

常见的调制解调器 bps 速率以前是 50、75、110、300、1200、2400、9600。这些也是串行端口到调制解调器电缆上的 bps 速率。今天,调制解调器到调制解调器(最大)bps 速率为 14.4k、28.8k、33.6k 和 56k,但串行端口到调制解调器电缆上的常见速率不同,而是:19.2k、38.4k、57.6k、115.2k、230.4k。230.4k 的高速(截至 2000 年末)不幸的是大多数新(和旧)硬件都不提供。使用带有 V.42bis 压缩(最大 4:1 压缩)的调制解调器,33.6k 调制解调器的速率高达 115.2k bps。56k 调制解调器可以达到 203.2k (4 x 53.3k)。

除了 56k 调制解调器外,大多数调制解调器以 2400、3000 或 3200 波特运行。即使是 56k 调制解调器也使用这些波特进行传输,有时会退回到它们进行接收。由于语音级电话线的带宽限制,难以实现大于 2400 的波特率,并且只能在良好的电话线路质量条件下工作。

bps 和波特之间的混淆是如何开始的?嗯,在古老的低速调制解调器是高速调制解调器的时候,bps 率实际上确实等于波特率。每个相位变化将编码一位。人们会互换使用 bps 和波特,因为它们是相同的数字。例如,300 bps 调制解调器的波特率也为 300。当更快的调制解调器出现,并且比特率超过波特率时,这一切都发生了变化。“波特”是以异步电报打印机的发明者埃米尔·波特的名字命名的。解决此问题的一种方法是使用术语“符号率”而不是“波特”,从而避免使用术语“波特”。但是,当谈论调制解调器和串行端口(DTE 速度)之间的“速度”时,波特和符号率是相同的。甚至“速度”也是一个用词不当,因为我们真正指的是流速。


24. 附录 D:终端服务器连接

本节改编自 Text-Terminal-HOWTO。

终端服务器有点像智能交换机,可以将许多调制解调器(或终端)连接到一台或多台计算机。它不是机械开关,因此它可能会更改通过它的数据流的速度和协议。许多公司制造终端服务器:Xyplex、Cisco、3Com、Computone、Livingston 等。有许多不同的类型和功能。需要另一个 HOWTO 来比较和描述它们(包括使用 Linux PC 创建您自己的终端服务器的可能性)。大多数用于调制解调器连接,而不是直接连接的终端。

它们的一种用途是将许多调制解调器(或终端)连接到连接到主机计算机的高速网络。当然,终端服务器必须具有计算能力和软件才能运行网络协议,因此在某些方面它就像一台计算机。终端服务器可能会与用户交互并询问要连接到哪台计算机等,或者它可能会在不询问的情况下连接。有时可以通过终端服务器将作业发送到打印机。

今天的 PC 具有足够的计算能力来充当终端服务器,只是每个串行端口都应该有自己的硬件中断。PC 只有少数几个备用中断用于此目的,并且由于它们是硬连线的,因此您无法通过软件创建更多中断。一种解决方案是使用高级多端口串行卡,该卡具有自己的中断系统(或在低成本型号上,在多个端口之间共享 PC 的一个中断)。有关更多信息,请参阅 Serial-HOWTO。如果这样的 PC 运行 Linux,并且 getty 在许多串行端口上运行,则可以将其视为终端服务器。如果它通过网络链接到其他 PC,并且其工作主要是传递数据并处理每 14 个(左右)字节的串行端口中断,那么它实际上是一个终端服务器。有时使用名为“radius”的软件。

今天,真正的终端服务器不仅仅为终端服务。它们也为模拟终端的 PC 服务,有时连接到连接到电话线的调制解调器组。有些甚至包括内置调制解调器。如果终端(或模拟终端的 PC)直接连接到调制解调器,则线路另一端的调制解调器可以连接到终端服务器。在某些情况下,终端服务器默认情况下期望呼叫者使用 PPP 数据包,这是真正的文本终端不生成的。


25. 附录 E:电缆和 DSL 调制解调器

25.1 简介

本 HOWTO 仅处理用于将 PC 连接到普通模拟电话线的常见类型的模拟调制解调器。还有使用特殊类型线路的更高速的模拟调制解调器:电缆和 DSL 调制解调器。还有使用数字信号的 ISDN“调制解调器”。虽然本 HOWTO 未涵盖此类调制解调器,但可以在本 HOWTO 的开头找到一些指向相关文档的链接。接下来的 3 个小节:DSL、电缆和 ISDN,简要讨论了此类调制解调器。对于 DSL 和电缆调制解调器,基本的 QAM 调制方法与普通模拟模拟调制解调器类似。请参阅 组合调制

25.2 数字用户线路 (DSL)

DSL(通常是 ADSL)使用从您的家庭/办公室到本地电话局的现有双绞线。如果您的电话线可以接受比普通调制解调器使用的速度快得多的速度,则可以使用它。它用一个可以接受更快数据流(当然是不同的格式)的转换器替换本地电话局的模数转换器。双绞线的频谱被划分为各种信道。每个信道都像普通调制解调器一样使用 QAM 调制。数据通过多个信道发送。将来自您计算机的数字信号转换为用于表示曾经是普通电话线的数字数据的模拟信号的设备是 DSL 调制解调器。DSL 调制解调器通常是外部的(占用您桌子上的空间),并通过以太网端口或 USB 端口连接到您的计算机。

25.3 有线调制解调器

为家庭提供有线电视的同轴电缆具有未用于电视的其他带宽,主要是在高于有线电视使用的频率。这种额外的带宽可用于将计算机连接到 ISP。但是,许多计算机需要共享同一根电缆。可用带宽的频谱被划分为信道(频分复用),每个信道都被分配了时间段,各个计算机被分配到这些时间段(时分复用)。有线调制解调器将来自您计算机(来自网卡:NIC)的数字日期转换为所需的模拟信号,并且仅在其分配的信道上的分配时段内广播。


26. 附录 F:直接背靠背连接 2 个调制解调器(专线)。

虽然调制解调器设计为连接到具有拨号音和线路电压的电话线,但据称,大多数调制解调器在仅通过电话线连接到彼此时也可以通信。要使此功能起作用,请键入 ATD 以使一个调制解调器拨号,键入 ATA 以使另一个调制解调器应答(或将其设置为自动应答)。由于没有拨号音,您可能需要将 ATX(或任何其他命令)设置为盲拨号(强制它在没有拨号音的情况下拨号)。如果 ATD 由于没有电话号码而不起作用,您可以尝试 ATD0 发送 0。

如果上述方法不起作用,您可以制作一个简单的电源来模拟电话线。请参阅 使用调制解调器连接两台计算机,无需电话线

没有电压源的线路有时称为“干线”,并且存在一些旨在在这些线路上工作的调制解调器(或可以配置为在这些线路上工作的调制解调器)。如果您将这些特殊调制解调器之一连接到带有电压的线路,则可能会损坏调制解调器。

专线通常是从电话公司租用的线路。线路的端点由用户控制,用户可以在线路的每一端连接一个调制解调器。专线可能带有也可能不带有电压供应。请参阅迷你 HOWTO:Leased-Line,其中介绍了线路上既没有电压也没有拨号音的专线。一种类型的专线使用两对电线(每个方向一对),使用 9600 波特的 V.29 调制。某些品牌的专线调制解调器与其他品牌不兼容。


27. 附录 G:传真像素(点)

以下是有关标准传真所需的庞大带宽的信息,包括点密度。当然,如果您拨打接收方的真实电话号码,则可以通过调制解调器发送传真。

A4 paper:    216mm (horizontal) * 297mm (vertical)
normal mode       8dots/mm      * 3.85dots/mm
fine   mode                     * 7.7dots/mm
extra fine mode                 *15.4dots/mm

每个点要么是白色,要么是黑色,因此是 1 位。使用精细模式的一张 A4 纸是 (216*8) * (297*7.7) = 约 400 万个点。在 8:1 的压缩率下,以 9600bps 的速度传输大约需要 50 秒。


28. 附录 H:Stty 挂起问题(2000 年之前)

这是一个在 2000 年左右之前存在的问题。此后已修复。如果设置了 -clocal 并且没有 CD 信号,则“stty”命令将挂起,并且似乎无法设置 clocal 以停止挂起(除非运行 minicom)。但是 minicom 会在退出时恢复 -clocal。摆脱这种情况的一种方法是使用 minicom 向调制解调器发送“AT&C”(以获取 CD 信号),然后在不重置的情况下退出 minicom,以便 CD 信号始终保持开启状态。然后您可以再次使用 stty。


29. 附录 G:古董调制解调器

29.1 简介

“古董”是指速度低于 56k 的调制解调器(尽管它们实际上并没有这么快的速度运行)。本附录将古董调制解调器与现代调制解调器进行了比较。如果您对调制解调器历史感兴趣,或者打算实际使用古董调制解调器,则应阅读它。此外,许多现代调制解调器和软件仍然支持旧协议,您可能会发现错误地配置了此类旧协议。

29.2 历史调制解调器协议

“bis”表示标准的第二个版本。
QAM = 正交幅度调制。“正交”一词是“正交差分相移键控”= QDPSK 的缩写。“正交”表示 4(quad),意味着有 4 种可能的相位差,彼此相隔 90 度。只有 V.22 具有 4 种可能的相位。在 V.22 之后,添加了更多可能的相位以传递更多信息,但名称“正交”仍然保留。它只是指相位调制。

上表不包括专线的历史标准:Bell 201B,C (2400 bps) Bell 208A,B (4800 bps; 208B = V.27)。

29.3 历史概述

电传打字机和哑终端

在 1960 年之前,110 bps 调制解调器用于电传打字机(就像电动打字机,只是噪音大得多)。一个人在电传打字机上键入的内容(或保存在穿孔纸带上的内容)可以在远处另一台电传打字机上打印出来。没有计算机参与。

1960 年,AT&T 推出了 300 bps 调制解调器(用于其电话系统)。然后在 1962 年,它开始向公众销售 Bell 103 调制解调器。这种速度慢且昂贵的调制解调器后来主要用于在大型计算机之间传输数据,或用于通过电话线将哑终端连接到大型计算机。许多哑终端甚至没有屏幕显示,而是在纸上打印您在键盘上键入的内容以及来自计算机的响应。

PC 和 BBS

随着 1980 年代初期个人计算机 (PC) 的出现,人们可以使用调制解调器拨号连接到远程大型计算机。在这种情况下,PC 被用作哑终端。但是现在可以传输文件,并且一台 PC 可以通过调制解调器连接到另一台 PC。

1980 年代见证了电子公告板系统 (BBS) 的兴起。BBS 仅仅是一台带有调制解调器的计算机,监听传入的呼叫。公众可以使用调制解调器拨打 BBS,然后下载免费软件、参与各种主题的讨论、玩在线游戏等。拨号连接到 BBS 就像访问 Internet 站点一样。不同之处在于,要访问另一个 BBS 站点,您需要拨打另一个号码(并且可能支付长途电话费)。许多 BBS 会收取月费,但有些由志愿者运营并且是免费的。许多公司为客户建立了 BBS,其中包含支持信息、目录等。在 1990 年代初期,BBS 蓬勃发展。到 1990 年代中期,有些甚至提供 Internet 连接。有关 BBS 的一些历史,请参阅 Sysops' Corner:BBS 历史

互联网

然后是 1990 年代中期 Internet 的发展,这导致了 1990 年代末 BBS 的消亡。一些 BBS 变成了网站,但是当 BBS 大量消亡时,网站非常昂贵,因此大多数 BBS 都消失了。Internet 包含的信息远远超过任何一个 BBS 可以维护的信息,因此 BBS 不再具有竞争力。

调制解调器允许公众连接到 Internet。在 1990 年代,调制解调器变得快速、便宜且被广泛使用。然后在 1990 年代后期,出现了更快的非模拟“调制解调器”:ISDN、DSL 和电缆。这些历史不在本 HOWTO 中。

速度

在 V.32 (9600 bps) 之前,调制解调器的速度通常为 300 到 2400 bps。一些超快的调制解调器具有更高的速度(例如 19.2k bps),并使用非标准协议。为了利用这些“快速”调制解调器,连接的两个调制解调器都需要支持相同的专有协议,这通常意味着它们必须是相同的品牌。

在 V.42 纠错标准和 V.42bis (1990) 数据压缩标准之前,MNP 标准通常用于纠错和数据压缩。X.PC 纠错标准用于某些商业数据网络。压缩和纠错在某些 2400 bps 调制解调器上可用。

从 1960 年到 1980 年,大多数调制解调器的速度只有 300 bps(这也是 300 波特)。这只有 0.3kbps。现代调制解调器快 100 多倍。一些旧的慢速调制解调器仍在使用中,因此它们还不是真正的“古董”。

29.4 专有协议等。

这些不符合 ITU V 系列标准。使用它们是为了在建立更标准化的更高速度之前获得更高的速度。另一端的调制解调器需要支持相同的协议才能使其工作。下面显示的日期可能只是近似值。

PEP 通过将频谱分成多达 512 个子频带来尽可能多地使用带宽。它得到了 Ven-Tel 的 Pathfinder 和 Telebit 的 Trailblazer 的支持。

29.5 自动波特率

此术语有几种不同的含义。一般来说,它要么意味着调制解调器到调制解调器速度的自动调整,要么意味着调制解调器到串行端口速度的自动调整。

29.6 调制解调器到调制解调器速度

现代调制解调器在首次相互连接时会协商调制解调器到调制解调器的速度和协议,并且通常以尽可能高的速度相互连接。如果一方无法协商,另一方应接受固定方可用的任何速度和协议。但有些现代调制解调器可能不再支持某些过时的协议。由于协商的结果,一个调制解调器可能需要使用比其最大速度更低的速度才能与另一个调制解调器通信。这有时被称为“自动波特率调整”或“自动模式”。它也可能被称为“回退”。“回退”更直观的用法是指两个调制解调器由于线路噪音而自动降低速度的情况。虽然自动波特率调整通常是默认设置,但设置固定的调制解调器到调制解调器速度而不是自动波特率调整可以通过 AT 命令(如 `AT` 命令)或寄存器(如 S37)来完成。

早期的调制解调器没有这种自动波特率调整或回退功能。如果您有这样的调制解调器,如果与之连接的另一个调制解调器是现代的,可以根据您的速度和协议进行调整,那么它很可能可以正常工作。但是,如果想要相互通信的两个调制解调器都是老式的,并且不支持自动模式,则会出现问题。在这种情况下,它们需要手动设置为相同的速度和协议。

即使在自动模式存在时,速度的选择有时也是有限的(例如只有 1200/300 bps)。在过去(现在很少见),计算机拨入站点可能有一个电话号码用于某种速度(例如 2400),而另一个电话号码用于不同的速度(例如 1200)。情况通常没有这么简单,因为可能有一些不同的电话号码用于一种速度,或者一个电话号码可能只支持几种速度(例如 1200/300)。此外,一个电话号码可能只支持某种协议,例如 Bell 212A 调制解调器。一旦站点获得了可以支持更广泛的速度和协议的调制解调器,就没有必要拥有不同的电话线路组了。

29.7 调制解调器到串口速度

速度必须相同

对于旧式调制解调器(主要低于 9600 bps),调制解调器到串口的速度必须与调制解调器到调制解调器的速度相同。这是因为数据直接流经调制解调器,而没有在调制解调器内部进行“速度缓冲”(存储字节)。这意味着调制解调器的串口和计算机的串口都必须设置为这个速度。也就是说,串行电缆的两端都必须设置为这个速度。

人们可能会错误地认为,如果串口速度高于调制解调器到调制解调器的速度,一切都会正常工作,因为这样串行线路中就不会有瓶颈。这在从调制解调器到 PC 的方向上可以正常工作,因为速度较高的线路由于字节之间的时间间隔较大,吞吐速度可能会较低。但是,对于从 PC 到调制解调器的流量,灾难将会发生,因为它会以比调制解调器可以传输数据的速度更快的速度流入调制解调器。由于没有速度缓冲,数据将会丢失。

速度均衡

如果调制解调器只有一个调制解调器到调制解调器的速度(或者通过软件或物理开关设置为仅以一种速度运行),那么这就不是问题,因为人们只需将 PC 的串口设置为这个速度即可。调制解调器也会将其串口设置为这个速度。使速度相等的另一种方法是让调制解调器检测 PC 的串口速度,然后将其串口速度和调制解调器到调制解调器的速度都设置为相同。这将在后面解释。

但是,对于使用多种调制解调器到调制解调器速度的调制解调器来说,就存在一个问题。在这种情况下,事先不知道调制解调器将以什么速度连接到另一个调制解调器。例如,如果一个固定速度的调制解调器拨入您的调制解调器,而您的调制解调器支持远程调制解调器的固定速度,那么这就是它将连接的速度。如果 PC 的串口速度之前已设置为不同的速度,则需要更改此速度。

但是,将计算机的串口设置为调制解调器到调制解调器的速度是一个问题,因为调制解调器无法直接向 PC 的串口发出命令来更改其速度。只有系统软件才能做到这一点。调制解调器根据与另一个调制解调器的协商来确定要使用的速度,因此,这种串口速度的更改无法提前完成。调制解调器如何将其调制解调器到调制解调器的速度传达给系统软件呢?

使用“CONNECT”消息设置速度

这是一种方法。考虑一下其他设备拨入的拨入调制解调器的情况。将使用 getty 程序通过调制解调器向用户的终端屏幕发送登录提示符。Getty 也将是更改串口速度的系统软件。调制解调器将通过向 getty 发送“CONNECT”消息(给出调制解调器到调制解调器的速度,例如“CONNECT 2400”)来告诉 getty 它正在使用的调制解调器到调制解调器的速度。

但是这里有一个问题。如何确保调制解调器通过串口发送给 getty 的“CONNECT”消息,以与 PC 的串口相同的速度发送,而 PC 的串口正在期望“CONNECT”消息? 这是它的工作原理。

当调制解调器首次被发送初始化字符串时,调制解调器检测计算机串口的速度,并将其调制解调器到串口的速度设置为该值。现在它可以与 getty 通信,“CONNECT”消息可以顺利通过。

为了感知速度,调制解调器检查了字符串开头的“AT”。这有时也称为自动波特率调整。对于现代调制解调器,即使在调制解调器连接到另一个调制解调器之后,并且无论调制解调器到调制解调器的速度是多少,都始终保留相同的调制解调器到串口速度。但是对于我们的旧式调制解调器,一旦建立连接,这个初始串口速度可能需要稍后更改为调制解调器到调制解调器的速度。

例如,getty 从调制解调器接收到 CONNECT 2400,并将 PC 的串口速度切换为 2400。调制解调器也将其串口速度切换为 2400。现在调制解调器串行电缆的两端都为 2400,并且没有速度不匹配。然后 getty 通过电话线并通过调制解调器发送登录提示符。2400 bps 现在既是调制解调器到调制解调器的速度,又是调制解调器到串口的速度。问题解决了。Mgetty 可以通过将其配置为“自动波特率调整”来做到这一点,但这仅适用于非常旧式(和慢速)的调制解调器。

对于拨出,使用相同的方法,但现在必须由通信软件而不是 getty 来处理它。

通过串口速度设置调制解调器到调制解调器速度

切换调制解调器到调制解调器速度的另一种方法是使用调制解调器功能,其中调制解调器将其调制解调器到调制解调器的速度设置为与其检测到的串口速度相同。Bn AT 命令将启用此功能,并确定每种速度要使用的协议。因此,启用此功能后,通过计算机设置串口速度也将使调制解调器到调制解调器的速度设置为相同。这应该导致此调制解调器在调制解调器之间的任何速度协商中都不灵活。

手动波特率调整

当拨入站点时,解决串口速度问题的另一种(但更粗糙的)方法是让远程站点更改其调制解调器到调制解调器的速度以匹配您的串口速度。它的工作原理如下:尝试通过调制解调器连接登录的人由于速度不匹配而看不到任何登录提示符。因此,尝试登录的人按下“break”键以通过电话线(通过调制解调器)向远程计算机上的 getty 发送 break 信号。即使串行线路中存在速度不匹配,break 信号也始终可以通过。

远程 getty 接收到此 break 信号,并将远程计算机的串口切换到其 getty 配置文件中指定的下一个速度。这个新的远程串口速度导致远程调制解调器切换到先前由 ATB 命令配置的相同的调制解调器到调制解调器速度。然后,本地调制解调器将以该速度通过本地计算机的串行线路传输登录提示符。如果看不到登录提示符,则再次按下 break 键,并尝试新的速度。这种情况会一直持续下去,直到远程 getty 最终获得正确的速度(等于本地 PC 上设置的串口速度),并且最终显示登录提示符。请注意,PC 键盘没有“break”键,但哑终端键盘有。Mgetty、agetty 和 uugetty 可以执行这种过时的 break 方法,它被称为“手动波特率调整”。

不支持的速度

在 Linux 中,如果速度设置为 Linux 串口不支持的速度(例如 7200 bps),则会出现问题。您可能会拨出并以 7200 bps 的速度连接(调制解调器到调制解调器和调制解调器到串口速度),但您只会看到乱码,因为 Linux 不支持串口上的 7200。一旦连接,就没有简单的方法可以挂断电话,因为即使是 +++ 转义序列也无法通过 7200 波特的接口发送到调制解调器。

现代调制解调器,速度缓冲

要使用旧式方法拨出,请使用某些现代调制解调器设置 `&Q0 N0` 和 `S37=5`(如果您想要 1200 bps)。一些 S17 设置因调制解调器的品牌而异。`S37=0` 是默认设置,以支持的最高速度进行现代方式的连接。

现代调制解调器几乎可以使用任何串口速度。它完全不依赖于调制解调器到调制解调器的速度。为此,它们采用速度缓冲和流控制。速度缓冲意味着调制解调器具有缓冲区,因此调制解调器到调制解调器的速度和调制解调器到串口的速度之间可能存在差异。如果进入调制解调器的流量快于从调制解调器输出的流量,则多余的流量 просто 被存储在调制解调器中的缓冲区中。然后,为了防止缓冲区溢出,调制解调器会发送流控制信号以停止输入到它的流量。这对于任何流量方向都是如此。有关更多详细信息,请参见 流控制

29.8 AT 命令之前

Hayes 引入了 AT 命令集,其他调制解调器制造商也将其作为标准采用。在 AT 命令之前,许多调制解调器使用拨码开关来配置调制解调器。另一种命令集是 CCITT V.25bis 命令集。一些调制解调器同时支持 CCITT 和 AT 命令。CCITT V.25bis 还规定了应如何使用 ASCII 或 8 位 EBCDIC 字符集进行同步调制解调器到串口通信。

29.9 声学耦合

这是指使用人们可以听到的音频音调将调制解调器连接到电话。调制解调器包含一个麦克风和扬声器,它们“直接对着”电话听筒说话,而无需使用任何电线。从某种意义上说,它是“无线”的,但使用声波而不是无线电波。调制解调器扬声器与电话麦克风(在听筒上)接触,以便来自调制解调器的音调进入电话。调制解调器麦克风从电话听筒扬声器拾取音调。这种方案称为“声学耦合”。

一个主要问题是外部噪音会干扰并导致错误。优点是方便:无需插入任何电缆。大多数可以做到这一点的调制解调器只有 300 波特,但也使用了更高的速度。据说 9600 bps 使用这种方案效果不佳。

29.10 数据压缩和错误纠正

MNP 2、3 或 4 用于错误纠正。MNP 5 用于压缩。现代调制解调器通常使用 V42(错误纠正)和 V42bis(压缩)。许多调制解调器同时支持 MNP 和 V42。

29.11 历史文献

PC Today,2004 年 9 月,v.2 #9,pp 110-111:“拨号上网的兴衰”

调制解调器 HOWTO 结束