Serial 通訊

這一章主要是在討論 FreeBSD 上有關 serial 通訊的問題。有關 PPP 以及 SLIP 的問題是放在 這一節。 我要怎麼知道 FreeBSD 是不是有抓到我的 serial port?

當 FreeBSD 開機的時候,它會根據您在 kernel 中的設定來偵測您的 serial port。您可以在這些訊息出現的時候檢查,也可以在系統開機之後用 下面的指令來觀察: dmesg | grep sio

這裡有一些輸出的範例: sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A

這代表您有兩個 serial port。第一個 port 佔用 irq 4,port address 是 我要怎麼知道 FreeBSD 是不是有抓到我的 modem 卡?

請看上一個問題。 我升級到 2.0.5 以後我的

不要緊張,它們已經被併到 我要如何在 FreeBSD 下存取 seral ports?

第三個 serial port, (就是 DOS 下的 COM3) ,以 dial-out 裝置來看是位於 /dev/cuaa2 ,而以 dial-in 裝置來看則是位於 /dev/ttyd2 。這兩個裝置有什麼不同 呢?

您在 dial-in 時使用的是 /dev/ttydX 時,會有一隻 process 在對應的 我要如何啟動對 serial 多埠卡的支援?

同樣的,在 kernel 設定那一節有提到有關設定 kernel 的資訊。要設定一 張 serial 多埠卡,您必需在您的 kernel 設定檔中為每一個 serial port 都設一行 的設定。但是您只能在它們之中選一個來設定 irq 以及 vector 。卡上的所有 port 會共享同一個 irq 。一般來說我們都把它設在最 後一個 serial port 上。不要忘了指定 下面是一個把 AST 4-port 卡 設在 irq 7 的例子: options "COM_MULTIPORT" device sio4 at isa? port 0x2a0 tty flags 0x781 device sio5 at isa? port 0x2a8 tty flags 0x781 device sio6 at isa? port 0x2b0 tty flags 0x781 device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr

這裡的 flags 設定是指 master port 的 minor number 是 7 ( FreeBSD 可以控制多張 serial 多埠卡使用同一個 irq 嗎?

還沒支援。您必需為每張卡設定不同的 irq 。 我可以為 port 設定預設參數嗎?

通常您會想為您的應用程式開啟 stty -a -f /dev/ttyd1

當您改變了某個裝置的設定後,這些設定會一直作用,直到這個裝置被關閉 了為止。當它被重開啟後,又回到原先的預設值了。如果想要改變預設值,您 可以開啟並修改 ``初始狀態'' 裝置的設定。舉例來說,如果您想改變 ttyd5 的預設值,把 XON/XOFF 流量控制,您可以這樣做: stty -f /dev/ttyid5 clocal cs8 ixon ixoff

您可以在 /etc/rc.serial 裡做這樣的設定。現在每一個開啟 您也可以藉由設定 ``鎖定狀態'' 裝置來防止其他應用程式去更動這些設定 。舉例來說,想要把 stty -f /dev/ttyld5 57600

這樣一來,每一個開啟 當然,您必需確定您的初始狀態以及鎖定狀態的裝置只能被 這個 script 並 我要怎樣才能讓 modem 接受 dialup 登入呢?

您是不是想當 ISP?首先,您要有一部以上可以自動接聽的 modem。您的 modem 必須要有 carrier-detect 的功能。它也要能夠在 data terminal ready (RTS/CTS 流量控制或是不做任何流量控制。最後,它必須能夠在電 腦和它自己的傳輸中使用定速,但是在它和遠端 modem 的連線方面則要有協 商傳輸速度的能力。

對 Hayes 指令集相容 modem 來說,下面的指令會把上一段所講的全部設好 並存在非揮發性記憶體中: AT &C1 &D3 &K3 &Q6 S0=1 &W

看看下面的 這一節可以得 更多有關如何不利用 MS-DOS 終端程式來做這些設定的資料。

接下來,在 為您的 modem 做設定。列在這個檔案中的是所有系統會 待 login 的 ports 。像下面這樣加入一行: ttyd1 "/usr/libexec/getty std.57600" dialup on insecure

這一行指令第二個 serial port (/dev/ttyd1) 是一個以 57600 bps 速度在傳輸的 modem,並且不做同位檢查 ( 檔裡指定的) 。這個 port 的終端機型態是 ``dialup'' 。這個 port 設成 ``on'' 而且是 ``insecure'' 的 --- 意思是 root 不能從這裡連線進來。您必需為每個 dialin port 都做類似 通常我們會用 ``dialup'' 來做為終端機型態。如果使用者登入時的啟始型 態是 dialup 的話,很多使用者都會在他們的 .profile 或是 .login 檔中設 定他們真正的終端機型態。上面的例子中我們舉的是 insecure 的例子。如果 您想要在這個 port 變成 root 的話,您必須用一般使用者的身份登入,然後 ``'' 成 在對 做過修改之後,您必須送一個 hangup 或是 process: kill -HUP 1

這樣會強迫 init process 去重讀 。 然後 init process 就會在所有的 ``on'' port 上重新啟動 getty process 。您可以用下列指令來檢查您的 port 是不是可以 login 了 ps -ax | grep '[t]tyd1'

您會見到類似這樣的結果: 747 ?? I 0:00.04 /usr/libexec/getty std.57600 ttyd1 我要怎麼把 dumb terminal 連上 FreeBSD?

如果您要把別的電腦當成是 FreeBSD 的終端機的話,您只需要在兩者的 serial port 之間牽一條 null modem 排線即可。如果您有一個真的終端機 的話,看看它的指令集吧。

然後,像上一個問題一樣修改 。舉例來說,如果您把一個 WYSE-50 終端機接在第五個 serial port 上的話,就要用這樣的設定: ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure

這個例子示範的是 /dev/ttyd4 所代表的 port 用的是 wyse50 終 端機,連線速度 38400 bps,不使用同位檢查 ( 設定的) 而且 為什麼我不能執行

在您的系統中, 很可能只能由 使用者和 另外一種方法是,您可以讓您系統上所有使用者都可以執行 # chmod 4511 /usr/bin/cu # chmod 4511 /usr/bin/tip FreeBSD 不支援我的 stock Hayes modem --- 我要怎麼辦?

事實上, 的 man page 已經過時了。一般的 Hayes dialer 已經內建在系 統內。您只要在 指定 ``可惜的是,Hayes 的驅動程式不夠聰明,有些新 modem 上的進階功能它無法 辨識出來 --- 例如 的時候必須 把它們關掉 (用 還有,事實上 /usr/src/usr.bin/tip/tip 目錄裡的 把 `` 我什麼時候要直接鍵入 AT 指令?

在您的 檔裡加一個 ``/dev/cuaa0,則您要加入下面 這一行: cuaa0:dv=/dev/cuaa0:br#19200:pa=none

在 br 欄中設定您 modem 所支援的最高速。之後,鍵入 之後 您就連上您的 modem 了。

如果您的系統上沒有 /dev/cuaa0 ,您就先這樣: # cd /dev # ./MAKEDEV cuaa0

或是您可以用 root 執行 cu 指令,像這樣: # cu -l``line'' -s``speed''

這裡的 line 是指您的 serial port (例如 /dev/cuaa0) ,speed 是指您的傳輸速度 (例如 57600) 。如果您下完 AT 指令後,鍵入 ~. 可以離開。 pn 欄中的

電話號碼欄中的 找電話號碼。但是 這類檔案中的特殊字元。您可以加上反斜線: pn=\@ 我要怎麼在命令列下撥電話呢?

在您的 放一個 `` tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:

然後您就可以像 `` 的話,使用 generic cu 欄位: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:

然後輸入 `` 我每次用的時候都要輸入 bps 速度嗎?

您可以使用類似 認為 1200 bps 是一個很好的預設值,這也就是為什麼要叫做 `` 透過一台 terminal server 來存取主機。

除了每次等您連上 server 並鍵入 `` pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cua02:br#38400:at=hayes:du:pa=none:pn=5551234:

可以讓您只打 `` tip 可以在一次連線中選擇多台機器嗎?

通常這個問題發生在:一間大學有一些 modem ,而且有上千名學生要用...

裡為您的大學設一個欄位,並使用 \@ 作為 它的 big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:

然後,把大學的撥接電話放在 中: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114

會依照表列的順序依次嚐試,最後放棄。如果您要一直試的話,您可以在 while 迴圈裡執行 為什麼我按兩次 CTRL+P,可是卻只送出了一個 CTRL+P?

CTRL+P 是內定的 ``force'' 字元,用來告訴 下一個字元 是一般字元。您可以藉由 鍵入 ``您也可以在 $HOME/.tiprc 中設定 force character: force= 突然間我打的東西都變成大寫了??

您應該是按到了 CTRL+A,在 中為沒有 caps-lock 鍵的使用者所設計的 ``raise character''。您可以像上個問題 一樣利用 下面是一個為 Emacs 使用者所設定的 .tiprc ,Emacs 使用者常常會用到 CTRL+2 和 CTRL+A: force=^^ raisechar=^^

^^ 就是 SHIFT+CTRL+6 。 我要如何使用

如果您的對像也是 UNIX 系統的話,您可以用 來收送檔 案。用法是: ~p [] ~t []

它不會做錯誤檢查,所以您最好用別的通訊協定,例如 zmodem 。 我要怎麼用

首先,從 ports 中選一個 zmodem 程式來安 裝 (例如在 comms 目錄下的 或是 ) 。

在接收檔案方面,您要先在遠端啟動傳送程式。然後按 enter 再鍵入 ``在傳送檔案方面,您要先在遠端啟動傳送程式。然後按 enter 再鍵入 `` 就算我設定無誤,FreeBSD 好像還是找不到我的 serial port?

如果您的主機板或是卡上有用到 Acer 的 UART 晶片的話,FreeBSD 在開機時 的 sio 偵測可能會不正確。您可以從 找到 patch 來修正這個問題。