下一页 上一页 目录

19. 故障排除

如果您怀疑问题是硬件问题,请参阅 维修和诊断 章节。如果是键盘问题,请参阅 键盘 章节。如果它对您输入的内容反应不正确(或者根本没有反应),请参阅 终端接口损坏 章节。如果问题涉及到串口本身,请参阅 Serial-HOWTO。

以下是可能的问题列表

终端出现故障有两种情况。一种是最近工作正常,但突然出现故障。这将在下一个小节中讨论。另一种情况是,在您安装终端后,事情无法正常工作。对于这种情况,您可以跳过下一节。

19.1 终端曾经工作正常

当一个以前工作正常的终端突然出现故障时,通常很容易找到问题所在。那是因为(除了硬件故障)问题很可能是由于您所做的事情(或您使用的软件所做的事情)引起的。

问题可能很明显,例如终端首次打开时出现的错误消息。如果它发出奇怪的声音,则可能需要维修。请参阅 维修和诊断 章节。首先,想想最近做了或更改了什么,因为它很可能是问题的原因。问题是否发生在安装新的系统软件之后或配置更改之后?

如果终端对您输入的内容反应不正确(或者根本没有反应),您可能遇到了 终端接口损坏 的问题。

19.2 新安装的终端

如果您刚按照说明将终端连接到计算机,但它不工作,本节适合您。如果一个以前工作正常的终端现在不工作了,请参阅 终端曾经工作正常 章节。如果您怀疑计算机上的串口可能有缺陷,您可以尝试运行诊断测试程序。目前(1998年6月)似乎 Linux 还没有这样的诊断程序,因此您可能需要在 MS DOS/Windows 下运行诊断程序。有一些程序可以监控各种串行线路,如 DTR、CTS 等,这可能会有所帮助。请参阅 串行监控/诊断 章节

一种方法是首先尝试在最简单的情况下通过将文件复制到终端 (cp my_file /dev/ttyS?) 来查看终端是否工作。这意味着禁用调制解调器控制线,并以不需要流量控制的低速运行(确保禁用任何硬件流量控制)。如果此复制工作正常,则使情况稍微复杂一些,看看它是否仍然工作,等等。当您进行更改后立即出现问题时,则该更改很可能是问题的根源。实际上,更有效(但也更复杂)的方法是从简单的情况跳到最终配置的一半左右,以便测试消除大约一半的剩余可能问题原因。然后在下一个测试中重复此方法。这样,大约只需 10 次测试即可从一千个可能的原因中找到原因。您应该根据直觉和线索稍微偏离此方法。

19.3 终端是否正常?

许多终端启动时会在屏幕上显示一些文字。如果这些文字没有传达任何错误消息,则可能没问题。如果没有电源迹象(屏幕黑屏等),请重新插上计算机电源线两端。确保墙壁插座(或延长线末端)有电。如果有备用电源线,请尝试使用另一根。确保终端已打开,并且保险丝没有熔断。空白(或昏暗)的屏幕有时可以通过在设置模式下使用旋钮或键盘按键调高亮度和对比度来修复。

长期存放的终端可能需要一段时间“预热”,因为电解电容器会在电压下自我修复。如果仍然无法工作,请参阅 维修和诊断 章节,了解有关维修的提示。

如果终端启动正常,但您怀疑它可能存在问题,请进入“本地模式”,在该模式下它像打字机一样工作,并尝试在上面打字。请参阅 本地模式 章节。在您遇到问题之前,您应该了解如果硬件出现故障,您的终端是否会显示错误消息。测试终端是否会显示错误消息的一种方法是在键盘未插拔的情况下打开终端,看看它是否显示错误消息。

19.4 文本丢失

如果终端上正常显示了几行或一些文本,然后停止而没有完成(在单词中间等),或者如果丢失了大块文本,则您可能遇到了流量控制问题。如果您无法立即找出导致问题的原因,请降低速度。如果这解决了问题,则很可能是流量控制问题。可能是由于未正确配置流量控制,或者由于电缆接线错误(对于硬件流量控制),导致流量控制根本无法工作。请参阅 流量控制 章节

如果您可以在终端上正常输入,但是当文本发送到终端时,每发送 16 个字符中只有大约 1 个字符通过,那么您可能为 setserial 提供了错误的 UART。如果端口是过时的 16550(或更低版本),但您告诉 setserial 它是 16550A 或更高版本,则会发生这种情况。

如果缺少单个字符,则可能是串行端口因速度过快而溢出。尝试使用较低的波特率。

如果您的设备低于 1200 波特(可能是非常慢的旧式硬拷贝终端或打印机)并且文本被截断,则问题可能出在串行设备驱动程序中。请参阅 Printing-HOWTO 中“串行设备”部分,了解如何解决此问题。

19.5 所有按键都工作不正常;必须多次敲击按键

在这种情况下,您需要多次敲击按键才能使其工作(并在屏幕上看到您键入的字母)。如果您键入一个单词,屏幕上可能会缺少某些(甚至所有)字母。如果命令中缺少字母,则该命令不起作用,即使所有字母都存在,您也可能需要多次敲击回车键才能执行该命令。

这可能是由于两个不同的进程打开了串行端口。两者都尝试读取您键入的内容。有时一个进程(正确的进程——可能是 shell)读取您键入的内容,而另一些时候另一个进程读取您键入的内容。一个例子是另一个进程用于串行鼠标(例如 gpm),它不回显您键入的内容。因此,另一个在同一 ttySx 上运行的进程正在占用您键入的一些内容。要解决此问题,请使用“ps -alx”查看 ttySx 上还在运行什么,并杀死该进程。

您可能会认为锁定文件可以防止两个程序同时使用同一个串行端口。但是终端和 gpm 鼠标程序都不使用锁定文件。由于其他人可能需要写入您的终端,因此不使用锁定文件是合理的。请参阅 Serial-HOWTO 中的 锁定文件 章节。

19.6 ... 重新生成过快:已禁用 5 分钟

发生了什么

您在控制台上看到一条消息,例如:“Getty respawning too fast: disabled for 5 minutes”。它可能不显示“Getty”,而是显示一个标签(例如:Id “S2”),其中 S2 是 /etc/inittab 中调用 getty 的行的标签。

当 getty 启动时,它会尝试向串行端口发送登录消息。但是,如果出现严重问题,getty 将立即被杀死。由于 /etc/inittab 文件中 getty 的行说“respawn”,getty 会再次启动,但又会被杀死,等等。因此,getty 会快速地一遍又一遍地重新生成。但是操作系统会介入并阻止这种无意义的行为(5 分钟)。以下章节显示了可能的原因和修复方法。

/etc/inittab 文件中 Getty 行不正确

确保 /etc/inittab 中调用 getty 的行是正确的。“ttySx”(或 uugetty 的 “DTxxxx”)或 “getty” 中的拼写错误可能会导致此问题。

没有调制解调器控制信号

如果终端没有在串行端口的引脚之一上向 PC 发送 CD 信号,则除非在 getty 中使用了“local”选项,否则 getty 将被杀死。因此,一个快速的解决方法是只使用“local”选项(agetty 为 -L,getty_ps 的 /etc/gettydefs 中为 “CLOCAL”)。

另一种方法是确定为什么 CD 没有被置位。在许多情况下,连接到终端的电缆根本没有 CD 引脚的线,因此您必须使用“local”选项。如果 CD 引脚有线,则可能在终端通电之前没有任何信号。请注意,CD 引脚信号有时由终端(或 PC)的 DTR 引脚通过使用连接器内部的跳线提供。

没有这样的串行设备

如果设备(例如 /dev/ttyS2)是假的(物理上不存在或已被禁用),则 getty 将被杀死。您可以使用 “scanport”(仅限 Debian ??)和/或 “setserial” 来探测设备或尝试另一个 ttyS。也许该设备已在 CMOS 中被禁用。请参阅 “Serial-HOWTO”。

没有串行支持

Linux 通过在编译内核时选择串行支持或加载串行模块:serial.o 来提供串行支持。如果串行支持既没有内置到内核中,也没有由串行模块提供,则会发生此“重新生成”错误。您可以使用 “lsmod” 命令查看是否已加载串行模块。要查看串行支持是否内置到内核中,请检查内核配置文件(在 /boot、源代码树等中)。

按键短路

getty 重新生成过快的另一个可能原因是键盘按键短路。如果按键卡在按下位置,则可能会发生这种情况。启用自动重复后,这会向登录提示符“键入”数千个字符。寻找屏幕上充满了相同字符的情况(在某些情况下,会有 2 个或更多不同的字符)。

19.7 登录后立即失败

如果您可以正常登录,但随后无法使用终端,则可能是因为登录 shell 的启动已通过某人放入登录和 shell 启动时运行的文件之一的命令重新配置了终端(为不正确的设置)。这些文件包括 /etc/profile 和 ~/.bashrc。查找以 “stty” 或 “setserial” 开头的命令,并确保它是正确的。即使在一个初始化文件中完成得很好,也可能在您不知道的另一个初始化文件中被错误地重置。进入系统进行修复的方法是使用另一个终端或控制台,使用救援软盘,或在 lilo 提示符下键入:“linux single”,这将使您进入单用户模式,而无需运行启动文件。

19.8 无法登录

如果您收到登录提示符,但登录尝试没有响应(或者可能是乱码响应),则可能的原因是通信单向从终端到计算机不良。可能是电缆/连接器不良或接线错误。如果您尚未使用 getty 的“local”选项,请这样做以禁用调制解调器控制线。请参阅 Getty (用于 /etc/inittab) 章节。您也可以禁用硬件流量控制 (stty -crtscts)(如果已启用)。如果现在工作正常,则您的调制解调器控制线可能未正确接线,或者您的设置中存在错误。某些终端允许为发送和接收设置不同的值(例如波特率),因此接收可能正常,但发送可能不良。

您还应该在另一个终端(例如控制台)上尝试 “stty -F /dev/ttyS1”(或 ttyS 任何内容)以查看其是否设置正确。它通常处于原始模式(这可能没问题),带有 -icanon 和 -echo 等。如果终端错误地设置为半双工 (HDX),那么您在键入时看到的一组字符来自终端本身。如果字符加倍,则来自计算机的回显是正常的,您可以切换到全双工来解决此问题。但是,如果设置了半双工,并且您只看到看起来像正常的“回显”,那么它们不是像应该的那样来自计算机。

如果您收到一条消息,例如 “login failed”,那么如果键入或密码没有错误,则可能存在一些登录限制,这些限制将不允许您登录。不幸的是,此消息可能不会告诉您失败的原因。请参阅 登录限制 章节

19.9 登录提示符乱码

这可能是由于使用了错误的字符集、由于波特率过高导致的传输错误、不兼容的波特率、不兼容的奇偶校验或每个字节的位数错误。如果是一系列奇怪的字符,则您使用了错误的字符集,或者错误地设置了高位。如果单词拼写错误,请尝试较低的波特率。对于波特率、奇偶校验或位/字符不兼容的情况,您会看到很多相同的“错误字符”,这些字符表示由于奇偶校验或波特率错误而无法正确显示的真实字符。“错误字符”可能是倒问号或一些其他奇怪的字符,例如矩形。

如果您正在使用 agetty(通常只称为 getty),则如果您键入某些内容,agetty 程序将检测并设置奇偶校验和/或位/字符。尝试按回车键看看是否可以修复它。

19.10 没有登录提示符

如果在多次敲击回车键后没有显示登录提示符,请检查以下内容:使用 “top” 或 “ps” 程序确保 getty(或 login)进程实际上在终端上运行。终端是否已通电?零调制解调器电缆是否已插入终端和计算机上的正确端口?

检查 getty 是否因没有 CD 信号(或电缆中没有 CD 线)而挂起。如果不存在这样的 CD 信号,您应该通过以下方式为 getty 指定 “local”

如果 getty(或 login)未运行,请仔细检查在 /etc/inittab 中调用 getty 的格式。确保它包含当前的运行级别(通过键入命令 “runlevel” 显示)并且对于您使用的 getty 版本有效。有时杀死 getty 或 login(它将自动重启)会有所帮助。

终端曾经工作正常

虽然硬件故障是可能的,但问题很可能是由于某人错误地做了一些事情。是否有人做了可能导致电缆松动的事情?是否有人修改了 /etc/inittab 或对软件进行了其他更改,以阻止终端登录?如果这不能揭示原因,请继续阅读。

更多诊断

上述方法应该可以解决大多数情况(除非您刚刚安装了终端)。其他原因包括硬件或电缆(必须是文件传输)缺陷、终端设置波特率错误、终端处于本地模式等。此时,有两种不同的方法(您可以同时采用多种方法)。

从控制台诊断问题

一个测试是尝试将某些内容复制到终端(最好在安装过程开始时,在设置 getty 之前尝试这样做)。您可以使用 Linux 复制命令,例如:“cp file_name /dev/ttyS1”。或者您可以使用:“echo any_word > /dev/ttySx”。如果它不起作用,请使用 stty 使接口尽可能简单,并禁用所有功能(例如硬件流量控制:-crtscts;奇偶校验和调制解调器控制信号:clocal)。确保波特率和位/字节相同。如果没有任何反应,请按照下一节中的说明使用电压表验证端口是否正常。

测量电压

如果您手头有电压表,请检查文件传输电缆终端侧的引脚 3 或 2(接收数据)处是否有负电压(-4v 至 -15v)。仪表的正极应连接到良好的接地(电缆末端的金属连接器可能未接地)。如果没有这样的负电压,请检查计算机上的发送引脚 (TxD) 处是否有负电压(有关引脚排列,请参阅 DB9-DB25 章节)。如果此处存在负电压,但在终端的接收引脚 (RxD) 处不存在,则电缆不良(连接松动、电线断裂或不是文件传输,即零调制解调器)。如果计算机上没有此电压,则其串行端口已死。使用软件诊断测试对其进行测试或更换它。

如果串行端口正常,您可能需要向其发送文件(禁用调制解调器控制),并使用电压表(或其他电子设备)观察信号。要使用电压表检查发送的信号,请检查线路空闲时是否有稳定的负电压。然后开始发送文件(或启动 getty)。在模拟仪表上,您应该看到指针降至接近 0 并围绕 0 波动,因为它测量位流的短期平均值。在数字仪表上,您不会很好地看到波动,但您可以切换到交流电档位以查看位流产生的交流电压。如果您的仪表无法在交流电档位上阻止直流电(大多数模拟仪表的默认设置),那么在交流电档位上查看 -12v(或 -5v)的空闲直流电时,您可能会获得错误的较高交流读数。如果没有仪表,您可以将已知良好的设备(例如另一个终端或外部调制解调器)连接到串行端口,看看它是否工作正常。

19.11 显示外文/奇怪的字符/符号

不要将此与 显示转义序列 混淆。如果您键入或在屏幕上看到的内容与预期不符,但看起来像外文字母、数学符号、线条绘制字符等,则可能是发送到您终端的许多字节的高位已设置(当它不应该设置时)。您正在查看字符集(或字符集的一部分),该字符集已设置高位。如果您设置了错误的波特率或错误的奇偶校验(通过 stty 设置),则可能会发生这种情况。如果您通过 stty 设置了奇偶校验,但终端内部是 8 位无奇偶校验,则高位(= 奇偶校验位)通常会被错误地设置。尝试从另一个终端运行 stty -F /dev/ttyS? 以检查波特率和奇偶校验是否正确。

可能是安装了错误的字符集(字体)。发送到终端的错误转义序列可能已切换字符集。如果您正在使用 mapchan 程序更改键盘映射,则它可能是错误的。

19.12 显示转义序列

您可能会看到类似 “5;35H22,1” 或 “3;4v” 或 “1;24r” 或 “^[[21;6H” 等等。当然,数字和字母会有所不同。它们会散布在周围(随机地或以一种奇怪的顺序)。显示器看起来会很混乱,并且可能会有其他缺陷。某些应用程序和命令将导致显示损坏。

您看到的是发送到您的终端以控制它的转义序列(或其片段),但您的终端无法识别它们并将它们传递到屏幕上。您使用的程序很可能错误地认为您正在使用另一种类型的终端。因此,它发送您的终端无法理解的转义序列。这有时会对您的显示器造成奇怪的影响。检查 TERM 环境变量是否设置正确(键入:echo $TERM)。

Telnet

如果您使用 telnet,则正确获取 TERM 的问题可能会更复杂。Telnet 不模拟终端,而是将 TERM 变量的值传递给远程计算机。如果远程计算机不支持您类型的终端,或者将 TERM 的值更改为错误的值(在远程计算机上),则会出现问题。Telnet 最初应该在远程计算机上正确设置 TERM 的值。但是,TERM 值的更改(在远程计算机上)可能是由于那里的 shell 配置文件不正确造成的。首先要做的是检查 TERM 的值,包括在您的计算机和远程计算机上。以上内容过于简化,因为您的 telnet 客户端可能会向远程服务器提供您的计算机支持的可能的 TERM 值列表(如果 telnet 知道您的计算机可以模拟多种终端类型)。

终端设置为显示转义序列

另一个可能的原因是您的终端恰好处于一种特殊模式,在该模式下它显示转义序列而不是执行它们。然后您也会在屏幕上看到它们,但它们将以有序的方式显示。这种模式更准确地说是一种显示控制代码的模式。但是,由于每个转义序列都以控制代码(“转义”字符)开头,因此终端无法识别整个转义序列,并将其传递到屏幕上。请参阅 控制代码 章节。

19.13 缓慢:字符突发之间有几秒钟的停顿

您可能错误地设置了中断> 请参阅 Serial-HOWTO 中以 “Slow:” 开头的章节

19.14 光标跳动

当您期望光标移动到下一个字符时,但实际上它似乎跳到另一个字符时,会发生此错误。当您在 vim 编辑器中选择 “showmatch” 以突出显示匹配的括号(或圆括号)时,可能会发生这种情况。终端没有任何问题,光标也没有跳动,但看起来好像是这样。

正在发生的事情是光标是反向视频,突出显示也是反向视频。因此,假设您通过反向视频突出显示(或强调)一个字符,然后在其上放置一个反向视频光标。光标的反向视频将反转字符的现有反向视频,并产生正常视频。结果是光标和字符突出显示都为该字符消失了,并且光标是不可见的(直到您将其移动到未突出显示的字符)。

好的,所以光标突然消失了,但是是什么让它跳动呢?对于 vim “showmatch”,当您将光标移动到左括号时,它也会突出显示右括号。因此,右括号突然变成反向视频,看起来就像光标跳到那里一样,但实际上并没有。当您将光标移动到右括号(或圆括号)时,也会发生类似的“错觉”。当您反转反向视频时,这种错觉会发生在除了刚刚呈现的 vim 示例之外的其他情况下。

19.15 终端不滚动

一个原因可能是 terminfo 出现问题。另一个原因可能是您超出了为终端设置的滚动区域。一些愚蠢的程序只是假设您的终端有 24 行,并为 24 行设置滚动区域(通过发送到终端的转义序列),而没有查阅 terminfo 以查看实际有多少行。然后,当您使用另一个程序时,它可能会将光标留在第 25 行,光标会陷在那里,并且终端将不会滚动。为了避免此问题,请创建一个环境变量 “export LINES=25”,并同时运行 “stty -F /dev/ttySx rows 25”。然后,假设有 24 行的程序有望使用 25 行并相应地设置滚动区域。

19.16 串行监控/诊断

一些 Linux 程序将监控调制解调器控制线,并指示它们是正 (1) 还是负 (0)。

您可能已经拥有上述程序。如果没有,请访问 串行软件 章节。使用这些程序时,请记住您看到的是主机上线路的状态。终端上的情况会有所不同,因为电缆中通常缺少一些电线,而其他电线则交叉。截至 1998 年 6 月,我不知道 Linux 中有任何用于串行端口的诊断程序。

19.17 本地模式

在本地模式下,终端与计算机断开连接,并像打字机一样工作(只是它不在纸上打字,而是在屏幕上打字)。返回在线模式会重新连接到计算机,使您可以从进入“本地”模式时离开的位置继续活动。这对于测试终端和教育目的都很有用。对于某些终端,没有“本地模式”,但“块模式”可以替代它。如果没有“块模式”,“半双工”模式可能会起作用,但您键入的内容也会发送到计算机。在这种情况下,计算机可能会回显发送给它的字符,从而导致您键入的每个字符在屏幕上显示两个字符。为了防止这种情况,您可以关闭计算机、断开 RS-232 电缆等。

在本地模式下,您可以键入转义序列(以 ESC 键开头)并观察它们的作用。如果终端在本地模式下工作不正常,则当连接到计算机时,它不太可能正常工作。如果您不确定转义序列的作用,可以在本地模式下试用它。您也可以使用它来试用待售的终端。要在某些终端上进入本地模式,您首先进入设置模式,然后从菜单中选择 “local”(或按某个键)。请参阅 进入设置(配置)模式 章节。

19.18 串行电气测试设备

分线盒等

虽然对于少数串行端口,您可能只需要一个万用表(用作电压表),但已经制造出简单的特殊测试设备来测试串行端口线路。有些称为 “分线盒 ...”,其中分线盒意味着从电缆中分出导体。这些小工具有两个连接器,它们连接到串行端口连接器(在串行电缆的末端或 PC 的背面)。有些有用于连接电压表的测试点。另一些有 LED 灯,当某些调制解调器控制线被置位(打开)时,LED 灯会亮起。灯的颜色可以指示信号的极性(正电压或负电压)。还有一些有跳线,因此您可以将任何电线连接到任何电线。有些有开关。

Radio Shack(在 2002 年)销售 “RS-232 Troubleshooter”(以前称为 “RS-232 Line Tester”)Cat. #276-1401。它检查 TD、RD、CD、RTS、CTS、DTR 和 DSR。绿灯表示开启 (+12 v),红灯表示关闭 (-12 v)。他们还销售 “RS-232 Serial Jumper Box” Cat. #276-1403。这允许您以您选择的任何方式连接引脚。这两件商品都属于 “外围设备连接助手” 的标题下。不幸的是,它们未在印刷目录的索引中列出。它们与 D 型连接器在同一页上,因此请在索引中查找 “Connectors, Computer, D-Sub”。名为 “Active Components” 的连锁店可能有售。

测量电压

任何电压表或万用表,即使是最便宜的,售价约为 10 美元,也应该可以正常工作。尝试使用其他方法检查电压是很棘手的。除非 LED 具有串联电阻以降低 LED 上的电压,否则不要使用 LED。470 欧姆电阻用于 20 ma LED(但并非所有 LED 都是 20 ma)。LED 仅在特定极性下才会亮起,因此您可以测试 + 或 - 电压。是否有人制造用于汽车电路测试的此类小工具?如果您尝试使用逻辑探头,它们可能会损坏,因为它们设计的 TTL 电压仅为 5 伏。尝试使用 12 V 白炽灯泡不是一个好主意。它不会显示极性,并且由于 UART 的输出电流有限,它甚至可能不会亮起。

要在母连接器上测量电压,您可以将弯曲的回形针插入所需的开口中。回形针的直径应不大于引脚,以免损坏触点。将鳄鱼夹(或类似物)夹在回形针上以进行连接。注意不要同时用任何金属物体触摸两个引脚。

品尝电压

作为最后的手段,如果您没有测试设备并且愿意承担触电(甚至电击)的风险,您始终可以品尝电压。在用舌头触摸其中一个测试引线之前,先测试它们以确保它们上没有高压。同时用两根引线触摸一只手,看看它们是否会电击您。然后,如果没有电击,请舔湿皮肤接触点并重复。如果此测试给您带来电击,您当然不想使用您的舌头。

为了测试 12 伏电压,舔一下手指,用湿手指握住一根测试线。将另一根测试线放在你的舌头上。如果舌头上的测试线是正极,将会有一种明显的味道。你可以先用手电筒电池尝试一下,这样你就知道味道是什么样的了。


下一页 上一页 目录