我们所说的“速度”实际上是指“数据流速”,但几乎所有人都会错误地称之为速度。速度的单位是比特/秒(或波特)。速度可以使用 “stty” 命令或使用串口的程序来设置。请参阅 Stty
自 20 世纪 90 年代中期以来,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 是否支持这些?
速度是通过改变串口时钟的频率来设置的。但是这种改变不是通过实际改变驱动时钟的振荡器的频率来实现的,而是通过“除以”时钟的频率来实现的。例如,要除以 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,但这种情况下的实际速度由 “divisor” 的值决定,该值也在 setserial 中设置。我认为最好尽量避免使用这种权宜之计。
有些品牌的 UART 使用非常高的除数来设置高速。没有任何令人满意的方法可以使用 “setserial”(例如设置 “divisor 32770”)来获得这样的速度,因为 setserial 会认为速度非常低并禁用 UART 中的 FIFO。
请注意,baud_base 设置通常远低于晶体振荡器的频率,因为例如 1.8432 MHz 的晶体频率在硬件中被除以 16,以获得 115.2k 的实际最高速度。晶体频率需要更高的原因是,这种高晶体速度可以生成时钟滴答,以对每个比特进行多次采样,从而确定它是 1 还是 0。
实际上,1.8432 MHz 的“晶振频率”可以从 18.432 MHz 的晶体振荡器通过在馈送到 UART 之前除以 10 来获得。只要 UART 运行正常,其他方案也是可能的。
如果您在使用 (E)IDE 磁盘驱动器的系统上看到吞吐量缓慢和串口溢出,您可以获取 hdparm
。这是一个可以修改 (E)IDE 参数的实用程序,包括在磁盘 IRQ 期间取消屏蔽其他 IRQ。这将提高响应速度,并有助于消除溢出。请务必仔细阅读手册页,因为某些驱动器/控制器组合不喜欢这样做,可能会损坏文件系统。
还可以看看一个名为 irqtune
的实用程序,它可以更改设备的 IRQ 优先级,例如您的调制解调器所在的串口。这可能会提高系统上的串行吞吐量。irqtune
常见问题解答位于 http://www.best.com/~cae/irqtune