我们所说的“速度”实际上是指“数据流速”,但几乎每个人都错误地称之为速度。对于所有现代调制解调器,您无法选择调制解调器在电话线上使用的速度,因为它会自动选择在当时情况下可行的最高速度。如果一个调制解调器比另一个慢,那么较快的调制解调器将以较慢的调制解调器的速度运行。在噪声较大的线路中,速度会进一步降低。
虽然上述速度是由调制解调器自动选择的,但您可以选择调制解调器和计算机之间(PC 到调制解调器速度)使用的速度。这有时被称为“DTE 速度”,其中“DTE”代表数据终端设备(您的计算机就是 DTE。)您需要将此速度设置得足够高,以使信号路径的这一部分不会成为瓶颈。DTE 速度的设置是此链路的最大速度。大多数时候,它实际上可能会以较低的速度运行。
对于外部调制解调器,DTE 速度是调制解调器和 PC 之间电缆上的数据流速度(以比特/秒为单位)。对于内部调制解调器,概念相同,因为调制解调器也模拟串行端口。在计算机和直接连接到计算机内部更高速度总线的调制解调器卡之间进行通信时设置速度限制似乎很荒谬。但这通常是这样的,因为调制解调器卡可能包含专用的串行端口,该端口确实有速度限制(和可设置的速度)。但是,一些软件调制解调器没有这样的速度限制。
您选择什么速度?如果不是因为“数据压缩”,人们可能会尝试选择与调制解调器速度完全相同的 DTE 速度。数据压缩会将从计算机发送到调制解调器的字节编码为更少的字节数。例如,如果从 PC 到调制解调器的数据流(速度)为 20,000 字节/秒 (bps),并且压缩率为 2 比 1,那么只有 10,000 字节/秒的数据流过电话线。因此,对于 2:1 的压缩率,您需要将 DTE 速度设置为电话线上最大调制解调器速度的两倍。如果压缩率为 3 比 1,您需要将其设置为 3 倍快,依此类推。
此 DTE(PC 到调制解调器)速度通常由您的通信程序中的菜单或某人拨入时提供给 getty 命令的选项设置。您无法设置 DCE 调制解调器到调制解调器的速度,因为这是由调制解调器在与其他调制解调器协商后自动设置为最高可行速度的。嗯,实际上您可以使用 S37 寄存器设置调制解调器到调制解调器的速度,但您不应该这样做。如果连接上的两个调制解调器以这种方式设置为不同的速度,那么它们将无法相互通信。
自 1990 年代中期以来,115.2k 的最高速度一直是标准。但是到 2000 年,大多数新的串行端口都支持更高的速度,即 230.4k 和 460.8k。有些还支持 921.6k。不幸的是,由于缺少驱动程序,Linux 很少使用这些速度。因此,除非通过特殊软件启用更高的速度,否则此类端口的行为就像 115.2k 端口一样。要获得这些速度,您需要使用特殊补丁编译内核或使用模块,直到支持内置到内核的串行驱动程序中。
不幸的是,串行端口制造商从未就支持高速的标准方式达成一致,因此串行驱动程序需要支持各种硬件。一旦启用高速,选择它的标准方法是将 baud_base 设置为 setserial 的最高速度(除非串行驱动程序为您执行此操作)。然后,该软件将使用 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 是否支持这些?
速度是通过更改串行端口的时钟频率来设置的。但是这种更改并非通过实际更改驱动时钟的振荡器的频率来发生的,而是通过“除以”时钟的频率来发生的。例如,要除以 2,只需忽略每隔一个时钟滴答。这会将速度减半。除以 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,但这种情况下的实际速度由“除数”的值决定,该值也在 setserial 中设置。我认为最好尽量避免使用这种权宜之计。
有些品牌的 UART 使用非常高的除数来设置高速。没有任何令人满意的方法可以使用“setserial”(例如设置“除数 32770”)来获得这样的速度,因为那样 setserial 会认为速度非常低并禁用 UART 中的 FIFO。
请注意,baud_base 设置通常远低于晶体振荡器的频率,因为例如 1.8432 MHz 的晶体频率在硬件中除以 16 以获得 115.2k 的实际最高速度。晶体频率需要更高的原因是,这种高晶体速度可以生成时钟滴答,以获取每个比特的多个样本,以确定它是 1 还是 0。
实际上,1.8432 MHz 的“晶体频率”可以从 18.432 MHz 的晶体振荡器通过除以 10 获得,然后再馈送到 UART。只要 UART 正常运行,其他方案也是可能的。
对于 56k 调制解调器,最好至少使用 16650 UART,但很少有调制解调器或串行端口提供它。第二好的是经过调整以提供 230,400 bps (230.4 kbps) 的 16550。大多数人仍然使用仅为 115.2 kbps 的 16550,但据称只会将吞吐量降低几个百分点(平均而言)。这是因为典型的压缩率为 2 比 1,对于下载压缩文件(软件包),压缩率为 1 比 1。对于这些情况,吞吐量没有下降。以下是一些建议的速度,如果您调制解调器的速度是:
以上所有速度都可以使用 V.42bis 数据压缩和 V.42 纠错。如果未使用数据压缩,则可以将速度设置得更低,只要它高于调制解调器速度即可。