大多數的電腦設備都具有RS-232C接口,盡管它的性能指標并非很好。在廣泛的市場支持下依然常勝不衰。 就使用而言,RS-232也確實有其優勢:僅需3根線便可在兩個數字設備之間全雙工的傳送數據。不過,RS-232C的控制要比使用并行通訊的打印機接口更難于控制。RS-232C使用了遠較并行口更多的寄存器。這些寄存器用來實現串行數據的傳送及RS-232C設備之間的握手與流量控制。本文將分別描述PC機及單片機MCS-51的串行通訊的原理及具體的軟件設計。 (1)RS-232C介紹與PC硬件: RS-232C使用-3到-25V表示數字“1”,使用3V到25V表示數字“0”,RS-232C在空閑時處于邏輯“1”狀態,在開始傳送時,首先產生一起始位,起始位為一個寬度的邏輯“0”,緊隨其后為所要傳送的數據,所要傳送的數據有最低位開始依此送出,并以一個結束位標志該字節傳送結束,結束位為一個寬度的邏輯“1”狀態。 PC機一般使用8250或16550作為串行通訊的控制器,使用9針或25針的接插件將串行口的信號送出。 該插座的信號定義如下: DB-25DB-9信號名稱方向含 義 23TXD輸出數據發送端 32RXD輸入數據接收端 47RTS輸出請求發送(計算機要求發送數據) 58CTS輸入清除發送(MODEM準備接收數據) 66DSR輸入數據設備準備就緒 75SG-信號地 81DCD輸入數據載波檢測 204DTR輸出數據終端準備就緒(計算機) 229RI輸入響鈴指示 以上信號在通訊過程之中可能會被全部或部分使用,最簡單的通訊僅需TXD及RXD及SG即可完成,其他的握手信號可以做適當處理或直接懸空,至于是否可以懸空這視乎你的通訊軟件。比如說,如果使用DOS所提供的BIOS通訊驅動程序,那么,這些握手信號則需要做如下處理,因為BIOS的通訊驅動使用了這些信號。如果使用自己編寫的串行驅動程序則可以完全不使用這些握手信號(詳見下面有關章節)。 PC機一般使用8250或16550的作為串行通訊控制器,8250及16550的管腳排列如下: 8250(16550)的寄存器如下表所示: 基地址讀/寫寄存器縮寫注 釋 0Write-發送保持寄存器(DLAB=0) 0Read-接收數據寄存器(DLAB=0) 0Read/Write-波特率低八位(DLAB=1) 1Read/WriteIER中斷允許寄存器 1Read/Write-波特率高八位(DLAB=1) 2ReadIIR中斷標識寄存器 2WriteFCRFIFO控制寄存器 3Read/WriteLCR線路控制寄存器 4Read/WriteMCRMODEM控制寄存器 5ReadLSR線路狀態寄存器 6ReadMSRMODEM狀態寄存器 7Read/Write-Scratch Register PC機支持1-4個串行口,即COM1-COM4,其基地址在BIOS數據區0000:0400-0000:0406中描述,對應地址分別為3F8/2F8/3E8/2E8,COM1及COM3使用PC機中斷4,COM2及COM4使用中斷3。 在上表中,8250共有12個寄存器,使用了8個地址,其中部分寄存器共用一個地址,由DLAB=0/1來區分,在DLAB=1用于設定通訊所需的波特率。常用的波特率參數見下表: 速率(BPS)波特率高八位波特率低八位 5009h00h 30001h80h 60000hC0h 240000h30h 480000h18h 960000h0Ch 1920000h06h 3840000h03h 5760000h02h 11520000h01h 以下幾個表格為8250的寄存器的功能描述: 中斷允許寄存器(IER): 位注 釋 7未使用 6未使用 5進入低功耗模式(16750) 4進入睡眠模式(16750) 3允許MODEM狀態中斷 2允許接收線路狀態中斷 1允許發送保持器空中斷 0允許接收數據就緒中斷 Bit0置1將允許接收到數據時產生中斷,Bit1置1時允許發送保持寄存器空時產生中斷,Bit2置1將在LSR變化時產生中斷,相應的Bit3置位將在MSR變化時產生中斷。 中斷識別寄存器(IIR): 位注 釋 Bit6:7=00無FIFO Bit6:7=01允許FIFO,但不可用 Bit6:7=11允許FIFO Bit5允許64字節FIFO(16750) Bit4未使用 Bit316550超時中斷 Bit2:1=00MODEM狀態中斷(CTS/RI/DTR/DCD) Bit2:1=01發送保持寄存器空中斷 Bit2:1=10接收數據就緒中斷 Bit2:1=11接收線路狀態中斷 Bit0=0有中斷產生 Bit0=1無中斷產生 IIR為只讀寄存器,Bit6:7用來指示FIFO的狀態,均為0時則無FIFO,此時為8250或16450芯片,為01時有FIFO但不可以使用,為11時FIFO有效并可以正常工作。Bit3用來指示超時中斷(16550/16750)。 Bit0用來指示是否有中斷發生,Bit1:2標識具體的中斷類型,這些中斷具有不同的優先級別,其中LSR中斷級別最高,其次是數據就緒中斷,然后是發送寄存器空中斷,而MSR中斷級別最低。 FIFO控制寄存器(FCR): 位注 釋 Bit7:6=001Byte產生中斷 Bit7:6=014Byte產生中斷 Bit7:6=108Byte產生中斷 Bit7:6=1114Byte產生中斷 Bit5允許64字節FIFO Bit4未使用 Bit3DMA模式選擇 Bit2清除發送FIFO Bit1清除接收FIFO Bit0允許FIFO FCR可寫但不可以讀,該寄存器用來控制16550或16750的FIFO寄存器。Bit0置1將允許發送/接收的FIFO工作,Bit1和Bit2置1分別用來清除接收及發送FIFO。清除接收及發送FIFO并不影響移位寄存器。Bit1:2可自行復位,因此無需使用軟件對其清零。Bit6:7用來設定產生中斷的級別,發送/接收中斷將在發送/接收到對應字節數時產生。 線路控制寄存器(LCR): 位注 釋 Bit7=1允許訪問波特率因子寄存器 Bit7=0允許訪問接收/發送及中斷允許寄存器 Bit6設置間斷,0-禁止,1-設置 Bit5:3=XX0無校驗 Bit5:3=001奇校驗 Bit5:3=011偶校驗 Bit5:3=101奇偶保持為1 Bit5:3=111奇偶保持為0 Bit2=01位停止位 Bit2=12位停止位(數據位6-8位),1.5位停止位(5位數據位) Bit1:0=005位數據位 Bit1:0=016位數據位 Bit1:0=107位數據位 Bit1:0=118位數據位 LCR用來設定通訊所需的一些基本參數。Bit7為1指定波特率因子寄存器有效,為0則指定發送/接收及IER有效。Bit6置1會將發送端置為0,這將會使接收端產生一個“間斷”。Bit3-5用來設定是否使用奇偶校驗以及奇偶校驗的類型,Bit3=1時使用校驗,Bit4為0則為奇校驗,1為偶校驗,而Bit5則強制校驗為1或0,并由Bit4決定具體為0或1。Bit2用來設定停止位的長度,0表示1位停止位,為1則根據數據長度的不同使用1.5-2位停止位。Bit0:1用來設定數據長度。 MODEM控制寄存器(MCR): 位注 釋 Bit7未使用 Bit6未使用 Bit5自動流量控制(僅16750) Bit4環路測試 Bit3輔助輸出2 Bit2輔助輸出1 Bit1設置RTS Bit0設置DSR MCR寄存器可讀可寫,Bit4=1進入環路測試模式。Bit3-0用來控制對應的管腳。 線路狀態寄存器(LSR): 位注 釋 Bit7FIFO中接收數據錯誤 Bit6發送移位寄存器空 Bit5發送保持寄存器空 Bit4間斷 Bit3幀格式錯 Bit2奇偶錯 Bit1超越錯 Bit0接收數據就緒 LSR為只讀寄存器,當發生錯誤時Bit7為1,Bit6為1時標示發送保持及發送移位寄存器均空,Bit5為1時標示僅發送保持寄存器空,此時,可以由軟件發送下一數據。當線路狀態為0時Bit4置位為1,幀格式錯時Bit3置位為1,奇偶錯和超越錯分別將Bit2及Bit1置位為1。Bit0置位為1表示接收數據就緒。 MODEM狀態寄存器(MSR): 位注 釋 Bit7載波檢測 Bit6響鈴指示 Bit5DSR準備就緒 Bit4CTS有效 Bit3DCD已改變 Bit2RI已改變 Bit1DSR已改變 Bit0CTS已改變 MSR寄存器的高4位分別對應MODEM的狀態線,低4位表示MODEM的狀態線是否發生了變化。 以上我們詳細介紹了PC機的串行通訊硬件環境,以下將分別給出使用查詢及中斷驅動的方法編寫的串行口驅動程序。這些程序僅使用RXD/TXD,無需硬件握手信號。 |