串列埠的原理與應用


[ 平行傳輸介面 ] [ 印表機控制字元與命令的操作 ] [ 串列埠的原理與應用 ] [ 串列埠上的小精靈 -- 滑鼠 ]

 

 

 

 

 

 

 

 

 

IN00534A.gif (3349 bytes)人電腦上所使用 RS-232 通訊介面上的非同步串列埠, 能將平行格式的資料轉換成一系列循序的資料, 以便於電腦與電腦或電腦與週邊設備之間之通訊, 通常個人電腦上用串列埠連接的週邊設備有串列印表機、滑鼠以及外部數據機等等。串列埠和平行埠兩者最大的不同點乃在於其傳遞資料的方式: 如果用的是平行連接的方式, 則資料以位元組為單位同時由平行埠傳送出去, 若採串列埠則資料會轉換成連續的資料位元, 然後依序由埠送出, 接收端收集這些資料後再將其合成為原來的位元組。RS-232 用來作序列傳輸的控制晶片稱 UART (Universal Asynchronous Receiver Transmitter), 一般使用 INS 8250 或其相容晶片。

RS232 共定義 25 個傳輸時使用的訊號, 可是 PC 祇使用其中的 9 個訊號, 所以雖然外接的 D 型轉接器分 9-PIN 和 25-PIN 兩種, 可是後者也僅是使用了 9 個信號而已, 剩下的則保留未用, 對應方式為:

信號意義 9-PIN 模式 25-PIN 模式
DCD (Data Carrier Detect) 1 8
RxD (Receive Data) 2 3
TxD (Transmit Data) 3 2
DTR (Data Terminal Ready) 4 20
GND (Signal Ground) 5 7
DSR (Data Set Ready) 6 6
RTS (Request To Send) 7 4
CTS (Clear To Send) 8 5
RI (Ring Indicator) 9 22

各信號線在資料傳輸時的實際作用為:

DCD 資料載波偵測,表 MODEM 已偵測到載波信號
RxD 接收資料
TxD 傳送資料
DTR 接收終端機備妥,表 UART 已和 MODEM 連接上
GND 訊號用接地
DSR 傳送端資料備妥,表 MODEM 已和 UART 建立連線
RTS 要求傳送資料,UART 已可和 MODEM 交換資料
CTS 可送訊息,MODEM 已準備進行資料交換
RI 顯示 MODEM 已收到電話鈴響

 
當兩台電腦在遠距離互傳資料時可能就必須真的透過 MODEM 和電話線所構成的網路, 但如果是短距離的連線則可以僅利用一條線即可達到資料互傳的目的, 我們將利用這種 RS-232 和單一纜線的連線方式稱 NULL MODEM,纜線的跳線圖如下:

nulmodem.gif (9600 bytes)

UART 的暫存器可歸類為兩群, 第一類為進行串列傳輸前所必須先規劃 UART 的暫存器, 第二類為資料傳輸中所使用到的暫存器。在初始串列埠時,首先設定其傳輸率、同位檢查、傳遞字元的長度和結束字元, 傳輸率的設定是使用除頻的方式, RS-232 上的時脈輸入頻率為 1.8432MHZ, 傳輸率與 Divisor 的關係式為:

    Divisor = 1.8432M / (Baud-Rate x 16)

Divisor 寫入前要先設定連線控制暫存器的 DLAB, 然後先將 Divisor 的低位元組寫入除頻設定暫存器, 緊接著再寫入高位元組。同位檢查、傳遞字元的長度和結束字元是透過連線控制暫存器設定, 此時 DLAB 必須為 0。

另外, 如果要使用 UART 硬體中斷的功能, 也必須在初設時一併規劃,可使用的中斷共有四種, 分別為 MODEM 狀態中斷, 由 CTS、DSR、RI 和 RLSD 產生, 可藉著讀取 MODEM 狀態暫存器重設之。另一個中斷是當傳送握持暫存器中沒有資料時所產生, 用在連續的資料傳送時使用, 可藉著讀取中斷辨識暫存器或寫入傳送握持暫存器重設之。相對於傳送用的中斷的是接收用的中斷, 因此也可設定接收資料備妥時發生中斷, 可藉讀取接收緩衝暫存器重設之。最後一個則是相對於 MODEM 狀態暫存器中斷的連線狀態暫存器中斷, 由 BI、FE、PE 和 OE 產生, 可藉著讀取連線狀態暫存器來重設。利用中斷時除了設定中斷啟動暫存器外, 另外還需設定 MODEM 控制暫存器的 OUT2 作為中斷要求訊號。

由於 UART 的中斷要求也是連接在 PIC 上, 所以必須同其它的 IRQ 先設定中斷服務常式、中斷向量, 然後再清除遮罩暫存器的遮罩作用。在 ISR 可由中斷辨識暫存器得知中斷來源, 以決定因應的對策。記得不要忘了要送 EOI 給 PIC。

連線控制暫存器, Linear Control Register (3FB/2FB,OUT)

BIT 7

=

1 Divisor Latch Access Bit (DLAB)
BIT 6

=

1 Set Break,強制設定 Sout 輸出為 0
BIT 5

=

1 Stick Parity Bit,強制設定 Parity Bit (Odd/Even 恆為 1/0)
BIT 4-3 = 設定同位位元 (Even Parity Select & Parity Enable)
= 01 Odd Parity Enable
= 11 Even Parity Enable
= x0 No Parity
BIT 2-0 = 設定字元長度與結束位元 (STop Bit no. & Word Length Select 1/0)
= 000 Length=5、Stop Bit=1
= 001 Length=6、Stop Bit=1
= 010 Length=7、Stop Bit=1
= 011 Length=8、Stop Bit=1
= 100 Length=5、Stop Bit=1.5
= 101 Length=6、Stop Bit=2
= 110 Length=7、Stop Bit=2
= 111 Length=8、Stop Bit=2


連線狀態暫存器, Linear Status Register (3FD/2FD,IN)

BIT 7 = 1 always 1
BIT 6 = 1 Transmitter Shift Register Empty (TSRE)
BIT 5 = 1 Transmitter Holding Register Empty (THRE)
BIT 4 = 1 Break Interrupt (BI)
BIT 3 = 1 Frame Error (FE)
BIT 2 = 1 Parity Error (PE)
BIT 1 = 1 Overrun Error (OE)
BIT 0 = 1 Data Ready (DR)

 
MODEM 控制暫存器, Modem Control Register (3FC/2FC,IN/OUT)

BIT 7-5 = 0
BIT 4 = 1 Loopback,自我診斷時使用
BIT 3 = 1 OUT2
BIT 2 = 1 OUT1
BIT 1 = 1 Request To Send (RTS)
BIT 0 = 1 Data Transmit Ready (DTR)


MODEM 狀態暫存器, Modem Status Register (3FE/2FE,IN)

BIT 7 = 1 Receive Line Signal Detect (RLSD)
BIT 6 = 1 Ring Indicator (RI)
BIT 5 = 1 Data Set Ready (DSR)
BIT 4 = 1 Clear To Send (CTS)
BIT 3 = 1 Delta Receive Line Signal Detect (DRLSD)
BIT 2 = 1 Trailing Edge Ring Indicator (TERI)
BIT 1 = 1 Delta Data Set Ready (DDSR)
BIT 0 = 1 Data Clear To Send (DCTS)

 
中斷啟動暫存器, Interrupt Enable Register (3F9/2F9,OUT)

BIT 7-4 = 0
BIT 3 = 1 Enable MODEM Status Interrupt
BIT 2 = 1 Enable Receive Line Status Interrupt
BIT 1 = 1 Enable Transmit Holding Register Empty Interrupt
BIT 0 = 1 Enable Data Available Interrupt

 
中斷辨識暫存器, Interrupt Identification Register (3FA/2FA,IN)

BIT 7-3

=

0
BIT 2-1 = 11 中斷源於連線狀態改變,含 BI、FE、PE、OE
= 10 中斷源於接收資料備妥,可用於接收端接收資料用
= 01 中斷源於傳送握持暫存器中無資料,可用於傳送端傳送資料用
= 00 中斷源於 MODEM 狀態改變,含 CTS、DSR、RI、DRLSD
BIT 0 = 1 use Interrupt mode
= 0 use Polling mode

接收緩衝暫存器, Receiver Buffer Register (3F8/2F8,IN)
BIT 7-0 = 接收端所收到的資料,由 BIT 0 開始接收

傳送握持暫存器, Transmitter Holding Register (3F8/2F8,OUT)
BIT 7-0 = 傳送端欲傳送的資料,由 BIT 0 開始傳送

除頻設定暫存器, Divisor Register (3F8-3F9/2F8-2F9,OUT)
3F8/2F8 = 除數的低位元組
3F9/2F9 = 除數的高位元組

 

資料傳送之前, 先設定 MODEM 控制暫存器的 RTS 和 DTR, 然後讀取 MODEM 狀態暫存器的值確定 UART 已收到 MODEM 傳來的 CTS 和 DSR, 並測試連線狀態暫存器的 THRE 和 TSRE 確定傳送握持暫存器是空的之後,再將資料寫入傳送握持暫存器, 以便於資料的傳送。傳送後, 可檢查連線狀態暫存器判定傳送是否成功。

接收資料也是使用類似的流程, 首先設定 MODEM 控制狀態暫存器的 DTR, 然後讀取 MODEM 狀態暫存器的值確定 UART 收到 MODEM 傳來的 DSR,接著測試連線狀態暫存器的 DR 確定資料備妥後, 再自接收緩衝暫存器讀取字元, 同樣亦可檢查連線狀態暫存器判定接收是否成功。連線狀態暫存器在讀取之後, 有意義的位元將自動重設為 0。

< COMplus.C>

WB00810_.gif (656 bytes)COMplus 使用中斷驅動的方式來接收序列埠傳來的字元, 使用此程式前請確定 COM1/COM2 的中斷要求設定在 IRQ4/IRQ3, 如果使用 NULL MODEM 的方式來傳資料, 也請確定每一組跳線都正確連接了。因為祇有硬體的裝置和軟體的規格都正常與正確, 資料才能有效的傳或收。從序列埠收到的資料先是存放在一個 Circular Queue 的緩衝區(與鍵盤使用的一樣), 當程式要拿資料時, 再到緩衝區拿即可, 如此可將硬體與軟體有效隔離。