RS232串口通信


一、RS-232總線

1、RS-232總線簡介

RS-232C標準(協議)的全稱是EIA-RS-232C標準,其中EIA(Electronic Industry AssociaTIon)代表美國電子工業協會,RS(ecommeded standard)代表推薦標準,232是標識號,C代表RS232的最新一次修改(1969),在這之前,有RS232B、RS232A。


RS232串口通信


2、RS-232總線接口

RS-232C規標準接口有25條線,4條數據線、11條控制線、3條定時線、7條備用和未定義線,常用的只有9根。


RS232串口通信

(1)數據載波檢測

DCD:數據載波檢出,Data Carrier Detection當本地DCE設備(Modem)收到對方的DCE設備送來的載波信號時,使DCD有效,通知DTE準備接收, 並且由DCE將接收到的載波信號解調為數字信號, 經RXD線送給DTE。

(2)數據發送與接收線

RXD:接收數據(Received data-RxD)——通過RxD線終端接收從MODEM發來的串行數據,(DCE→DTE)。

  TXD:發送數據(Transmitted data-TxD)——通過TxD終端將串行數據發送到MODEM,(DTE→DCE)。

(3)聯絡控制信號線

DTR:數據終端準備好(Data set ready-DTR)——有效時(ON)狀態,表明數據終端可以使用。

  DSR:數據裝置準備好(Data set ready-DSR)——有效時(ON)狀態,表明MODEM處於可以使用的狀態。

這兩個信號有時連到電源上,一上電就立即有效。這兩個設備狀態信號有效,只表示設備本身可用,並不說明通信鏈路可以開始進行通信了,能否開始進行通信要由下面的控制信號決定。

(4)請求應答聯絡信號

  RTS“”請求發送(Request to send-RTS)——用來表示DTE請求DCE發送數據,即當終端要發送數據時,使該信號有效(ON狀態),向MODEM請求發送。它用來控制MODEM是否要進入發送狀態。

(5)允許發送

CTS:允許發送(Clear to send-CTS)——用來表示DCE準備好接收DTE發來的數據,是對請求發送信號RTS的響應信號。當MODEM已準備好接收終端傳來的數據,並向前發送時,使該信號有效,通知終端開始沿發送數據線TxD發送數據。

  這對RTS/CTS請求應答聯絡信號是用於半雙工MODEM系統中發送方式和接收方式之間的切換。在全雙工系統中作發送方式和接收方式之間的切換。在全雙工系統中,因配置雙向通道,故不需要RTS/CTS聯絡信號,使其變高。

  接收線信號檢出(Received Line detecTIon-RLSD)——用來表示DCE已接通通信鏈路,告知DTE準備接收數據。當本地的MODEM收到由通信鏈路另一端(遠地)的 MODEM送來的載波信號時,使RLSD信號有效,通知終端準備接收,並且由MODEM將接收下來的載波信號解調成數字兩數據後,沿接收數據線RxD送到 終端。此線也叫做數據載波檢出(Data Carrier dectecTIon-DCD)線。

  (6)振鈴指示

RI:振鈴指示(Ringing-RI)——當MODEM收到交換臺送來的振鈴呼叫信號時,使該信號有效(ON狀態),通知終端,已被呼叫。

  (7)地線

  有兩根線GND(SG)、PG——信號地和保護地信號線,無方向。

  上述控制信號線何時有效,何時無效的順序表示了接口信號的傳送過程。例如,只有當DSR和DTR都處於有效(ON)狀態時,才能在DTE和DCE之間 進行傳送操作。若DTE要發送數據,則預先將DTR線置成有效(ON)狀態,等CTS線上收到有效(ON)狀態的回答後,才能在TxD線上發送串行數據。 這種順序的規定對半雙工的通信線路特別有用,因為半雙工的通信才能確定DCE已由接收方向改為發送方向,這時線路才能開始發送。

  2個數據信號:發送TXD;接收RXD。

  1個信號地線:SG。

  6個控制信號:

  DSR 數傳機(即modem)準備好,Data Set Ready。

  DTR 數據終端(DTE,即微機接口電路,如Intel8250/8251,16550)準備好,Data Terminal Ready。

  RTS DTE請求DCE發送(Request To Send)。

  CTS DCE允許DTE發送(Clear To Send),該信號是對RTS信號的回答。

    RI 振鈴信號 Ringing當DCE收到交換機送來的振鈴呼叫信號時,使該信號有效,通知DTE已被呼叫。

3、電氣特性

  EIA-RS-232C對電器特性、邏輯電平和各種信號線功能都作了規定。

  在TxD和RxD上:邏輯1(MARK)=-3V~-15V

  邏輯0(SPACE)=+3~+15V

  在RTS、CTS、DSR、DTR和DCD等控制線上:

  信號有效(接通,ON狀態,正電壓)=+3V~+15V

  信號無效(斷開,OFF狀態,負電壓)=-3V~-15V

  以上規定說明了RS-323C標準對邏輯電平的定義。對於數據(信息碼):邏輯“1”(傳號)的電平低於-3V,邏輯“0”(空號)的電平高於+3V;對於控制信號;接通狀態(ON)即信號有效的電平高於+3V,斷開狀態(OFF)即信號無效的電平低於-3V,也就是當傳輸電平的絕對值大於 3V時,電路可以有效地檢查出來,介於-3~+3V之間的電壓無意義,低於-15V或高於+15V的電壓也認為無意義,因此,實際工作時,應保證電平在± (3~15) V之間。

二、RS-232串口通信編碼

1、串口初始化

void usart_init()

{

SCON = 0x50; //REN=1允許串行接受狀態,串口工作模式1

TMOD = 0x20; //定時器工作方式2

PCON = 0x00;

TH1 = 0xFD; //波特率9600、數據位8、停止位1。效驗位無 (11.0592M)

TL1 = 0xFD;

ES = 1; //開串口中斷

EA = 1; //開總中斷

TR1 = 1; //啟動定時器

}

SCON寄存器

RS232串口通信

1.SM0、SM1:串行口工作方式控制位

RS232串口通信


2.SM2:多機通信控制位

3.REN:允許接收位

4.TB8:發送接收數據位8

5.RB8:接收數據位8

6.TI:發送中斷標誌位 TI=1表示幀發送結束

7.RI:接收中斷標誌位 RI=1表示幀接收完成

RS232串口通信

1.GATE:門控制位 GATE=0,僅受TRX控制 GATE=1,受TRX和外部中斷引腳共同控制

2.C/T:定時器模式和計數器模式選擇器 C/T=1,計數器 C/T=0,定時器

3.M1、M0:工作方式選擇位

RS232串口通信

PCON寄存器

RS232串口通信

SMOD:是波特率是否加倍的選擇位。

SMOD=0時:波特率不加倍。

SMOD=1時:波特率加倍。

RS232串口通信

2、串口數據發送

void send_data(unsigned char a)

{

SBUF = a; //SUBF接受/發送緩衝器

while(0 == TI); //每次等待發送完畢,再執行下一條

TI=0; //手動清0

}

SBUF:有兩個物理上獨立的接收、發送緩衝器SBUF,它們佔用同一地址99H ;接收器是雙緩衝結構 ;發送緩衝器,因為發送時CPU是主動的,不會產生重疊錯誤。

TI:發送中斷標誌位 TI=1表示幀發送結束

3、串口中斷程序

void ser_int (void) interrupt 4 using 1

{

if(1 == RI) //RI接受中斷標誌

{

RI = 0; //清除RI接受中斷標誌

ReData = SBUF; //SUBF接受/發送緩衝器

Flag=1; //標誌位置1表示有新數據進來

}

}

RI:接收中斷標誌位 RI=1表示幀接收完成

4、總代碼

#include<reg51.h>

unsigned char SenData, //發送數據

Flag, //標誌位

ReData; //接收數據

void usart_init(); //串口中斷初始化

void send_data(unsigned char a); //串口數據發送

//---------------------------

//串口中斷初始化

//---------------------------

void usart_init()

{

SCON = 0x50; //REN=1允許串行接受狀態,串口工作模式1

TMOD = 0x20; //定時器工作方式2

PCON = 0x00;

TH1 = 0xFD; //波特率9600、數據位8、停止位1。效驗位無 (11.0592M)

TL1 = 0xFD;

ES = 1; //開串口中斷

EA = 1; //開總中斷

TR1 = 1; //啟動定時器

}

//---------------------------

//串口數據發送

//---------------------------

void send_data(unsigned char a)

{

SBUF = a; //SUBF接受/發送緩衝器

while(0 == TI); //每次等待發送完畢,再執行下一條

TI=0; //手動清0

}

//---------------------------

//串口中斷程序

//---------------------------

void ser_int (void) interrupt 4 using 1

{

if(1 == RI) //RI接受中斷標誌

{

RI = 0; //清除RI接受中斷標誌

ReData = SBUF; //SUBF接受/發送緩衝器

Flag=1; //標誌位置1表示有新數據進來

}

}

//---------------------------

//主函數

//---------------------------

void main()

{

usart_init(); //串口中斷初始化

while(1)

{

if (Flag==1) //判斷是否有數據過來,有則進入循環

{

EA=0; //進入循環之後就把總中斷關閉,防止處理過程中又有中斷進來

//----------------------該段即對接收的數據進行處理

if(ReData=='a')

SenData = 'b';

else

SenData = 'c';

send_data(SenData); //串口數據發送

//----------------------

Flag=0; //數據處理完畢後將標誌位置0,表示沒有新數據要處理

EA=1; //打開總中斷,允許接收新數據

}

}

}

三、串口通信ASCII碼

串口用於ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發送,(3)接收。由於串口通信是異步的,端口能夠在一根線上發送數據同時在另一根線上接收數據。其他線用於握手,但是不是必須的。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對於兩個進行通行的端口,這些參數必須匹配:

(1)波特率:這是一個衡量通信速度的參數。它表示每秒鐘傳送的bit的個數。例如300波特表示每秒鐘發送300個bit。當我們提到時鐘週期時,我們就是指波特率例如如果協議需要4800波特率,那麼時鐘是4800Hz。這意味著串口通信在數據線上的採樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大於這些值,但是波特率和距離成反比。高波特率常常用於放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。

(2)數據位:這是衡量通信中實際數據位的參數。當計算機發送一個信息包,實際的數據不會是8位的,標準的值是5、7和8位。如何設置取決於你想傳送的信息。比如,標準的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數據使用簡單的文本(標準 ASCII碼),那麼每個數據包使用7位數據。每個包是指一個字節,包括開始/停止位,數據位和奇偶校驗位。由於實際數據位取決於通信協議的選取,術語“包”指任何通信的情況。

(3)停止位:用於表示單個包的最後一位。典型的值為1,1.5和2位。由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率同時也越慢。

(4)奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串口會設置校驗位(數據位後面的一位),用一個值確保傳輸的數據有偶個或者奇個邏輯高位。例如,如果數據是011,那麼對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,校驗位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數據,簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數據是否不同步。


RS232串口通信

四、RS-232通信缺點

RS-232-C接口標準出現較早,難免有不足之處,主要有以下四點:  

(1) 接口的信號電平值較高,易損壞接口電路的芯片,又因為與TTL 電平不兼容故需使用電平轉換電路方能與TTL電路連接。 

(2) 傳輸速率較低,在異步傳輸時,波特率為20Kbps。  

(3) 接口使用一根信號線和一根信號返回線而構成共地的傳輸形式, 這種共地傳輸容易產生共模干擾,所以抗噪聲干擾性弱。  

(4) 傳輸距離有限,最大傳輸距離標準值為50英尺,實際上也只用在50米左右。  針對RS-232-C的不足,於是就不斷出現了一些新的接口標準,RS-485就是其中之一。


分享到:


相關文章: