您不必理解基础知识也能使用和安装调制解调器。但是,理解这些知识可能有助于确定在遇到问题时哪里出了问题。阅读完本节后,如果您想更深入地了解它,您可能想查看本文档中的调制解调器的工作原理(尚未完成)。有关串口的更多详细信息(包括本节的大部分内容)将在 Serial-HOWTO 中找到。
大多数电话主线已经是数字的,但是连接到您家(或企业)的线路通常是模拟的,这意味着它们被设计用来传输电压波,该电压波是您口中发出的声波的精确复制品。这种电压波称为“模拟”。如果在示波器上观察,它看起来像一个频率和幅度变化的 sine 波。数字信号就像一个方波。例如,3 伏(volts)可能是一个 1 位,而 0 伏可能是 0 位。对于大多数串口(外部调制解调器使用),+12 伏是一个 0 位,-12 伏是一个 1 位(有些是 + 或 - 5 伏)。
为了通过电话线从您的计算机发送数据,调制解调器会获取来自您计算机的数字信号,并将其转换为“模拟”信号。它通过创建模拟正弦波然后“调制”它来实现这一点。由于结果仍然表示数字数据,因此也可以将其称为数字信号而不是模拟信号。但它看起来有点像模拟信号,几乎每个人都称之为模拟信号。在电话线的另一端,另一个调制解调器“解调”这个信号,并恢复纯数字信号。“调制”和“解调”这两个词的部分组合起来,您就得到了“调制解调器”(如果您去掉两个 d 中的一个)。因此,“调制解调器”是调制器-解调器。关于什么是调制,可以在调制细节部分找到。
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 上使用其中一些调制解调器。请参阅基于软件的调制解调器 (winmodems)。
由于计算机需要与每个串口通信,因此操作系统必须知道每个串口的存在及其位置(其 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 地址实际上是一个地址范围。此范围内的较低地址是基地址。“地址”通常仅指“基地址”。
串口被命名为 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 等。
字节通过电话线进入调制解调器,由调制解调器从模拟信号转换为数字信号,然后传递到串口,最终到达计算机内部的目的地。当串口接收到一定数量的字节(可以设置为 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 地址处具有寄存器。这些寄存器包含有关串口的状态信息。软件读取这些寄存器,并通过检查内容,找出发生了什么并采取适当的措施。
在继续介绍串口的基础知识之前,需要了解调制解调器完成的一件事:数据压缩。在某些情况下,此任务实际上是由在计算机 CPU 上运行的软件完成的,但不幸的是,目前此类软件仅适用于 MS Windows。这里的讨论将针对调制解调器本身进行压缩的情况,因为这是调制解调器在 Linux 下工作所必须发生的情况。
为了在电话线上更快地发送数据,可以使用自定义编码方案对其进行压缩(编码),该方案本身取决于数据。编码后的数据小于原始数据(字节更少),并且可以在更短的时间内通过互联网发送。此过程称为“数据压缩”。
如果您从互联网下载文件,它们可能已经被压缩,调制解调器尝试进一步压缩它们是不可行的。您的调制解调器可能会感觉到正在通过的数据已经被压缩,并避免尝试再次压缩它。如果您正在接收由另一个调制解调器压缩的数据,您的调制解调器将解压缩它,并创建比通过电话线发送的字节多得多的字节。因此,从您的调制解调器到您的计算机的数据流量将高于通过电话线到您的流量。此流量的比率称为压缩比。高达 4 的压缩比是可能的,但不太可能。
与数据压缩类似,调制解调器可以设置为进行纠错。虽然涉及一些开销成本,这会降低字节/秒的流速,但事实上,纠错会剥离起始位和停止位,实际上会提高数据字节/秒的流速。
对于串口与外部世界的接口,每个 8 位字节都添加了 2 个额外的位:一个起始位和一个停止位。在没有纠错的情况下,这些额外的起始位和停止位通常会直接通过调制解调器并输出到电话线上。但是,当启用纠错时,这些额外的位会被剥离,并且 8 位字节被放入数据包中。这更有效率,并且尽管为了数据包头和纠错目的添加了一些额外的字节,但仍导致更高的字节/秒流量。
数据(表示字母、图片等的字节)从您的计算机流向您的调制解调器,然后输出到电话线上(反之亦然)。流速(例如 56k (56000) 位/秒)被(不正确地)称为“速度”。但是几乎每个人都说“速度”而不是“流速”。如果没有数据压缩,从计算机到调制解调器的流速将与电话线上的流速大致相同。
实际上,在您电话线的末端需要考虑两个不同的速度
当您拨出并连接到电话线另一端的另一个调制解调器时,您的调制解调器通常会向您发送一条消息,例如“CONNECT 28800”或“CONNECT 115200”。这些是什么意思?嗯,它是 DCE 速度或 DTE 速度。如果它高于广告宣传的调制解调器速度,则它必须是 DTE 调制解调器到计算机的速度。上面显示的 115200 速度就是这种情况。28800 必须是 DCE(调制解调器到调制解调器)速度,因为串口没有这样的速度。可以配置调制解调器以报告任一速度。一些调制解调器报告两种速度,并将调制解调器到调制解调器的速度报告为(例如):CARRIER 28800。
如果您有内置调制解调器,您不会期望从您的调制解调器到您的计算机的 DTE 速度有任何速度限制,因为您的调制解调器在您的计算机内部,并且几乎是您计算机的一部分。但通常是有的,因为调制解调器包含一个专用的串口。在某些软件调制解调器上,没有这样的速度限制。
重要的是要理解平均速度通常低于指定速度,尤其是在短 DTE 计算机到调制解调器线路中。等待(或空闲时间)会导致平均速度降低。这些等待可能包括由于流量控制而导致的可能长达一秒的漫长等待。在另一个极端,可能存在非常短的等待(空闲时间),即几个微秒,分隔一个字节的结束和下一个字节的开始。此外,如果电话线路条件不佳,调制解调器将回退到较低的速度。
有关使用最佳 DTE 速度的讨论,请参阅我应该使用什么速度部分。
流量控制是指减慢导线中字节流速度的能力。对于串口,这意味着停止然后重新启动流量而不会丢失任何字节的能力。调制解调器和其他硬件需要流量控制,以允许瞬时流量速率的跳跃。
例如,考虑您通过短电缆将 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 也是如此。要使软件流量控制适用于二进制数据,需要调制解调器(硬件)和软件支持。
理解流量控制理论可能具有实际用途。例如,我使用我的调制解调器访问互联网,并且似乎工作正常。但是几个月后,我尝试从我的 PC 发送长文件,结果导致大量的重试和错误,但最终成功了。在另一个方向(从我的 ISP 到我)接收工作正常。问题出在调制解调器禁用了流量控制。我的调制解调器的缓冲区在发送长文件时溢出(过载),因为从未向我的计算机发送“停止”信号以停止向调制解调器发送。从调制解调器到我的计算机的方向没有问题,因为串口的容量(例如 115.2 kbps)始终高于来自电话线的流量。但在另一个方向上存在问题,即 PC 将以 115.2 kbps 的速度发送,而调制解调器无法处理这种高流量,从而导致调制解调器的缓冲区过载。解决方法是通过在调制解调器的初始化字符串中放入启用流量控制命令来启用流量控制。
这是两个调制解调器之间通过电话线发送的数据的流量控制。只要启用纠错,它就可以工作。实际上,即使没有纠错,也可以启用调制解调器之间的软件流量控制,但它可能会干扰发送二进制数据,因此不常用。
已经提到,每个流量方向都有 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”语句会阻塞),并且应用程序暂时停止运行,并等待直到某些缓冲区空间可用。因此,流控制“停止”最终能够停止发送字节的程序。即使此程序停止,计算机也不一定停止计算,因为它可能会在等待流控制停止时切换到运行其他进程。
以上内容在三个方面过于简化了。首先,一些 UART 可以进行自动硬件流控制,如果需要,可以停止从 FIFO 缓冲区传输出去(Linux 尚不支持)。其次,当应用程序进程等待写入发送缓冲区时,它可能会执行其他任务。第三,串行驱动程序(位于内存缓冲区和 FIFO 之间)有其自己的小型缓冲区(在主内存中),用于处理字符。
发送到调制解调器的命令通过与发送数据相同的导体从通信软件发送到调制解调器。这些命令是简短的 ASCII 字符串。例如,“AT&K3”用于启用计算机和调制解调器之间的硬件流控制 (RTS/CTS);“ATDT5393401”用于拨打号码 5393401。请注意,所有命令都以“AT”开头。一些命令(例如启用流控制)有助于配置调制解调器。其他命令(例如拨打电话号码)实际上会执行某些操作。大约有一百个左右不同的可能命令。当您的通信软件开始运行时,它首先向调制解调器发送一个“init”命令字符串来配置它。所有命令都在调制解调器拨号(或接听电话)之前在普通数据线上发送。
一旦调制解调器连接到另一个调制解调器(在线模式),从您的计算机发送到调制解调器的所有内容都直接发送到另一个调制解调器,并且不会被调制解调器解释为命令。有一种方法可以“逃脱”这种操作模式,并返回到命令模式,在该模式下,发送到调制解调器的所有内容都将被解释为命令。计算机只需发送“+++”,并在其前后留出指定的时间间隔。如果此时间间隔正确,调制解调器将恢复到命令模式。另一种方法是通过特定调制解调器控制线上的信号来实现。
互联网上有许多调制解调器命令列表。网站部分提供了指向其中几个网站的链接。不同型号和品牌的调制解调器使用的命令集并不完全相同。因此,适用于一个调制解调器的命令可能不适用于另一个调制解调器。本 HOWTO 的 调制解调器配置部分列出了一些常用命令(不保证适用于所有调制解调器)。
串行端口的设备驱动程序是操作串行端口的软件。现在它以串行模块的形式提供。从内核 2.2 开始,如果需要,此模块通常会自动加载。在较早的内核中,您必须运行 kerneld
才能按需自动加载模块。否则,串行模块需要显式列在 /etc/modules 中。在模块在 Linux 中流行之前,串行驱动程序通常内置在内核中(有时仍然是这样)。如果它是内置的,请不要让串行模块加载,否则您将同时运行两个串行驱动程序。使用 2 个驱动程序会出现各种错误,包括尝试打开串行端口时可能出现的“I/O 错误”。使用“lsmod”查看模块是否已加载。
当串行模块加载时,它会在屏幕上显示有关现有串行端口的消息(通常显示错误的 IRQ)。但是,一旦 setserial
使用该模块来告诉设备驱动程序(希望是)正确的 IRQ,那么您应该看到第二个显示,类似于第一个显示,但具有正确的 IRQ 等。有关 setserial
的更多信息,请参阅 Serial-HOWTO 中的“串行模块”。请参阅 什么是 Setserial。