序列程式設計/RS-232 連線
序列程式設計: 簡介和OSI網路模型 -- RS-232佈線和連線 -- 典型的RS232硬體配置 -- 8250 UART -- DOS -- MAX232驅動器/接收器系列 -- Windows中的TAPI通訊 -- Linux和Unix -- Java -- Hayes相容調變解調器和AT命令 -- 通用序列匯流排(USB) -- 形成資料包 -- 錯誤糾正方法 -- 雙向通訊 -- 資料包恢復方法 -- 序列資料網路 -- 實際應用開發 -- 序列連線上的IP
RS-232 是計算機裝置之間序列資料通訊的標準。這個標準可以追溯到1962年,但多年來已經過多次重大修訂以適應通訊技術的改變。最簡單的 RS-232 連線可能只包含連線兩臺裝置之間的一根線。最常見的連線包含三根線:傳送 (tx)、接收 (rx) 和接地 (gnd)。但是,一個完整的連線可以包含多達 25 根線。早期的 RS-232 連線通常用於連線終端裝置到調變解調器,因此這兩個主題經常交織在一起。
在序列通訊領域,有兩種不同的裝置
- DTE - 資料終端裝置
- DCE - 資料通訊裝置
在實際應用中,資料終端裝置 (DTE) 和資料通訊裝置 (DCE) 之間的區別僅僅是功能上的區別。這是一種調變解調器和序列通訊裝置主題混合在一起的情況。在這裡,調變解調器可以被認為是 DCE,而面向使用者的終端是 DTE。許多年前,當分時計算系統很普遍時,使用者會撥打電話,將電話聽筒放在聲學調變解調器上,該調變解調器連線到一個簡單的啞終端,透過一根 RS-232 電纜連線。典型的連線速度通常為 50 波特或 110 波特,儘管非常快的連線可以達到 300 波特。作為旁註,當最初的 IMP (互連訊息處理器) 形成 ARPAnet (網際網路的古老前身) 的第一個節點/路由器時,這正是他們使用的連線系統。後來這被其他通訊系統取代,但這正是網際網路的起源。
在更現代的環境中,想象一下在非常危險的地方的一臺裝置,比如在測量軋輥或其他鋼鐵加工裝置溫度的鋼鐵加工廠。這也將是我們現在稱為“資料通訊裝置”的一種形式,我們也希望能夠遠端控制它。在軋鋼廠的控制室使用的 PC 將是資料終端裝置。還有許多其他類似的裝置,並且可以在各種裝置上找到 RS-232 連線。
之所以稱為“直連”連線,是因為在佈線時,連線兩端每根線都連線到同一個引腳。
通常您並不總是希望將一臺裝置連線到計算機,但也希望將兩臺計算機連線在一起。不幸的是,當使用“直連”序列連線連線兩臺計算機時,這兩臺計算機會在同一根線上互相沖突。
一種解決方法是使用一對調變解調器將兩臺計算機連線在一起。如前所述,這是一項非常常見的任務,在 1980 年代和 1990 年代初期,使用調變解調器撥打電話相互連線並交換各種資訊的“電子公告板系統”(BBS) 很常見。
現在想象一下,這兩臺計算機都在同一個房間裡。它們不需要透過物理調變解調器連線,而是透過一個“空模式調變解調器”連線,或者說一個並不存在的調變解調器。為了實現這一點,您需要“交叉”一些線,這樣當您在一端傳送一些資訊時,另一臺計算機能夠檢測並接收相同的資訊。
除了簡單地允許計算機相互通訊和傳輸資料之外,空模式調變解調器連線還可以用來“模擬”DCE 裝置的行為。這在本文系列的後續討論中將非常重要,您可以在其中嘗試編寫自己的序列通訊軟體。根據我的經驗,我曾在很多情況下編寫過這些“模擬器”,要麼是因為我試圖通訊的裝置還沒有完成,要麼是因為很難獲得該裝置的樣本,而我只有通訊協議規範。
有時,您可能希望測試傳輸裝置本身,而不是嘗試與另一臺計算機通訊。一種實用的方法是在終端裝置(例如具有序列資料連線的 PC)上新增一個“迴環”聯結器。此聯結器沒有連線電纜,但將傳送線迴環到接收線。透過這樣做,您可以模擬資料傳輸和接收。一般來說,這僅用於實際測試裝置,但也可以用於測試軟體元件。當使用這種聯結器時,您將接收您傳送的每個位元組。如果您將傳輸子例程與資料捕獲子例程分開,它可以為測試您的應用程式提供一個受控系統。
當檢查裝置傳輸的序列資料變得非常困難時,有時能夠獲取傳輸資訊的“快照”會很不錯。這是透過某種協議分析器來完成的。
所做的是對佈線進行修改,以使第三臺計算機能夠簡單地讀取正在傳輸的資料。有時通訊協議可能會變得非常複雜,以至於您需要檢視整個交換過程,並且需要“即時”進行檢查,而不是透過某種軟體偵錯程式。此方法的另一個目的是檢查資料交換,以進行逆向工程,如果您試圖發現裝置的工作原理。通常,儘管有書面規範,但實際傳輸資料時發生的情況的實現可能與最初計劃的完全不同。基本上,這是一個用於開發序列通訊協議和軟體的強大工具,不容忽視。
以下將討論連線協議分析器的常用方法。
監控和分析序列埠資料的最方便的工具之一是 RS232 協議分析器。此軟體允許攔截所有序列控制程式碼並記錄有關它們的詳細資訊。捕獲的資料可以在所有 4 種不同的檢視中同時檢視,即表格、行、轉儲或終端模式,每個顯示都提供了一種獨特的方式來表示 RS232 分析器捕獲的資料。
Y 型“電纜”不僅僅是某種電纜,還包含電子元件 - 假設它不是劣質電纜。它應該放置在序列線之間,並映象第三個聯結器上的所有訊號。然後,可以將此第三個聯結器連線到協議分析器(例如,配備某些顯示軟體的 PC)
+-----+ serial +---------+ serial +-----+
| DTE |----------| Y Cable |----------| DCE |
+-----+ +---------+ +-----+
|
|
+----------+
| Analyzer |
+----------+
建議不要使用無源 Y 型電纜。這種電纜會使 DTE 和 DCE 的發射器過載,這可能會導致發射器損壞。RS-233 標準要求發射器能夠短路安全。但是,現代高度整合裝置可能不再符合該標準的這一特定方面。
通常,連線到分析器的線也只是一條序列線,分析器是一臺配備序列介面和某些顯示軟體的 PC。這種簡單的 Y 型電纜解決方案的缺點是它僅支援半雙工通訊。也就是說,一次只能有一方(DTE 或 DCE)說話。原因是來自 DTE 和 DCE 的兩條 TX 線合併成一條連線到分析器的 TX 線。如果 DTE 和 DCE 同時傳送,它們的訊號會在連線到分析器的第三條線上混合在一起,分析器可能根本看不到任何可解碼的訊號。
請參閱 http://www.mmvisual.de/fbintermdspy.htm 以瞭解有關 Y 型電纜的一些簡單電路的示例。
更先進的 Y 型電纜解決方案將來自 DTE 和 DCE 的 TX 資料分別提供給分析器。這種分析器能夠顯示全雙工通訊。先進的專業系統不僅顯示解碼後的數字資訊,而且還會監控模擬訊號電平和時序。
在這種情況下,分析器位於 DTE 和 DCE 之間。它基本上是配備兩個序列介面的某些裝置(例如 PC)。分析器將來自一方的每個訊號映象到另一方,並顯示流量。
+-----+ serial +----------+ serial +-----+ | DTE |----------| Analyzer |----------| DCE | +-----+ +----------+ +-----+
原則上,可以使用任何配備兩個序列介面的 PC 來構建這種分析器的簡單版本。所需要的只是一些軟體,編寫起來並不難。但是,這種裝置將缺乏一個方便的功能。專業分析器能夠自動感應序列通訊的速度。自制解決方案需要配置以匹配序列通訊的速度。專業裝置也經過最佳化,以確保電路中的延遲最小。此外,簡單的自制、基於 PC 的分析器不能用於分析由訊號電平問題引起的故障。然而,任何型別的協議分析器都比沒有好。即使是最簡單的分析器也很有用。
請參閱 設定開發環境(用於調變解調器開發) 以獲取更多資訊。

RS232 分解盒 (BOB) 是一種非常巧妙的硬體,通常將多種功能結合在一起。它基本上由兩個 RS232 聯結器和一個跳線板(或開關)組成,該跳線板(或開關)允許更改聯結器之間的佈線。與單獨的(DIP)開關相比,跳線板和一小段電線更可取,因為跳線板允許以其他目的訪問訊號。
如果特定裝置的引腳分配(DTE/DCE)未知,分解盒非常有用。跳線板允許快速將佈線從 直連 更改為 空模 連線,或設定 迴環連線。
由於跳線板允許訪問所有訊號,因此它還可以使用分解盒連線 協議分析器 或示波器。更好的分解盒還提供一些自身訊號電平資訊,透過使用 LED 來指示訊號電壓。當試圖識別未知的引腳分配時,此資訊很有用。高階 BOB 包含測量接地電位差的電路和脈衝陷阱電路,以查詢訊號毛刺。
商業分解盒有多種型號可供選擇。也可以用一塊電路板上的少量簡單元件組裝一個有用的 BOB。跳線板可以使用 DIL IC 插座製作,如果使用 2 腳雙色 LED(3 腳 LED 不適用),則 LED 的佈線很簡單。每個訊號線應透過一個這樣的 LED 和一個 680 歐姆電阻與 GND(訊號接地)串聯連線。自制分解盒透過一對 RS232 聯結器(可能還包括一個連線協議分析器的聯結器)和一些簡單的金屬或塑膠外殼完成。
另一個對開發和測試序列應用程式和裝置非常有用的巧妙硬體和/或軟體是字元序列生成器。這種生成器會產生重複的序列線路資料序列。例如,這種生成器可能會以無限迴圈的方式重複著名的“The quick brown fox …” 句子。另一個常見的測試序列是迴圈生成從 0x00 到 0xFF 的所有 8 位程式碼。這種迴圈包含所有 7 位 ASCII 和 8 位 ISO Latin 1 字元,以及前 32 個不可列印的控制字元,並且可以例如揭示解碼錯誤或傳輸錯誤。還非常常見的是調變解調器測試序列,使用通用調變解調器命令(序列程式設計: 調變解調器和 AT 命令)建立調變解調器連線,傳送一些資料,然後在迴圈中拆除調變解調器連線。
市售硬體字元生成器提供了許多額外的功能,通常與協議分析儀結合使用。因此,它們相當昂貴。但是,就像 BOB 一樣,也可以用少量資金構建一個實用的 DIY 字元序列生成器。這可以透過普通計算機上的軟體(一些簡單的無限軟體迴圈將相同資料一遍又一遍地傳送到序列介面)或一些廉價的電子元件來實現。在現場和開發中,一些小型獨立硬體比例如帶有軟體的 PC 或筆記型電腦更便於快速測試。
一個簡單的經典硬體字元生成器基本上由一個波特率生成器、一個 UART(序列程式設計:8250 UART 程式設計)、一個 (E)EPROM、一個二進位制計數器和一個線路驅動器(序列程式設計:MAX232 驅動器接收器)組成。通常,這些元件中的每一個都是一個簡單的單片 IC。(E)EPROM 應該包含字元序列。波特率生成器驅動 UART 和二進位制計數器。二進位制計數器驅動 (E)EPROM 的地址線。結果是字元序列在 (E)EPROM 的資料線上產生。這些資料線被饋送到 UART 的輸入。UART 的輸出連線到序列線路驅動器。所有這些都可以輕鬆地安裝在一個小型原型板上,並放在一個簡單的箱子裡。
一個更現代的硬體字元生成器可以圍繞這些小型微控制器之一構建(例如,Atmel AVR)。這特別容易,因為這些微控制器已經包含序列介面,只需要一點點序列程式設計 - 這是這本書的主題。
連線型別
[edit | edit source]如果您想進行一般的 RS-232 連線,您可以取一些長電線,並將它們直接焊接到您正在使用的裝置的電子電路板上,但這往往會造成很大的混亂,而且這些焊點往往會斷裂,還會出現其他問題。為了解決這些問題,並使設定或拆卸裝置更容易,一些標準聯結器已經開發出來,這些聯結器通常存在於大多數使用 RS-232 標準的裝置上。
這些聯結器有兩種形式:公頭和母頭。母頭有孔,允許公頭上的針腳插入聯結器中。
EIA/TIA 574:DE9
[edit | edit source]這是一個 DE9 母頭聯結器(錯誤地稱為“DB-9”)(正確地稱為 DE9F)
DE-9 母頭聯結器通常用作插入典型 PC 的“插頭”。如果您在計算機背面看到其中一個,它很可能不用於序列通訊,而是用於早期 VGA 或 CGA 顯示器(不是 SVGA)或一些特殊的控制/操縱桿裝置。
這是一個公頭“DE-9”聯結器(正確地稱為 DE9M)
這是您在“通用”PC 上用於序列通訊的聯結器中更有可能看到的聯結器。您經常會看到兩個並排放置(用於 COM1 和 COM2)。您可能與之通訊的特殊裝置將具有任一聯結器,甚至可能是下面列出的 DB-25 聯結器之一。
RS-232C:DB-25
[edit | edit source]這是一個 DB-25 母頭聯結器(也稱為 DB25S)
這個 DB25S 是您通常在 IBM 相容 PC 上用作並行(印表機)埠的聯結器。它還在具有 25 針序列埠聯結器的舊 PC 的調變解調器電纜的計算機端。這種聯結器型別也經常用於符合 RS-232 序列資料通訊的裝置,因此,如果您看到其中一個聯結器,不要總是假設它總是並行的。當最初的 RS-232 規範編寫時,這就是預期的聯結器型別,但由於許多針腳很少使用,因此 IBM 相容 PC 序列埠後來切換到 DE-9 DE9S 聯結器,它們攜帶與原始 IBM-PC 中的 DB 聯結器上所有必需的訊號。 (是的,對於這個標準來說,這比較新的裝置)。
這是一個公頭 DB-25P 聯結器(也稱為 DB25P)
公頭 DB-25 聯結器通常用於 PC 印表機電纜一端用於並行資料通訊,這超出了本系列文章的範圍。DB25P 也用於外部調變解調器電纜的調變解調器端。您應該知道,此聯結器也用於許多不同型別裝置上的序列通訊,使用許多不同型別的通訊協議。事實上,如果您有一個隨機的裝置,您試圖弄清楚它的工作原理,您可以假設它是一個序列裝置。破解隨機聯結器也超出了本文件的範圍,但它本身可能是一個有趣的愛好。
迷你立體聲插頭聯結器
[edit | edit source]這是一個公頭迷你立體聲插頭聯結器
一些數碼相機和計算器附帶一根電纜,電纜的一端有一個迷你立體聲插頭聯結器,插在相機上,另一端有一個 DE-9 聯結器,插在 PC 上。
這是一個很差的聯結器,因為它在插拔時會短路部分電路。
“PicAXE”系統使用[1]
- 1: 底座環:接地(DE9 的 5 腳)
- 2: 中間環:從 PicAXE 到 PC 序列輸入的序列輸出(DE9 的 2 腳)
- 3: 針尖:從 PC 到 PicAXE 序列輸入的序列輸出(DE9 的 3 腳)
“LANC”系統通常使用 2.5 毫米立體聲插孔:[2][3] [4] [5] [6] [7][8]
- 底座環:接地
- 中間環:來自攝像頭的 +5 到 +8 VDC
- 針尖:通常透過一個電阻器拉高到 +5 V(空閒;邏輯 1);拉低(起始位和邏輯 0)以傳送命令或狀態。(開路集電極)。通常情況下,遙控器傳送前 2 個位元組的命令。攝像機會用 6 個位元組的狀態進行回覆。
LANC 使用 9600 bit/s 序列。
RS-232D:RJ45 上的 RS232
[edit | edit source]RS-232D 定義了一個比 DE-9 插頭小得多的標準聯結器。[9].
(RJ45 模組化插孔上的 RS-232 也稱為“EIA/TIA - 561”)
RJ11 上的 RS232
[edit | edit source]將 RS-232 的 TX、RX、GND 連線到 RJ11 聯結器的 4 個針腳是否有標準?
- Luhan Monat 使用 DE9-5 ---> RJ11-1;DE9-3 ---> RJ11-2;DE9-2 ---> RJ11-3。(RJ11-2 和 RJ11-3 是“內對”)。
- Paul Campbell 說:“我把 GND 連線到黃線,TXD 連線到黑線,RXD 連線到紅線。”
- Russell McMahon 提到了幾種將 RS-232 連線到 RJ11 聯結器的 4 個針腳或 RJ45 聯結器的 8 個針腳的不同“標準”。
佈線針腳說明
[edit | edit source]RS-232 裝置的佈線首先涉及識別正在使用的實際針腳。
還要注意,在“PC COMx 埠上下文”的末端,一些訊號是“輸入”,而另一些是“輸出”,而在“調變解調器上下文”中,這些相同的訊號名稱現在被稱為“輸出”,而它們之前是“輸入”,反之亦然。這就是多年來造成很多混亂的原因,因為“輸入”或“輸出”的意義性質在大多數關於該主題的圖表中都沒有被注意到,但在現實世界中,兩個“輸出”引腳很少能和諧地工作在 RS-232 相關的 ±[3–10] V 東西中,其中 -3 V 到 +3 V 的範圍不是真正的“高”或“低”,除了可能給驅動器帶來額外的負擔,使其不希望地燒壞之外。
以下是母DE-9 聯結器的編號方式(注意,電腦上的聯結器通常是公聯結器,所以與下圖相比是映象的)
如果數字難以辨認,從右上角開始為 "1",向左一直到行末,然後從下一行的第 6 個引腳開始,一直到左下角的第 9 個引腳。"頂部" 定義為有 5 個引腳的那一行。
以下是 PC COMx 端每個引腳的通常定義
| 9-pin | 25-pin | 引腳定義 | 方向(PC 視角) |
|---|---|---|---|
| 1 | 8 | DCD(資料載波檢測) | 輸入 |
| 2 | 3 | RX(接收資料) | 輸入 |
| 3 | 2 | TX(傳送資料) | 輸出 |
| 4 | 20 | DTR(資料終端就緒) | 輸出 |
| 5 | 7 | GND(訊號地) | - |
| 6 | 6 | DSR(資料設定就緒) | 輸入 |
| 7 | 4 | RTS(請求傳送) | 輸出 |
| 8 | 5 | CTS(允許傳送) | 輸入 |
| 9 | 22 | RI(振鈴指示) | 輸入 |
在討論這些引腳及其含義時,需要注意的是,它們與調變解調器和調變解調器協議密切相關。
在互連任何序列埠時,要注意,無論如何,一般來說,應該始終遵循只有一個<輸出>連線到一個或多個<輸入>。此外,需要注意的是,COMx 端的訊號名稱通常與調變解調器端的<in>-<out> -sense- 相反,即使它們具有相同的助記符名稱。
通常,您在環路中沒有連線調變解調器,但您仍然在理論層面上將裝置視為調變解調器。至少,您以某種方式將<輸出>連線到每個<輸入>,並且沒有兩個<輸出>發生衝突,或者沒有將任何 "浮動" <輸入>連線到任何<輸出>。
以下是關於每個訊號功能的更正式的解釋,從其一般用途的角度來看
DCD(資料載波檢測)
[edit | edit source]這是一個來自通訊裝置 (DCE) 的訊號,指示電話線仍然 "連線" 並從另一端的調變解調器接收載波訊號。據推測,編寫良好的軟體或序列裝置可以從該邏輯狀態檢測到電話何時在另一端 "結束通話"。空聯結器通常將 DCD 連線到每個端的 DTR,因為沒有載波訊號參與。
RX(接收資料)
[edit | edit source]從另一個發射機接收資料的輸入。
TX(傳送資料)
[edit | edit source]RX 的反面,終端裝置 (DTE) 使用接收機預期的相同格式和協議傳送序列資料。有關具體協議的更多資訊,請參見以下內容。就像 RX 一樣,在設計將使用此引腳的裝置時,可以考慮 "終端傳送"。
DTR(資料終端就緒)
[edit | edit source]基本上是來自 DTE 的訊號,表示 "你好!,我準備好了,如果你也準備好了"。這是 DTE 向 DCE 發出的一個通用指示器,表明終端已準備好開始傳送和接收資料。如果通訊裝置需要進行一些初始化,這是終端裝置 "啟動" 接收裝置的一種方式。在空聯結器設定中,該訊號通常連線到 DCD,因此裝置向自身發出訊號,表明已檢測到 (虛構的) 載波,表明傳輸線已啟動。
GND(訊號地)
[edit | edit source]這是一個有趣的引腳。它的作用是在被連線的裝置之間建立一個共同的 "接地" 參考點,以比較其他訊號的電壓。通常這是一件好事,因為有時不同的裝置具有不同的電源,並且相距一定距離。這根電線不好的地方在於,它通常是一根可以傳導不應透過電線的電力的物理銅線,例如短路,更糟糕的是,閃電 (這種情況比您通常認為的這種型別的裝置要頻繁得多)。這可能會損壞 DCE 和 DTE。光纖轉換器和接地隔離器等裝置可以幫助防止這種情況發生,但仍然是需要擔心的事情。在短距離內,這通常不是問題。
DSR(資料設定就緒)
[edit | edit source]這是通訊裝置 (或序列線上的計算機外圍裝置) 對 DTR 的對應訊號。當 DTR 被髮送為訊號時,通訊裝置應將該訊號更改為邏輯 "1",表示它也已準備好通訊。如果 DCE 在 DTR 被髮出訊號時經歷 "啟動" 序列,則在完成之前不應發出 DSR 訊號。但是,許多聯結器將此引腳 "硬連線" 直接連線到每個端的 DTR 引腳,以減少電纜所需的電線數量。這對於使用現有電話線連線裝置非常有用,但會阻止應用程式使用 DTR 和 DSR 進行握手。
RTS(請求傳送)
[edit | edit source]將 RTS 訊號設定為邏輯 "1" 表示 DTE 想要向 DCE 傳送資料。將 RTS 訊號重置為邏輯 "0" 表示 DTE 沒有更多資料要傳送。
CTS(允許傳送)
[edit | edit source]這是 DCE 關於終端裝置是否應該傳輸任何資料的響應訊號。當該訊號處於邏輯 "1" 時,終端 "允許" 傳輸資料。與 DTR/DSR 引腳一樣,此引腳可以直接連線到 RTS 引腳,以減少所需的電線數量,但這會消除硬體流控制的可能性。一些軟體忽略了此引腳和 RTS 引腳,因此也使用其他流控制系統。當我們接觸到實際的軟體時,會對此進行解釋。
RI(振鈴指示)
[edit | edit source]再次回到電話調變解調器,這是一個指示電話 "振鈴" 的訊號。通常,即使在真正的電話調變解調器上,這也只是偶爾設定為 -15 V 用於訊號。基本上,當您通常會在電話上聽到 "振鈴" 時,此引腳就會發出訊號。在空聯結器上,此電線通常甚至沒有連線到任何東西。如果您確實連線到真正的調變解調器,這確實有一些強大的用途,儘管還有其他方法可以讓終端裝置 (如連線到外部調變解調器的 PC) 透過資料引腳告知調變解調器,可以透過資料引腳告知調變解調器。這將在軟體部分略作介紹。
其他 RS-232 引腳
[edit | edit source]DB-25 實現了其他 DE-9 通常不使用的引腳,例如次要傳送和接收引腳、用於這些備用引腳的次要 CTS/RTS、用於電源的 -15 V 訊號、時鐘以及其他一些好主意。實現所有這些引腳的問題在於,您還需要執行單獨的電線,而且一整套 DB-25 聯結器也意味著要有 25 根物理電線連線 DTE 和 DCE 之間的整個距離。如果距離超過一英尺左右,就會變得很麻煩,尤其是要穿過牆壁或在更永久的環境中。如果電線束中的錯誤電線被剪斷,則必須重新穿線整個電線束,或者您必須像老式的電話線維修人員在修理電話配電箱時一樣進行電線測試。通常只使用三根物理銅線連線 DTE 和 DCE,這僅僅是 RX、TX 和 GND。剩下的可以透過聯結器端以對大多數軟體和硬體應用程式足夠的方式輕鬆 "偽造"。
波特率和 BPS(每秒位元數)通常並不相同,儘管它們經常被互換使用,特別是在營銷文獻中。有多種方法可以確定特定裝置的實際資料速率,但在流行的營銷文獻中,甚至在一般參考文字中,它們幾乎總是會提到“波特率”,即使它們指的是每秒位元數。
波特率是指調製訊號中每秒傳輸介質變化的次數。如果每個傳輸事件包含一個以上的資訊位,則波特率和 BPS 就不一樣了。例如,如果每個事件包含兩個位(兩個位在事件中被調製),則這種傳輸的 BPS 將是波特率的兩倍。這並非理論上的案例。典型的“高速”調變解調器在電話線上使用複雜的調製,其中位元率和波特率線上路上存在顯著差異。在構建特定協議的測量裝置、解碼器(解調器)、編碼器(調製器)以及各種傳輸裝置時,瞭解這一點非常重要。
然而,軟體開發人員通常喜歡忽略位元率和波特率之間的差異,因為一個位元可以是真或假 - 一個“事件”(一個位元)始終只有兩種可能的狀態。它們沒有一個可以例如儲存四種不同狀態的基本單元。換句話說,在軟體方面,調製已經被解調器扁平化了。如果使用的調製可以例如在一個事件中傳輸 8 個位元,軟體開發人員會看到它們已經是一系列 8 個連續的位元,每個位元要麼是真要麼是假。解調器已經處理了這一點。當它得到一個事件時,它將單個 8 位事件轉換為八個單個位元事件。軟體開發人員看不到具有 256 個不同狀態(電壓、相位)的原始單個實體。由於調製已被扁平化,因此他們不再體驗波特率和位元率之間的差異。這不是定義波特率或 BPS 的人的錯誤。它只是數字計算機硬體的一個(受歡迎的)限制。
波特率實際上是一個縮寫詞,以紀念埃米爾·鮑多,他是法國早期電傳打字機的發明者,這些電傳打字機使用莫爾斯電碼代替了電報鍵。基本上是兩臺可以彼此連線的打字機,用一些電線連線。他提出了最早的數字字元編碼方案,字元程式碼透過序列資料連線傳輸。請記住,這在很大程度上是在計算機發明之前完成的。事實上,這些早期的電傳打字機裝置中的一些與 ENIAC 或 UNIVAC 等第一臺計算機相連,僅僅因為它們相對便宜,並且在那個時候是批次生產的。
為了實現序列資料通訊,您需要就時鐘訊號或波特率達成一致,以便確保一切都能被正確地傳輸和接收。這就是語言純粹主義者會介入的地方,因為實際上是這個時鐘訊號驅動了“波特率”。讓我們從埃米爾·鮑多的電傳打字機開始,更詳細地解釋波特率。
埃米爾的早期電傳打字機使用 5 個數據位和 1 個停止位來傳輸一個字元。我們稍後會討論格式問題,但重要的是,有六個訊號透過電線以某種方式傳送,以指示正在傳輸一個字元。通常,裝置被設計為以 50 波特執行,換句話說,裝置每秒傳輸或接收一個“位元”的資料。並非巧合的是,法國電力系統也執行在 50 赫茲的交流電系統上,因此這很容易用於確定何時應該傳輸新字元。
電傳打字機不斷發展,最終西聯匯款公司在世界各地傳送電傳“電報”。如果您聽說過 TELEX 號碼,這就是這個系統的遺留物,即使在網際網路時代,它仍在使用中。快速略過大量有趣的歷史,您最終會發現美國司法部 (DOJ) 與 AT&T 發生訴訟。請注意,這發生在 1982 年著名的/臭名昭著的和解之前的一次反壟斷訴訟中。之所以重要,是因為 DOJ 堅持認為西聯匯款公司獲得了所有數字業務(電報…不幸的是,這也意味著計算機裝置),而 AT&T 獲得了調製頻率,換句話說,您可以在他們的裝置上和母親在母親節通話。當計算機在 1950 年代製造出來時,人們希望有一種方法可以將不同的計算機裝置連線在一起,以便它們能夠相互“交談”。這最終導致了我們在此頁面上討論的 RS-232 標準。
雖然西聯匯款公司被允許承載數字流量,但連線通常不在計算機中心或附近。在這個時候,AT&T 在反壟斷和解中發現了一個漏洞,可以幫助他們進入成為計算機資料“運營商”的業務。他們還提供以比西聯匯款公司收費低得多的價格傳輸計算機資料。因此,調變解調器誕生了。
調變解調器的長描述是“調變解調器”,這個描述很重要。由於 AT&T 只能承載“音調”,例如來自無線電網路的音樂或您母親的聲音,因此他們建立了一種裝置,可以電子地建立可以在他們的網路上承載的“音樂”或“音調”。然後,他們會取一個計算機“1”或“0”,並將該位元“調製”到一個頻率,例如 2600 赫茲。(確切的音調根據波特率和其他因素而有所不同,但這裡有確切的頻率規格。)匹配的裝置能夠在“音樂”中尋找那個“音符”或“音調”,並能夠將其轉換回計算機“1”或“0”,換句話說,解調音樂。由於您和您在電話兩端的夥伴只是彼此演奏音樂,因此 AT&T 在其網路上擁有這種音樂是合法的。只有計算機可能理解這種音樂是無關緊要的,而且 DOJ 對整個做法視而不見,儘管西聯匯款公司提出了異議。
您可以租用的原始調變解調器是 AT&T Bell 103 調變解調器。這些是笨重的盒子,大小約為鞋盒,外面有一堆開關,以及連線到您使用的計算機裝置的 RS-232 電纜。這些盒子是為老式的手柄電話設計的,有一塊橡膠可以圍繞電話的“揚聲器”和“麥克風”部分(當時電話裝置沒有直接的銅連線)。如果您想撥打電話,您必須使用電話本身的旋轉撥號盤…計算機無法訪問那種裝置。請記住,FCC 幾乎監管著與電話裝置發生的一切事情,而 AT&T 擁有與電話相關的一切。您甚至必須從 AT&T “租用”調變解調器,而且租賃費用包含在您每月的電話賬單中。
Bell 103 最初是 110 波特,儘管它最終有一個開關可以“升級”到 220 波特。在整個 1960 年代和 1970 年代,300 波特調變解調器也很常見。請記住,AT&T(或您當地的電話公司)是您唯一可以租用調變解調器的公司,無論您是否需要它。到 1982 年,調變解調器已廣泛使用,POTS 電話網路也已普及,這種透過電話傳送“音樂”的相同系統得以保留,即使這樣做的法律理由不再有效。隨著 ISDN 和 DSL 線路的出現,情況不再是這樣,電話公司現在傳送的是純數字訊號。這也是為什麼 DSL 線路可以承載比普通電話線更多資料的原因,即使是相同的銅線對進入您的家中。
當調變解調器開始達到非常高的速度時,它們遇到了某種磚牆。在 1950 年代,人們決定電話裝置只需要承載大約 10 千赫茲的音調訊號。對於正常的語音通話來說,這已經足夠了,您甚至可以分辨出電話上是男聲還是女聲。問題在於,這意味著您可以透過家庭電話網路傳送的最高正常“波特率”約為 9600 波特,通常約為 4800 波特,因為電話裝置本身會在您從一個音調切換到另一個音調時丟棄“位元”。無需進行繁重的數學運算,您至少需要一個完整的“聲波”才能能夠區分不同的音調或音符。然而,調變解調器製造商確實想到了可以克服這種限制的另一種方法。與其只發送一個音調,不如同時演奏一個完整的“和絃”,或多個不同的音調。最後回到波特率與每秒位元數。以更高的速度,您不是簡單地只發送一個位元,而是同時傳送兩個或多達十六個位元,並使用不同的“音樂”“和絃”。這就是您獲得 56K BPS 調變解調器的方式,即使它仍然只以 9600 波特傳輸。
更多關於調變解調器的資訊,請訪問 序列程式設計:調變解調器和 AT 命令。
RS-232 標準中使用了四組傳輸位。這些位在 RS-232 資料流中的位置是區分一個位與另一個位的全部依據。這也是序列通訊真正接觸到“金屬”的地方,因為每個位都以序列或序列的方式相繼出現。所有其他電線、引腳、波特率以及所有其他內容都是為了確保這些位可以被理解。請記住,在這一點上,整個協議都基於單個字元的傳輸。可以傳送多個字元,但它們是單個字元傳輸事件的序列。字元之間的關係基於軟體對下一層協議“層”上的資料所做的事情。
當傳輸線沒有傳送任何東西時,它保持在邏輯狀態“1”,或電線上為 -15 V。當您要傳送一個字元時,您首先將電壓更改為 +15 V,表示邏輯“0”狀態。每個後續位都基於為每個裝置之間的通訊建立的波特率。此位表示接收裝置應該開始掃描後續位以形成字元。
序列通訊的主要目的,也是資料實際傳送的地方。這裡的位數變化很大,儘管在目前的實踐中,通常傳輸的位數為八位。最初是五位,這足以讓早期的電傳打字機真正使用字母表中的字母和一些特殊字元。這也對網際網路協議有影響,因為早期的電子郵件系統在透過某些 RS-232 連結連線時只用七位進行傳輸。這是因為早期的字元編碼方案(主要是 ASCII)只用七位來編碼英語常用的所有字元。由於計算機元件最適合 2 的冪(2、4、8、16、32 等),因此八位變得越來越普遍用於單個字元的資料儲存。Unicode 和其他編碼方案已經將此概念推廣到英語以外的語言,但八位仍然是傳輸資料的非常常見的單位,也是當今 RS-232 裝置最常見的設定。
在這個形成字元的位元序列中,最低有效位 (LSB) 首先被傳輸。
為了幫助對傳輸的字元進行有限的錯誤檢查,引入了奇偶校驗位。奇偶校驗可以檢測到一些傳輸錯誤,但不能糾正。奇偶校驗位的取值取決於資料位串中設定為“1”的位數。
有四種不同的奇偶校驗配置需要考慮
當位數的總和最終得到奇數(例如,序列 01110101),則此位將設定為“0”的邏輯狀態。
這使用的是試圖確定有多少個位設定為“1”的公式。在這方面,它與奇校驗的邏輯狀態完全相反。例如,對於具有七位的幀,如果幀中“1”的數量為奇數,則奇偶校驗位將設定為 1。因此,本質上,整個位元組(包括奇偶校驗位)必須具有偶數個“1”才能進行偶校驗。
使用這個概念,傳輸協議實際上完全忽略了奇偶校驗位。相反,傳輸配置在應該傳送奇偶校驗位的位置傳送邏輯“1”,而不考慮該序列是否應該具有奇數或偶數個計數。這種配置模式對於可能希望測試接收裝置中奇偶校驗檢查軟體或韌體的裝置很有用。
與標記奇偶校驗相反,這會為奇偶校驗校驗和傳送邏輯“0”。同樣,對於裝置診斷非常有用。
這實際上不是一個奇偶校驗公式,而是一種確認,即奇偶校驗實際上不起作用,因此裝置甚至不會檢查奇偶校驗。這意味著奇偶校驗位甚至沒有被使用。這可能會在某些情況下導致總資料吞吐量略微增加。更多內容將在下面介紹。
這實際上並不是一個位,而是一種協議,即一旦字元傳送完畢,傳送裝置將返回到邏輯“1”狀態。RS-232 規範要求此邏輯“1”狀態至少保持一個完整的時鐘週期,表明字元傳輸已完成。有時協議會指定兩個停止位。這樣做一個原因是,裝置使用的時鐘頻率可能存在細微的計時差異,在傳輸數百或數千個字元的過程中,兩個不同裝置上的兩個時鐘之間的差異會導致預期位略微偏移,從而導致錯誤。透過使用兩個停止位,傳輸速度會稍慢,但兩個裝置之間的時鐘訊號可以更好地協調。期望一個停止位的裝置可以接受由傳送兩個停止位的裝置傳送的資料。但是,反過來卻行不通。如果您在嘗試讓兩個裝置以給定的波特率進行通訊時遇到問題,請嘗試將第二個停止位新增到發射器。這將是一個不錯的選擇。
我們討論了波特率與每秒位元數。即使名義上的每秒位元數與波特率相同,但波特率仍作為傳輸的位元數的指標是錯誤的。透過新增起始位、停止位和奇偶校驗位,這將為傳輸協議增加開銷。所有數字傳輸協議都有一定的開銷,因此這並不令人驚訝。隨著我們更多地瞭解資料包和其他問題,實際傳輸的資料量將進一步下降。
請記住,如果您使用 6 位資料、2 個停止位和偶校驗進行傳輸,那麼您只傳輸了 6 位資料和 4 位額外的資訊。這意味著即使以 9600 波特率傳輸,您也只傳輸每秒 5760 位資料。這確實是巨大的差異,而且這僅僅是資料透過實際序列通訊通道後的原始位。更典型的 8 位資料、1 個停止位、無奇偶校驗在 9600 波特率下會稍微好一些,因為有 8 位資料,只有 2 位用於開銷。這使得總吞吐量達到每秒 7680 位。稍微好一些,但您不能簡單地假設波特率表示將傳輸多少資料。
序列資料通訊透過一段電線進行的距離存在物理限制。當您在電線上施加電壓時,該電壓需要時間才能穿過電線,而且當您在電線上傳送“脈衝”並過快地改變電壓時,還會發生其他不穩定情況。隨著電線長度增加和頻率(即波特率)增加,這個問題會更加嚴重。此距離會根據許多因素而變化,包括所涉及電線的厚度、電線上的射頻干擾、製造過程中電線的質量、安裝情況……例如,電線中是否存在任何“扭結”迫使它形成一個急彎,以及您傳輸資料的波特率。
此表格假設電纜相當直且均勻,這是大多數低壓應用的典型情況(即,不是使用 110 V 來執行您的冰箱、烤麵包機和電視的電源電路)。通常,像 CAT-5 電纜(也用於區域網或電話線)這樣的東西應該足以滿足此目的。
| 波特率 | 最大距離(以英尺為單位) | 最大距離(以米為單位) |
|---|---|---|
| 2400 | 3000 | 914.4 |
| 4800 | 1000 | 304.8 |
| 9600 | 500 | 152.4 |
| 19200 | 50 | 15.24 |
距離限制可以得到緩解。有“短距離調變解調器”可以將此距離擴充套件到幾英里的電纜。還有電話線、傳統調變解調器和其他長距離通訊技術。還有其他方法來處理這種情況下的資料,這些訊號可以轉換為典型家用計算機可以解釋的簡單 RS-232 資料格式。距離仍然可能是通訊的一個限制因素,但當談論像卡西尼任務中的土星這樣的距離時,序列資料通訊涉及的問題不僅僅是由於電纜長度導致的資料丟失。而且,美國宇航局/歐洲航天局正在使用序列資料通訊將這些令人驚歎的影像傳回地球。
- RS-232 佈線標準說明
- RS-232 連線型別說明
- 維基百科關於 RS-232 的文章
- HW-Server 對 RS-232 標準的說明
- 序列引腳圖(D25 和 D9 聯結器) (還包含有關 PC 中使用的 UART 的更多技術資訊)
- RS232 連線和連線序列裝置的佈線 包含多個圖表,包括一個圖表,顯示如何讓一臺 PC 監控兩臺其他 RS232 裝置之間的序列通訊。
- Lammert Bies,RS232 規格和標準 包含有關 RS-232 訊號的技術規格以及有關奇偶校驗檢查的更詳細資訊。
- Tronisoft 可列印的 ASCII 序列埠備忘單
- jSSC 庫(Java 簡單序列聯結器)。在 Win32 和 Win64 下工作
序列程式設計: 簡介和OSI網路模型 -- RS-232佈線和連線 -- 典型的RS232硬體配置 -- 8250 UART -- DOS -- MAX232驅動器/接收器系列 -- Windows中的TAPI通訊 -- Linux和Unix -- Java -- Hayes相容調變解調器和AT命令 -- 通用序列匯流排(USB) -- 形成資料包 -- 錯誤糾正方法 -- 雙向通訊 -- 資料包恢復方法 -- 序列資料網路 -- 實際應用開發 -- 序列連線上的IP