簡介
RS-232 簡介
RS232是一種常用的串口設備,它一般在通信和人機互動領域用於傳輸數據。雖然串口系統要比並口系統複雜,但在數據傳輸時其卻比並口系統所需要的數據線少,因而效率也更高。RS232隻需3條數據傳輸線就能完成數據的傳輸。這三條線分別用於“傳送數據”“接收數據”和信號接地線……
在這種連線方式中,“傳送”和“接收”線用於在電腦之間傳送和接收數據。如其名字“串口”,數據以串列方式傳輸。有兩個引腳TXD和RXD。還有其他引腳如RTS、CTS、DSR、DTR和RTS,RI 。“1”和“0”分別被定義為兩個不同的電壓等級:3V至15V和-3V至-15V。
根據標準串口的電氣特徵,EIA(電子工業協會)規定了其最大波特率為20000bps,這一規定比現在的標準要慢的多。因此,我們選擇了最近發布的RS-232D標準。
套用
根據標準串口的電氣特徵,EIA(電子工業協會) 規定了其最大波特率為20000bps,這一規定比現在的標準要慢的多。因此,我們選擇了最近發布的RS-232D標準。 EIA是Electronic Industries Alliance的縮寫,但事實上,發布RS232標準的時候它的名字是Electronics Industries Association。雖然都是EIA,但是英文並不一樣。
引角功能
腳連線器,這是一種在電腦後面的陽型連線器,在從主機到客戶機的通信中你還需要一種陰型連線器。D9和D25的輸出數據如下所示:
D型9針型 | D型25針型 | 信號 | 功能 |
3 | 2 | RD | 接收數據(串列數據輸入) |
2 | 3 | TD | 傳送數據(串列數據輸出) |
7 | 4 | RTS | 請求傳送 |
8 | 5 | CTS | 清除傳送(即:數據機準備交換數據) |
6 | 6 | DSR | 數據準備好(UART建立一個連結) |
5 | 7 | SG | 信號接地 |
1 | 8 | DCD | 數據載波檢測 |
4 | 20 | DTR | 數據終端就緒時。 |
9 | 22 | RI | 振鈴提示 |
DCE與DTE
以串口方式連線的設備一般有兩類。即DCE(數據通信設備)和DTE(數據終端設備)。如果說把據通信設備比作你的數據機、終端配置器、繪圖儀等的話,那么數據終端設備就是你的電腦或者終端。典型的數據通信設備與數據終端設備即為數據機與電腦。人們經常討論數據終端設備到數據通信設備的速度,或者數據通信設備到數據終端設備的速度。數據終端設備到數據通信設備的速度就是數據機與計算機之間的速度,有時也被稱為終端速度。終端速度一般比數據通信設備到數據通信設備的速度快。數據通信設備到數據通信設備速度是數據機之間的連線速度,有時也被稱為線速度。
如今大多數的數據機為28.8kbps或36.6kbps。因此,我們希望數據通信設備到數據通信設備的速度也能達到28.8kbps或36.6kbps。考慮到數據機的高速度,我們希望數據通信設備到數據通信設備的速度可以達到115200bps(16550a UART 的最大速度)。我們使用的通訊程式已設定了數據通信設備到數據通信設備的速度,速度為9.6kpbs、144kpbs以及數據機的速度(指28.8kbps和36.6kbps)等。
例如我們在數據通信設備與數據通信設備之間傳輸一個大小為28.8K的檔案,通過數據機的壓縮,實際上我們傳輸的是一個115.2Kbps的檔案,因此這相當於在數據通信設備擁有115.2kbps。這就是為什麼數據通信設備與設備終端設備之間的速度遠大於數據機的連線速度。所以,如果數據終端設備到數據傳輸設備的速度達到數據傳輸設備到數據終端設備的幾倍,計算機相數據機傳輸數據的速度就可以達到115200kbps。
零數據機
零數據機可以將兩個數據終端設備連線在一起,它一般利用Zmodem協定或Xmodem協定在計算機之間傳輸檔案。
圖:零數據機在採用RS-232D連線器時的接線方式
上圖為零數據機的連線方式,它的主要特點是:零數據機使計算機與數據機相連,而不是另一台計算機。主機與被終端機通過TD,RD,SG引線連線。主機通過TD線傳輸到終端機的所有數據都來源於RD線。終端機必須與主機有相同的設定。兩端的SG線必須短路,這樣引線對於兩台計算機都是相同的。
數據終端準備好(DTR)在兩台計算機上循環傳輸數據,分別為數據設定就緒以及載波檢測。當數據終端就緒啟動時,數據設定就緒以及載波檢測也同時啟動。這時,計算機會認為它連線的虛擬數據機已經準備好,並已經檢測到其他的數據機。
現在我們擔心的問題是傳送請求和清除傳送。由於兩台計算機的通信速度相同,因此沒有必要控制流量,這兩條線業分別與兩台計算機連線在一起。當計算機傳送數據時,它會傳送一個高頻請求信號,同時清除傳送,同時它會立即得到一個肯定的回覆。
振鈴提示只是用來告訴計算機上有一個電話線振鈴信號。由於我們沒有,數據機與電話的連線並不是真正的連線。
要知道在您的計算機上可用的RS232連線埠,右鍵點擊“我的電腦“,轉到‘屬性',選擇標籤'設備管理器',進入連線埠(COM和LPT),你將看到通訊連線埠(COM1)等。如果你右鍵點擊該並轉到屬性,你會看到設備的狀態。請確保您已啟用的連線埠(使用選擇這個連線埠)。
使用C++編程串列接口
一般有兩種方法從Turbo C.串口中傳送至或接受數據,一種是使用outportb(PORT_ID, DATA)函式或outport(PORT_ID,DATA)函式來定義“dos.h”。另一種方法是使用bioscom函式來定義“dos.h”。
使用outportb函式:
outportb(PORT_ID, DATA)函式傳送一位元組的數據到‘PORT_ID’。 outport()函式傳送一個字母數據。這些功能可以套用在任何連線埠,包括串列連線埠,並行連線埠,同樣地,也是接收使用數據。
·從硬體連線埠輸入讀取數據
·從硬體連線埠輸入讀取位元組
·從硬體連線埠輸出一個字
·從硬體的連線埠輸出一個位元組
說明:
·定義一個輸入量入
·從硬體連線埠輸入無符號字元
·輸出變數值
·輸出無符號值
備註:
·像80x86指令一樣運行從連線埠輸入的字。從連線埠中讀出低位元組,從portid+2中讀出高位元組。
·從硬體連線埠輸入的是一個宏位元組
·像80x86指令一樣運行從連線埠輸出的字。從連線埠寫出低位元組,從portid + 1寫出高位元組。
·從連線埠輸出一個重要的宏位元組,他是一個重要的參數。
Portid:
·從連線埠輸入的字和位元組中選讀
·寫出輸出和從連線埠輸出的位元組
值:
·寫給輸入口的指令
·寫給輸出口的位元組
如果當dos.h已經被包含時你可以從硬體連線埠輸入位元組或者輸出位元組,他們被看作對所有的擴展宏程式代碼。
如果不包括dos.h, 或者你不包含dos.h和#undef 巨觀(s), 你得到同樣的宏(s) 功能。
返回值:
# 從連線埠輸入字或者位元組返回讀取值
# 從連線埠輸出字或者位元組不返回讀取值
Bioscom的使用
巨觀bioscom()和功能_bios_serialcom()用於使用串列通信RS-232連線件。首先,我們必須把連線埠的設定取決於我們自身的需要和可用性。在該方法中,相同的功能用來讓設定控制字,將數據傳送到連線埠及檢查連線埠。這種舉措用於第一個參數功能。隨著我們傳送數據以及連線埠被用來通信。
這就是Turbo C 功能的通訊連線埠。
說明:
bioscom(int cmd, char abyte, int port)
_bios_serialcom(int cmd ,int port, char abyte)
bioscom()和_bios_serialcom()在I/O串列通訊中使用bios中斷0x14進行。
Cmd:執行I/O運算
cmd (boiscom) | cmd(_bios_serialcom) | 功能 |
0 | _COM_INIT | 初始化該接口 |
1 | _COM_SEND | 傳送一個字元 |
2 | _COM_RECEIVE | 接受一個字元 |
3 | _COM_STATUS | 返回接口的狀態 |
Portid: 連線埠來自於無論任何數據傳送或者任何數據被讀入
0:COM1
1: COM2
2: COM3
abyte:
當 cmd =2或3(_COM_SEND or _COM_RECEIVE)時參數abyte被忽視。
當 cmd = 0 (_COM_INIT)時,abyte值來確定該接口的具體工作方式:
Byte值 | 意義 | |
Bioscom | _bios_serialcom | |
0x02 0x03 | _COM_CHR7 _COM_CHR8 | 7數據位 8數據位 |
0x00 0x04 | _COM_STOP1 _COM_STOP2 | 1停止位 2停止位 |
0x00 0x08 0X10 | _COM_NOPARITY _COM_ODDPARITY _COM_EVENPARITY | 無奇偶性 奇數奇偶性 偶數奇偶性 |
0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0 | _COM_110 _COM_150 _COM_300 _COM_600 _COM_1200 _COM_2400 _COM_4800 _COM_9600 | 110波特 150波特 300波特 600 波特 1200波特 2400波特 4800波特 9600 波特 |
例如,當 abyte = 0x8B = (0x80 |0x08 | 0x00 | 0x03) = (_COM_1200 | _COM_ODDPARITY | _COM_STOP1 |_COM_CHR8)
通信連線埠設定:
1200波特 (0x80 = _COM_1200) ,
奇數奇偶性 (0x08 = _COM_ODDPARITY)
1停止位 (0x00 = _COM_STOP1),
8數據位 (0x03 = _COM_CHR8)
於是設定語句就寫成 :bioscom(0,0x8B, 0);
傳送數據到COM1連線埠,該函式的格式 bioscom(1,data, 0),同樣的 bioscom(1,0, 0 ) 我們將從連線埠讀出數據。
下面的例子說明了如何執行串列連線埠程式。當數據在連線埠時,它輸入數據並且顯示在螢幕上,如果一個鍵被按下那么ASCII的值會被送如入連線埠。
#include
#include
#define COM1 0
#define DATA_READY 0x100
#define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00)
int main( void)
{
int in, out, status;
bioscom(0, SETTINGS, COM1); /*initialize the port*/
cprintf("Data sent to you: ");
while (1)
{
status = bioscom(3, 0, COM1); /*wait until get adata*/
if (status & DATA_READY)
if ((out =bioscom(2, 0, COM1) & 0x7F) != 0) /*input a data*/
putch(out);
if (kbhit())
{
if((in = getch()) == 27) /* ASCII of Esc*/
break;
bioscom(1, in, COM1); /*output a data*/
}
}
return 0;
}
當你在這兩種計算機編譯並運行上述程式、文字輸入一個電腦應該出現在其他電腦螢幕,反之亦然。最初,我們設定了連線埠所需要的設定如定義在巨觀的設定。然後我們等待空置循環,直到一個鍵被按下或數據可在連線埠。如果任何鍵被按下,然後kbhit函式返回非零值。如果我們發現任何鍵被按下那么我么我們就要跳轉到getch功能。然後我們會把它交給com口。同樣地,如果任何的數據可在連線埠,我們從連線埠接收它並顯示在螢幕上。
檢查連線埠,如果你有一台計算機,你就可以使用信號迴路連線如下。這是最常用的通信程式。在這裡,數據傳輸在各自連線埠本身。信號回送的連線如下圖。
圖:信號回送連線電路
如果你在這個圖中運行上述程式通信,它的特性就會顯示在你的螢幕上。這個方法有助於用於串列連線埠程式與單個的計算機。如果你的計算機有2個RS232連線埠你也可以改變其連線埠。你可以在同一台計算機連線com1連線埠的com2連線埠也可以在同一程式中改變他們的連線埠號。數據傳送給連線埠com1應該來自連線埠com2,同時也不管你在鍵盤上輸入什麼都應該會出現在螢幕上。
這個程式為串列通訊程式設計師的原始碼做出了示例。就是用RS232使PC機與PC機通信。下載的代碼,在兩台計算機之間解壓縮並運行,用dos模式。使用這種程式得到更多的構想有關於串列編程。