?? 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 + -