📄 serial-howto.txt
字号:
可取得. 另外一支叫 xprt 的程式也能做到.它可在 [68]ftp://sunsite.unc.edu/pub/Linux/system/printing 找到. 11.5 Linux 能不能够自动地配置串列设备? 可以.要让 Linux 在启动的时候自动地侦测并且设定串列设备的话,把这一行: /sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig 加到你的 /etc/rc.d/rc.local 或是 /etc/rc.d/rc.serial 档案里面. 对每一 个你希望自动配置的串列埠都要做.要确定所给的是一个真正存在於你电脑上的 设备名称. 多埠卡的注意事项 对於卡的位址,以及 IRQs 查阅 setserial 程式随附的 rc.serial. 它有很多 关於多埠卡的细节,包括输出入位址以及设备名称. 11.6 使用串列控制台 在第三十六期的 Linux Journal 在 [69]http://www.ssc.com/lj/issue36/index.html 有篇文章解释如何使用串列控 制台(serial console). 不幸的是,寄电子邮件给作者都被退回.我希望这篇文 章会很快地上述 URL 的 Linux Journal 网站中. 11.7 更高的串列流量 如果在一部使用 (E)IDE 磁碟机的系统上你发现流量很慢而且串列埠常溢满,你 可以取得 hdparm. 这是一个可以修改 (E)IDE 参数,包含让一磁碟 IRQ 动作期 间其它 IRQs 仍可工作. 这会改善反应速度并帮助消除溢满.确定小心地读过了 线上手册,因为某些磁碟/控制卡组合不喜欢它并且可能损毁档案系统. 也可以看一下一个叫 irqtune 的工具,可以改变一个装置 IRQ 的优先顺序,例 如你数据机所在的串列埠.这也可能改善你系统的串列流量. irqtune 的常见问 题解答(FAQ)可在 [70]http://www.best.com/~cae/irqtune 找到. 12. 更进一步... 这一节并不需要阅读,但是可能带给你一些对於 Unix 以及电子通讯世界更进一 步的了解. 12.1 什麽是锁定档案(lock files)? Lock files 只是单纯的一个档案用来表示某个特定的设备正在使用中. 它们保 存在 /usr/spool/uucp 或是 /var/lock 里面. Linux 的 lock files 名字都是 LCK..name,其中的 name 不是设备名称就是一个 UUCP 节点名称. 有些程序建 立这些 locks 以便让它们自己可以独占该设备的存取权. 例如如果你从你的数 据机拨号出去,将会出现一个 lock 告诉其它程序现在已经有人正在使用数据机 . Lock files 里面主要是包含锁住该设备的程序的行程号码(PID). 大部份的 程式会查阅 lock,然後检查行程表(process table)中锁定该设备的行程来试著 决定这个 lock 是否仍然有效. 如果发现这个 lock 是有效的话,这个程式(应 该)要结束. 如果不是,某些程式会删除过时的 lock,然後使用该设备,并在行 程执行时建立他们自己的 lock. 其它的程式就只好结束并告诉你该设备正在使 用中. 12.2 ``baud'' 对 ``bps'' ``baud'' 跟 ``bps'' 可能是电脑/电子通讯这个领域里最常被错用的术语之一. 当它们事实上并不相同的时候,很多人仍交替使用这些术语. 鲍率(baud) 鲍率是每秒钟数据机(调变解调器,modulator-demodulator)送出多少次 讯号改变的度量. 例如,鲍率为 1200 的含意是信号每隔 833 微 秒(microsecond)即改变一次. 普遍的鲍率有 50, 75, 110, 300, 600, 1200 以及 2400.大部份的高速数据机所使用的鲍率为 2400. 因为语音 级(voice-grade)电话线路的频宽限制,超过 2400 的鲍率很难达的到, 而只能在非常纯净的电话线品质下才能运作. ``baud''一词在 Emile Baudot 之後才有,他是非同步电报印表机(asynchronous telegraph printer)的发明者. 每秒传输位元(bps) 每秒位元传输率是每秒钟传输多少位元的度量.普遍每秒位元传输率有 50, 75, 110, 300, 1200, 2400, 4800, 9600, ... 115200. 在使用 V.42bis 压缩(压缩最大率 4:1)的数据机下,理论上每秒位元传输率可以 高达 115200. 这是许多人在错用 ``baud'' 这个字时所指的意思. 所以,如果高速数据机以 2400 baud 运作,它们如何能够传送 14400 bps? 数据 机对每个 baud 编码来表示某一数量的位元而使得 bps 能大於 baud. 这样一来 ,当二个或更多位元编码成一个 baud 的时候,bps 就会超越 baud. 如果你的 数据机是以 14400 bps 连线的话,它将会以 2400 baud 的速度每个 baud 传送 六个位元. 这个混淆是怎麽样开始的? 嗯,回到今天的低速数据机还是昨天的高速数据机那 个时代,每秒位元传输率跟信号改变率实际上是完全相等的. 每个 bit 编码成 一个 baud.人们交替使用 bps 以及 baud 是因为它们的数字相同. 例如一台 300 bps 的数据机其信号改变率也是 300. 当高速数据机普及後一切都改变了, 而且每秒位元传输率超过了信号改变率. 12.3 什麽是 UARTs? 它们如何影响效能? UARTs (通用非同步接收转换器,Universal Asyncronous Receiver Transmitter)是你 PC 串列卡上的晶片. 它们的功用是把资料转成位元,将这 些位元送上串列线路,然後在另一端重新建立资料. UARTs 是以位元组为单位处 理资料,很方便地也是美国标准交换码(ASCII)的字元大小. 假定是你有一台连接到你 PC 的终端机.当你键入一个字元时,终端机把它交给 它的转换器(也是 UART 的一种). 该转换器以指定的速率把这个位元组送到串列 线路上,每次一个位元. 在 PC 这一端,接收位元的 UART 拿走所有的位元,然 後重新组成位元组并且放到缓冲区里去. 有两种不同的 UARTs 类型.你可能有听过愚蠢的(dumb)UARTs - 8250 还有 16450,以及先进先出式 UARTs - 16550A. 要了解它们的不同,首先让我们来检 验当 UART 送出或接收一个位元组时所发生的事. 这 UART 本身并不能对资料做什麽处理,它只是送出以及接收它. 每次送出或接 收一个位元组时,CPU 都会从串列设备接到一个中断. 然後 CPU 就把接收到的 位元组从 UARTs 的缓冲区搬到记忆体的某处,或是提供另一个位元组给 UART 传 送. 8250 以及 16450 UARTs 只有一个位元组的缓冲区.这个意思是,每送出或 接收一个位元组就会中断 CPU 一次. 在低速的情况下这样没有问题.但是在高 速的传输率下,CPU 会忙於处理 UART 而没有时间照料其它工作. 在某些情况下 ,CPU 没有足够的馀裕及时处理中断服务,该位元组将因资料如此快速地传入而 被覆写. 这就是 16550A UARTs 有用的地方.这些晶片具有 16 个位元组的先进先出伫列 . 这个意思是它在必须中断 CPU 之前可以接收或转换达 16 个位元组. 它不仅 是能等,而且 CPU 现在也可以同时传送全部 16 个位元组的资料. 虽然中断界 限(threshold)很少有设到 16 的,这对於其它只有一个位元组缓冲区的 UARTs 而言仍然是一个重要的优点. CPU 收到较少的中断,因此可以自由地做其它事情 .资料不会漏失,每个人都很高兴. (也有 16550 这个 UART,但是它跟 16450 一样因为它有问题.) 一般来说, 8250 以及 16450 UARTs 应该能够胜任高达 38400 bps 的工作速率 . 在高於 38400 bps 的速率下,你可能开始见到资料漏失. 其它的 PC 作业系 统(这里的定义很宽松),像 DOS 并非是多工的,所以它们有可能可以用 8250 或 16450s 却应付的更好. 这就是为什麽有些人并没有看到资料漏失,直到他们改 用 Linux 才发生. 无-UART(Non-UART)以及智慧型多埠卡使用数位处理机(DSP)晶片来处理额外的缓 冲以及控制,如此更能减轻 CPU 的负担. 例如,Cyclades Cyclom 及 Stallion EasyIO 这些卡使用 Cirrus Logic CD-1400 RISC 晶片,还有许多卡使 用 80186 CPU 或更特别的 RISC CPU 来处理串列输出入. 心里要记得,这些愚蠢型的 UART 并非是坏的,只是它们不适合做高速传输. 当 你将终端机或滑鼠连接到这些 UARTs 时应该不会遭遇困难. 但是对高速数据机 而言,16550A 可以说是必须的. 你可以花多一点点的钱购买有 16550A UARTs 的串列卡,只要询问电脑商该卡所 使用的是什麽型号的 UARTs 即可. 或者你想升级你现在的卡,你可以只要简单 地购买 16550A 晶片并且置换你现在的 16450 UARTs 晶片. 它们的脚位相 容(pin-to-pin compatible).有些卡有 UARTs 插槽来作这个用途使用. 如果不 是的话你可以焊接.注意,如果你有钱,买一张新卡将可能会省掉你许多麻烦, 它们在 $50 元美金以下. 13. 故障排除13.1 我不断地收到 ``line NNN of inittab invalid'' 要确定你对你的 init 版本使用正确的文法.这里所没有的一些 init 会在 /etc/inittab 档案里使用不同的文法. 要确定你对你的 getty 版本使用正确的 文法. 13.2 当我试著拨号时,它说 ``/dev/cuaN: Device or resource busy'' 这个问题可能发生在 DCD 或 DTR 没有设定正确的时候. DCD 应该只在真的有连 线时(像是有人拨接进来)才被设定,而不是在 getty 持续监看该埠的时候. 检 查并确定你的数据机正确地配置成只在真正连线时才设定 DCD. DTR 应该在任何 东西使用或监看线路时设定,像是 getty, kermit, 或其它通讯程式. 另一个引起 ``device busy'' 错误的普遍原因是你设定你的串列埠使用一个已经 被某种其它东西使用的中断. 在每一个设备初始化的时後,它会要求 Linux 允 许它使用它的硬体中断. Linux 持续追踪那个中断被指定给谁,而如果你的中断 已经被占用,你的设备将不能适当地初始化. 该设备真的并没有什麽办法告诉你 发生的这件事,除了当你尝试去使用它的时候,它会回应 ``device-busy'' 错误 讯息. 检查你所有的卡(串列,乙太网路,SCSI 界面等等).找寻硬体中断冲突 的地方. 13.3 我持续接到 ``Id SN respawning too fast: disabled for 5 minutes'' 确定你的数据机有正确的配置.查看暂存器 E 和 Q. 这可能发生在你的数据机 跟 getty 沟通的时候. 确定你正确地从 /etc/inittab 呼叫 getty. 使用错误的文法或设备名称将会引 起严重的问题. 以下法检查你的 /etc/gettydefs 文法是否正确: linux# getty -c /etc/gettydefs 这也可能发生在 uugetty 初使化失败时.参阅 [71]getty 或 uugetty 仍然无法 运作 一节. 13.4 串列设备很慢或是串列设备只能单向传送 你的硬体中断可能有冲突.确定没有硬体中断是被分享的. 检查你所有的卡(串 列卡, 乙太网路卡, SCSI 等等)确定你串列设备配的跳接设定以及 setserial 参 数是正确的. 同时检查 /proc/ioports 及 /proc/interrups 以确定是否有冲突 发生. 13.5 我的数据机在某人断线後瘫痪或是 uugetty 并没有重新执行 这在 DTR 讯号掉下而你的数据机没有重置时会发生. 这个问题在我身上发生的 时候我看到我的 RD 跟 SD LEDs 疯狂地闪烁.你需要让你的数据机重置. 大部 份的 Hayes 相容数据机使用 &D3 来做这件事,但是在我的 USR Courier 上,我 得要设 &D2 以及 S13=1.查阅你的数据机手册. 13.6 我将我的终端机连到我的 PC 上,但是在我输入签入名称之後,它就锁住不动 * 如果你使用 getty: 在你的 /etc/gettydefs 项目里可能没有设 CLOCAL 给 终端机,而且可能你用的并不是完整的 null modem 连接线. 你需要 CLOCAL 来告诉 Linux 忽略数据机控制信号.它看起来像这里这样: # 38400 bps Dumb Terminal entryDT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #@S @L login: #DT38400# 19200 bps Dumb Terminal entryDT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login: #DT19200# 9600 bps Dumb Terminal entryDT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S @L login: #DT9600 接下来,用 kill 砍掉该 getty 行程这样新行程会以新的项目产生. * 如果你使用 agetty: 加上 -L 旗标到你的 /etc/initab 中的 agetty 那行 . 这会使得它忽略数据机控制信号.然後键入 init q 以重新执行 init. 这个项目看起来像这样: s1:345:respawn:/sbin/agetty -L 9600 ttyS1 vt10013.7 在高速下,我的数据机漏失资料 如果你尝试在大於 38400 bps 的速率下使用你的数据机,而你并没有 16550A UARTs 的话,你应该要将它们升级. 有关 UARTs 的说明参阅 [72]什麽是 UARTs? 一节. 13.8 在系统启动时,Linux 没有依照我的配置回报串列设备. 这是事实.Linux 在系统启动时并没有做任何的 IRQ 侦测,它只做串列设备侦测 . 所以,不要理会它所显示有关硬体中断的部份,因为它只是假定使用标准的硬 体中断. 这是因为硬体中断侦测不可靠,而且可能被瞒骗而这样做的. 所以即使我的 ttyS2 设在 IRQ5,我仍然看到 Jan 23 22:25:28 misfits vmunix: tty02 at 0x03e8 (irq = 4) is a 16550A 在 Linux 启动时,你必须使用 setserial 来告诉 Linux 你所使用的硬体中断. Linux 启动後,你可以查看 /proc/interrupts 档以了解真正被配置的 IRQ 是什 麽. 13.9 当我使用我的数据机叫用 Linux 机器时 rz 以及/或是 sz 不动 如果 Linux 在你尝试传送档案时会寻找 /dev/modem 的话,查看 /etc/profile 以及 /etc/csh.cshrc. 某些发行套件会在这些地方定义一些别名,最著名的是 Slackware. 这些别名扰乱了 zmodem 程式.把它们拿掉或是更正它们. 13.10 我的萤幕印出看起来很好玩的字元 这在当你把二进位资料送往萤幕的时候会发生在虚拟控制台上,或者有时候会发 生在串列连线上. 修复这个问题的方法是输入 echo ^v^[c.因为控制字元之故 ,它是: linux% echo <ctrl>v<esc>c13.11 getty 或 uugetty 仍然无法运作 getty_ps 上有个 DEBUG 选项.编
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -