当前位置:Linux教程 - Linux系统 - 玩转Linux下的Modem

玩转Linux下的Modem

  Modem可谓Linux下最难搞定的设备之一,它是我们使用Linux时许多失望和喜悦的源泉。本文介绍Modem相关的各种问题,比如端口、中断、PnP以及Modem检测、网络配置,等等。


作者:俞良军(仙人掌工作室)


端口与Modem类型

  计算机有许多连接其内部和外部世界的接口,部分接口是专用的,例如键盘接口只能连接键盘而不能连接任何其他设备,连鼠标也不能。

  连接外部设备的多用途接口称为“端口”(Port)。大多数PC机都带有两个串行端口和一个并行端口。串行端口用一条线路串行传送数据,每次传送一个数据位,接收后再组合成字节。并行端口使用八条线路每次并行传送8个数据位。大多数家用打印机都连接到PC的并行端口。

  Modem是一种通过电话线路传送数字信息的设备。我们知道,电话系统原本只为传送语音信息而设计,Modem技术突破了这一局限,它能够调制(modulate)数字信息,把数字信息转换成可以通过电话线路发送的模拟信号。在接收端,模拟信号重新被转换成数字信号(即解调,demodulate)。Modem这个词就是从modulator-demodulator缩写得到。

  Modem发明于串行口广泛应用的时代。那时的Modem都是独立在计算机外的设备,通过电缆连接到串行口。今天我们仍可以见到这种外置的Modem,但更多的是插入主板的Modem卡,即内置Modem。由于大多数计算机都带有二个串行口,内置Modem通常增加第三个端口。

  外置Modem的设置一般都相当简单,只需接好串行口和Modem之间的电缆、接上电话线、开启电源,大多数外置Modem就能直接开始工作。

  内置Modem刚出现时,它的板子上总是带有所有通信所需的电路元件,并提供设置地址和IRQ的跳线。硬件厂商总是在寻求降低成本的途径。随着PC功能越来越好,Modem厂商开始用软件来替代部分电路元件,这些Modem称为软Modem或Winmodem。软Modem价格低廉,它用设备驱动程序来完成原来必须由Modem卡电路元件完成的部分任务。

  软Modem的问题在于它的驱动程序是为Windows而不是为Linux编写的。虽然不存在什么特别的原因使得这种驱动程序的Linux版本无法编写,不过这最终还得看Modem厂商。到目前为止还没有厂商这么做。这就意味着软Modem不能在Linux下工作。

  购买Modem时应注意它是否注明了Linux兼容。软Modem的清单可以在http://www.o2.net/~gromitkc/winmodem.html找到。根据经验,如果Modem包装盒注明了“HCF”、“HSP”、“Winmodem”或“soft modem”字样,那么它很可能不能用于Linux。

总线、中断、地址和PnP

  PC机的大多数配件都和CPU、内存一起直接插入主板。主板提供许多扩展卡的接口,供显示卡、Modem之类的设备接入使用。现在也有许多主板直接集成这些功能,因此也就不需要再加这些扩展卡。许多集成到主板的Modem都可以顺利地在Linux下工作。

  主板上的接口连接到系统总线。总线有许多类型,较早的PC使用ISA总线,新的PC使用PCI总线。还有其他一些总线类型,但通常只涉及这两种总线。这些总线的物理和电学特性都是不兼容的,ISA卡绝不能插入PCI插槽,因此购买Modem之前一定要搞清楚可以使用的总线。除非你的机器非常古老,一般它会支持PCI。

  在计算机和新插入的卡建立联系之前,计算机必须知道该卡的I/O地址(输入/输出地址)和中断请求线。

  当计算机想要和插入系统总线的卡通信时,它通过发送I/O地址来选中该卡。每块卡都只应答自己的地址,所有卡都必须有不同的地址,

  中断(Interrupt)稍微复杂一点。当我们在浏览器中输入一个URL地址,就会建立与目标网站的连接,Modem开始接收数据;与此同时,计算机还可以做其他事情,比如监视鼠标状态、打印输出等等。计算机不应该单独排外地专注于一件事情,应该有一种方法让Modem告诉计算机说:“打扰一下,这儿有传送给你的数据”。这种方法就是中断。

  每一个中断都有一个独一无二的编号,称为IRQ。IRQ是Interrupt ReQuest的缩写。中断的数量很多,必须搞清楚每一个中断被分配到了什么设备上。例如,如果中断来自Modem,就不应该去检查鼠标。

  早期的扩展卡提供跳线让用户设置其I/O地址和IRQ。这种方法很容易出错,比如容易把两块卡设置成相同的地址或IRQ。为解决这个问题,软硬件厂商们共同建立了一个标准,这个标准允许计算机主动地查询各个扩展卡并分配I/O地址和IRQ。它不仅使得地址和IRQ的分配自动化,同时也避免了可能出现的冲突。这个标准就是“即插即用”,即Plug and Play,简称PnP。

  计算机启动时首先运行的软件是BIOS(Basic Input Output System)。BIOS唤醒计算机的所有设备,简单地检查计算机安装了哪些设备,然后装入操作系统。PnP设备的许多配置工作均由BIOS完成,但也有部分工作要由操作系统完成。Linux还未能提供完善的PnP支持,虽然许多PnP设备可配置成在Linux下工作,但也有许多不能。

  如果Linux没有初始化某个PnP设备,不要马上对此绝望,很有可能存在解决方法。请查看isapnp工具的文档,Modem-HOWTO同样可以提供帮助。如果兼容设备清单包含了该类Modem,不管它是不是PnP的,很可能无需任何额外的努力它就可以顺利地工作。

  安装Modem最常见的问题有三个:I/O地址或IRQ设置冲突,使用的是软Modem,不完善的PnP支持导致Modem配置错误。

配置拨号网络

  Modem接入计算机之后,怎样才能找到它?

  如果Modem是外置式的,那么你应该清楚它连接到了COM1还是COM2。如果Modem是内置式的,那么它很可能连接到COM3。COM1、COM2这类名字是Microsoft对串行端口的称呼。在Linux中,COM1被称为/dev/ttyS0, COM2是/dev/ttyS1,而COM3 则是/dev/ttyS2。在较早的Linux中,COM端口可能分别叫做/dev/cua0、/dev/cua1以及/dev/cua2。

  如果Modem是在Linux安装期间配置的,那么/dev目录下会生成/dev/modem。这应该是一个指向Modem正确端口的连接。要查看/dev/modem指向了何处,在X终端输入命令file /dev/modem。输出结果应当类如:


/dev/modem: symbolic link
to ttyS2




  它告诉我们Modem安装在COM3。如果/dev/modem存在且没有指向Modem实际安装的端口,则应删除该连接。有些Linux发行版本提供一个名为modemtool的工具,使用它可以创建正确的连接。

  请确保所有用户都具有访问/dev/modem以及串行端口的权限。

  如果你使用KDE,那么kppp是一个帮助你配置和管理Internet连接的优秀工具。大多数Linux发行都提供kppp。注意在建立拨号连接之前必须先收集必要的信息,比如用户名字、密码、电话号码、DNS服务器地址。下面是具体的配置过程。

  步骤1:指定系统所安装的Modem

  启动kppp。如果不能在KDE菜单上找到它,试一下/usr/bin/kppp命令。

  首先要做的事情是让kppp知道Modem在哪里。点击Setup按钮,在配置窗口中选择“Device”。

  点击“Modem Device:”旁边的箭头,出现一个可选用Modem端口的清单,选择Modem所接入的端口。接下来,再把“Connection Speed:”设置成115200,当然如果机器支持的话也可以把这个速度设置得更高。

  步骤2:测试Modem

  要测试Modem,先选择“Modem”页。点击“Query Modem”按钮,此时将出现一个窗口显示查询Modem的进度。请确保“Modem Volumn”(音量)设置在指示条的中间,以便在Modem工作时听到声音。

  如果kppp不能找到Modem,你可以返回步骤1试一下另外的端口(或速度)。

  步骤3:设置帐号参数

  接下来就可以设置帐号参数。返回“Accounts”页,选择“New”设置一个新的帐号。

  在“Dial”页下面,取一个容易使人记起拨号目标的名字(建议使用ISP的名字)并将它输入“Connection Name”框。然后再将ISP的电话输入“Phone Number”框。

  现在选择“IP”页,选中“Dynamic IP Address”检查框(如果ISP提供了固定的IP地址,则不要选中该项)。在DNS页,输入ISP提供的DNS服务器的IP地址。

  点击OK保存新创建的帐号。再次点击OK关闭“Configuration”窗口。

  步骤4:连接

  现在我们回到了最初的kppp窗口。输入用户名字和密码,然后点击“Connect”按钮。

  如果计算机能接通Modem,它将开始向设定的ISP拨号。此时可以听到Modem拨号的声音。

用Minicom测试Modem

  把Modem接入计算机之后首先要做的事情之一是测试一下看看它能否工作。这可以使用前面介绍的kppp,如果kppp不行,还可以使用一个名为minicom的Linux小工具。

  第一次运行minicom的时候必须进入设置模式,告诉它Modem所使用的端口。在X终端输入命令minicom -s(必须以root身份运行),此时将出现一个菜单。使用“Serial port setup”,确保端口和速度的设置都正确无误。

  配置好minicom之后,接下来就可以直接向Modem发送命令。大多数Modem都支持“贺氏协议”(Hayes Protocol)。试一下AT命令,如果Modem能正常工作,它将应答OK。如果没有得到OK应答,那么可能端口设置错误,可能Modem已经损坏,可能Modem不能适应你所设置的速度等选项。

  另外一个可能的原因是Modem被设置成了“静默”模式。试一下ATE1Q0V1命令。该命令告诉Modem回显并应答用户命令(如果它能够接受命令的话)。

  贺氏协议

  正如计算机业的其它许多事情,标准往往是由特定领域第一个取得成功的公司建立。第一个真正成功的Modem厂商是贺氏(Hayes)。贺氏开发了一种用于控制其Modem的非常简洁的语言,即贺氏协议(Hayes Protocol)。今天,贺氏协议得到了几乎所有Modem的支持。

  贺氏协议的命令以AT开头,一行之内单个“AT”之后可以跟随多个命令。虽然贺氏协议的应用已经相当普遍,但某些Modem仍不能支持完整的贺氏命令集。要得到Modem所支持贺氏命令的完整清单,请参见Modem手册或制造商网站。

  下面是你应该熟悉的基本命令,大多数Modem都支持这些命令:


Z:(重新)初始化/重置
H:挂断
Ln:扬声器音量(L0=最低,L1=低,L2=中,L3=高)
Mn:扬声器控制(M0=关,M1=连接后关,M2=总是开启)
Vn:结果码格式(V0=以数字显示结果码,V1=以文字显示结果码)
En:命令回显(E0=不回显,E1=回显命令)