一、什麼是RS-232 接口?
(1) RS-232 的曆史和作用
在 串行通訊時,要求通訊雙方都采用一個標準接口,使不同的設備可以方便地連接起來進行通訊。RS-232-C接口(又稱EIA RS-232-C)是目前最常用的一種串行通訊接口。(“RS-232-C”中的“-C”隻不過表示RS-232的版本,所以與“RS-232”簡稱是一 樣的)它是在1970 年由美國電子工業協會(EIA)聯合貝爾係統、調製解調器廠家及計算機終端生產廠家共同製定的用於串行通訊的標準。它的全名是"數據終端設備(DTE)和 數據通訊設備(DCE)之間串行二進製數據交換接口技術標準"該標準規定采用一個25 個腳的DB-25 連接器,對連接器的每個引腳的信號內容加以規定,還對各種信號的電平加以規定。後來IBM的PC 機將RS-232 簡化成了DB-9 連接器,從而成為事實標準。而工業控製的RS-232 口一般隻使用RXD、TXD、GND 三條線。
(2)RS-232 接口的電氣特性
在RS-232-C 中任何一條信號線的電壓均為負邏輯關係。即:邏輯"1"為-3 到-15V;邏輯"0"為+3 到+15V 。RS-232-C 最常用的9 條引線的信號內容如下所示
DB-9 1 2 3 4 5 6 7 8 9
DB-25 8 3 2 20 7 6 4 5 22
定義DCD RXD TXD DTR GND DSR RTS CTS RI
(3) RS-232 接口的物理結構
RS-232-C 接口連接器一般使用型號為DB-9 插頭座,通常插頭在DCE端,插座在DTE端.
PC 機的RS-232 口為9 芯針插座。而波士RS-232/RS-485轉換器的RS-232 為DB-9 孔插頭。一些設備與PC 機連接的RS-232 接口,因為不使用對方的傳送控製信號,隻需三條接口線,即"發送數據TXD"、"接收數據RXD"和"信號地GND"。RS-232 傳輸線采用屏蔽雙絞線。
(4)RS-232 傳輸電纜長度
由RS -232C標準規定在碼元畸變小於4%的情況下,傳輸電纜長度應為50 英尺,其實這個4%的碼元畸變是很保守的,在實際應用中,約有99%的用戶是按碼元畸變10-20%的範圍工作的,所以實際使用中最大距離會遠超過50英 尺,美國DEC公司曾規定允許碼元畸變為10%而得出下麵實驗結果。其中1 號電纜為屏蔽電纜,型號為DECP.NO.9107723 內有三對雙絞線,每對由22# AWG 組成,其外覆以屏蔽網。2 號電纜為不帶屏蔽的電纜。型號為DECP.NO.9105856-04是22#AWG 的四芯電纜。
DEC 公司的實驗結果
波特率bps 1號電纜傳輸距離(米) 2號電纜傳輸距離(米)
110 1500 900
300 1500 900
1200 900 900
2400 300 150
4800 300 75
9600 75 75
經過許多年來RS-232 器件以及通信技術的改進,RS-232 的通信距離已經大大增加。波士電子的RS-232 增強器可以將普通的RS-232 口的通信距離直接延長到1000米。
二、什麼是RS-485 接口?
1. RS-485 的電氣特性:
發送端:邏輯"1"以兩線間的電壓差為+(2 至6) V 表示;邏輯"0"以兩線間的電壓差為-(2 至6)V 表示。接收端:A比B高200mV以上即認為是邏輯"1",A 比B 低200mV 以上即認為是邏輯"0"。
2. RS-485(或 RS-422)的接線:
RS -485(或 RS-422)通信建議一定要接地,因為RS-485(或 RS-422)通信要求通信雙方的地電位差小於1V。即:半雙工通信接3根線(+A、-B、地),全雙工通信接5根線(+發、-發、+收、-收、地)。為 了安全起見,建議通信機器的外殼接大地。RS-485(或 RS-422)光隔轉換器的所有外接電源的“地”必須全部連在一起但不要與計算機外殼地相連,因為電源“地”同時也是RS-485或 RS-422的信號“地”。當通信距離超過100米時建議最好使用光電隔離的通信接口轉換器。
3. RS-485 的數據最高傳輸速率為10Mbps。但是由於RS-485 常常要與PC 機的RS-232口通信,所以實際上一般最高115.2Kbps。又由於太高的速率會使RS-485 傳輸距離減小,所以往往為9600bps 左右或以下。
4. RS-485 接口是采用平衡驅動器和差分接收器的組合,抗噪聲幹擾性好。
5. RS-485接口的最大傳輸距離標準值為1200米(9600bps時),實際上可達3000米,RS-485 接口在總線上是允許連接多達128個收發器、即RS-485 具有多機通信能力,這樣用戶可以利用單一的RS-485 接口方便地建立起設備網絡。因RS-485 接口具有良好的抗噪聲幹擾性,長的傳輸距離和多站能力等上述優點就使其成為首選的串行接口。因為RS485 接口組成的半雙工網絡,一般隻需二根信號線,所以RS485 接口均采用屏蔽雙絞線傳輸。RS-485 的國際標準並沒有規定RS485 的接口連接器標準、所以采用接線端子或者DB-9、DB-25 等連接器都可以。波士RS-485 接口是事實工業標準。
6. 采用RS485 接口時,傳輸電纜的長度如何考慮?
在 使用RS485 接口時,對於特定的傳輸線經,從發生器到負載其數據信號傳輸所允許的最大電纜長度是數據信號速率的函數,這個長度數據主要是受信號失真及噪聲等影響所限 製。最大電纜長度與信號速率的關係曲線是使用24AWG 銅芯雙絞電話電纜(線徑為0。51mm),線間旁路電容為52。5PF/M,終端負載電阻為100 歐時所得出。(引自GB11014-89附錄A)。當數據信號速率降低到90Kbit/S 以下時,假定最大允許的信號損失為6dBV 時,則電纜長度被限製在1200M。實際上,在實用時是完全可以取得比它大的電纜長度。當使用不同線徑的電纜。則取得的最大電纜長度是不相同的。例如:當 數據信號速率為600Kbit/S
時,采用24AWG 電纜,最大電纜長度是200m,若采用19AWG 電纜(線徑為0.91mm)則電纜長度將可以大於200m; 若采用28AWG 電纜(線徑為0.32mm)則電纜長度隻能小於200m。RS-485的遠距離通信建議采用屏蔽電纜,並且將屏蔽層作為地線。
三、什麼是RS-422 接口?
RS-422 的電氣性能與RS-485完全一樣。主要的區別在於:
RS-422 有4 根信號線:兩根發送(Y、Z)、兩根接收(A、B)。由於RS-422 的收與發
是 分開的所以可以同時收和發(全雙工)。RS-485 有2 根信號線:發送和接收都是A 和B。由於RS-485 的收與發是共用兩根線所以不能夠同時收和發(半雙工)。能否將RS-422 的Y-A 短接作為RS-485 的A、將RS-422 的Z-B 短接作為RS-485 的B呢?回答:不一定。條件是RS-422 必須是能夠支持多機通信的。波士電子的所有接口轉換器的RS-422 口都能夠支持全雙工多機通信,所以可以這樣簡單轉換為RS-485。
四、RS-485 比RS-232接口相比有何特點?
由於RS-232 接口標準出現較早,難免有不足之處,主要有以下四點:
(1) 接口的信號電平值較高,易損壞接口電路的芯片,又因為與TTL 電平不兼容故需使用電平轉換電路方能與TTL 電路連接。
(2) 傳輸速率較低,在異步傳輸時,波特率為20Kbps。現在由於采用新的UART 芯片16C550 等,波特率達到115.2Kbps。
(3) 接口使用一根信號線和一根信號返回線而構成共地的傳輸形式, 這種共地傳輸容
易產生共模幹擾,所以抗噪聲幹擾性弱。
(4) 傳輸距離有限,最大傳輸距離標準值為50 米,實際上也隻能用在15米左右。
(5)RS-232 隻允許一對一通信,而RS-485 接口在總線上是允許連接多達128個收發器。
五、串口通信功能的實現
利 用VC++實現串口通信的方法有多種,我們采取直接調用Window API中的一係列標準的串口通信函數,直接用這些標準函數來完成Windows下麵的串口通信編程[11]。利用WindowsAPI函數控製利用API 函數實現對RS232串口通信的訪問,在實現控製通信中,我們必定要調動3個函數來實現對串口的控製:
CreatFile()函數實現串口初始化並打開串口;
ReadFile()函數接收串口傳遞過來的二進製流並返回數據到接收緩衝區中
WriteFile()把應用程序發出的指令送到發送緩衝區以供串口接收1. 打開串口
以下程序用於以同步方式打開串口COM1;
HANDLE hCom;
DWORD dwErrorHcomm=CreateFile(“COM1”,GENERIC_READ|GENERIC_WRITE
,0, NULL,OPEN_EXISTING, 0, NULL);
if (hComm==(HANDLE)0Xffff)
{
dwError=GetLastError();
MessageBox(dwError);
}
2. 配置串口
配置串口是通過改變設備控製塊DCB(Device Control Block)的成員變量值來實現的,程序實現如下:
DCB dcb
dcb.BaudRate=9600;//波特率為9600bps
dcb.ByteSize=8;//數據位8位
dcb.Parity=EVENPARTTY;//有校驗
dcb.StopBits=ONESTOPRTT; //一個停止位
SetCommState(hCom,&dcb);
3. 數據讀寫
對串口進行讀寫與對文件進行讀寫所用的函數相同,具體為可采用查詢、同步、異步或事件驅動等方法對串口進行讀寫所用函數如下所示:
bReadStatus=ReadFile(hCom,buffer,length,&length &m_lpOverlapped);
if(!bReadStatus)
{
if(GetLastError()=ERROR_IO_PENDING)
{
WaitForSingleObject(m_lpOverlapped,hEvent,1000);
return((char)length);
}
return 0;
}
//寫入函數程序為:
bWriteStatus=WriteFile(hCom,buffer,length,&length,&m_lpOverlapped)
if(!bWriteStatus)
{
if(GetLastError()=ERROR_IO_PENDING)
{
WaitForSingleObject(m_lpOverlapped, hEvent,1000);
return((char)length);
}
return 0;
}
4. 程序的編製
用VC++進行程序的編製首先要對串口進行初始化,設定端口,通信速率和校驗方式,並在使用前打開串口,程序部分如下:
{
Cdialog::OnInitDialog();//TODO: Add extra initialization here
m_comm.SetCommPort(1);//選擇串口1
if(! m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打開串口1
m_comm.SetSettings(“9600,n,8,1”); //設置串口參數
m_comm.SetRThreshold(1);
m_comm.SetInputMode(1);//設置二進製模式
return TRUE;
}
除 了串口的位置和基本串口參數(數據傳輸速率9600bps,1位開始位,8位數據位,1位停止位,一位奇偶校驗)設置外,為了實現實時數據采集功能,接受 數據的讀寫要盡可能的快速,則設置RTHreshold=1即接收緩衝區收到一個字節產生OnComm事件InputLen=1每次讀取一個字節。如果 PC上位機在一定時間內不能將數據處理完,接收緩衝區會滯留數據,數據會產生丟失現象,我們必須對接受緩衝區進行適當的設置。我們利用API函數實現串口 通信的方法,實現了羅經及發射機對上位機串行通信的功能。
沒有留言:
張貼留言
嘎嘎嘎